@tuki-io/tuki-widgets 0.0.213 → 0.0.214
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/esm2020/user-creation/src/utils/device-default-prefix.mjs +19 -2
- package/esm2020/user-creation/src/utils/device-name-dynamic-tokens.mjs +18 -0
- package/esm2020/user-creation/src/utils/parse-device-name-rule.mjs +6 -3
- package/esm2020/user-creation/src/widgets/user-creation-wizard/components/user-details-step/user-details-step.component.mjs +65 -12
- package/esm2020/user-creation/src/widgets/user-creation-wizard/user-creation-wizard.service.mjs +47 -11
- package/fesm2015/tuki-io-tuki-widgets-user-creation.mjs +151 -26
- package/fesm2015/tuki-io-tuki-widgets-user-creation.mjs.map +1 -1
- package/fesm2020/tuki-io-tuki-widgets-user-creation.mjs +149 -24
- package/fesm2020/tuki-io-tuki-widgets-user-creation.mjs.map +1 -1
- package/package.json +1 -1
- package/user-creation/src/utils/device-default-prefix.d.ts +7 -2
- package/user-creation/src/utils/device-name-dynamic-tokens.d.ts +5 -0
- package/user-creation/src/utils/parse-device-name-rule.d.ts +1 -0
- package/user-creation/src/widgets/user-creation-wizard/components/user-details-step/user-details-step.component.d.ts +3 -0
- package/user-creation/src/widgets/user-creation-wizard/user-creation-wizard.service.d.ts +2 -0
|
@@ -1,13 +1,30 @@
|
|
|
1
1
|
/** Matches device types like `Cisco 8851`. */
|
|
2
2
|
export const CISCO_DIGIT_DEVICE_TYPE_PATTERN = /^Cisco\s+\d+$/i;
|
|
3
3
|
export const DEFAULT_SEP_DEVICE_PREFIX = 'SEP';
|
|
4
|
-
|
|
4
|
+
/**
|
|
5
|
+
* Extracts a literal prefix from `deviceNameExplained` patterns such as
|
|
6
|
+
* `SEP[mac]`, `TCT[0-9A-Z._-]{1,12}`, or `[A-Z0-9]{1,15}` (no prefix).
|
|
7
|
+
*/
|
|
8
|
+
export function extractDevicePrefixFromNameExplained(deviceNameExplained) {
|
|
9
|
+
const explained = deviceNameExplained?.trim() ?? '';
|
|
10
|
+
if (!explained) {
|
|
11
|
+
return null;
|
|
12
|
+
}
|
|
13
|
+
const match = explained.match(/^([A-Za-z]+)\[/);
|
|
14
|
+
return match?.[1] ?? null;
|
|
15
|
+
}
|
|
16
|
+
export function applyDefaultDevicePrefixIfMissing(device, defaults) {
|
|
5
17
|
if (device.prefix?.trim()) {
|
|
6
18
|
return;
|
|
7
19
|
}
|
|
20
|
+
const prefixFromDefaults = extractDevicePrefixFromNameExplained(defaults.deviceNameExplained);
|
|
21
|
+
if (prefixFromDefaults) {
|
|
22
|
+
device.prefix = prefixFromDefaults;
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
8
25
|
const deviceType = device.deviceType?.trim() ?? '';
|
|
9
26
|
if (CISCO_DIGIT_DEVICE_TYPE_PATTERN.test(deviceType)) {
|
|
10
27
|
device.prefix = DEFAULT_SEP_DEVICE_PREFIX;
|
|
11
28
|
}
|
|
12
29
|
}
|
|
13
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
30
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV2aWNlLWRlZmF1bHQtcHJlZml4LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdHVraS93aWRnZXRzL3VzZXItY3JlYXRpb24vc3JjL3V0aWxzL2RldmljZS1kZWZhdWx0LXByZWZpeC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSw4Q0FBOEM7QUFDOUMsTUFBTSxDQUFDLE1BQU0sK0JBQStCLEdBQUcsZ0JBQWdCLENBQUM7QUFFaEUsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQUcsS0FBSyxDQUFDO0FBRS9DOzs7R0FHRztBQUNILE1BQU0sVUFBVSxvQ0FBb0MsQ0FBQyxtQkFBOEM7SUFDL0YsTUFBTSxTQUFTLEdBQUcsbUJBQW1CLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDO0lBQ3BELElBQUksQ0FBQyxTQUFTLEVBQUU7UUFDWixPQUFPLElBQUksQ0FBQztLQUNmO0lBRUQsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ2hELE9BQU8sS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDO0FBQzlCLENBQUM7QUFFRCxNQUFNLFVBQVUsaUNBQWlDLENBQUMsTUFBc0QsRUFBRSxRQUFpQztJQUN2SSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLEVBQUU7UUFDdkIsT0FBTztLQUNWO0lBRUQsTUFBTSxrQkFBa0IsR0FBRyxvQ0FBb0MsQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUM5RixJQUFJLGtCQUFrQixFQUFFO1FBQ3BCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsa0JBQWtCLENBQUM7UUFDbkMsT0FBTztLQUNWO0lBRUQsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDbkQsSUFBSSwrQkFBK0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUU7UUFDbEQsTUFBTSxDQUFDLE1BQU0sR0FBRyx5QkFBeUIsQ0FBQztLQUM3QztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEZXZpY2VEZWZhdWx0c0ludGVyZmFjZSwgRGV2aWNlSW50ZXJmYWNlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy91c2VyLWNyZWF0aW9uLXdpemFyZC5pbnRlcmZhY2VzJztcclxuXHJcbi8qKiBNYXRjaGVzIGRldmljZSB0eXBlcyBsaWtlIGBDaXNjbyA4ODUxYC4gKi9cclxuZXhwb3J0IGNvbnN0IENJU0NPX0RJR0lUX0RFVklDRV9UWVBFX1BBVFRFUk4gPSAvXkNpc2NvXFxzK1xcZCskL2k7XHJcblxyXG5leHBvcnQgY29uc3QgREVGQVVMVF9TRVBfREVWSUNFX1BSRUZJWCA9ICdTRVAnO1xyXG5cclxuLyoqXHJcbiAqIEV4dHJhY3RzIGEgbGl0ZXJhbCBwcmVmaXggZnJvbSBgZGV2aWNlTmFtZUV4cGxhaW5lZGAgcGF0dGVybnMgc3VjaCBhc1xyXG4gKiBgU0VQW21hY11gLCBgVENUWzAtOUEtWi5fLV17MSwxMn1gLCBvciBgW0EtWjAtOV17MSwxNX1gIChubyBwcmVmaXgpLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3REZXZpY2VQcmVmaXhGcm9tTmFtZUV4cGxhaW5lZChkZXZpY2VOYW1lRXhwbGFpbmVkOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgICBjb25zdCBleHBsYWluZWQgPSBkZXZpY2VOYW1lRXhwbGFpbmVkPy50cmltKCkgPz8gJyc7XHJcbiAgICBpZiAoIWV4cGxhaW5lZCkge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IG1hdGNoID0gZXhwbGFpbmVkLm1hdGNoKC9eKFtBLVphLXpdKylcXFsvKTtcclxuICAgIHJldHVybiBtYXRjaD8uWzFdID8/IG51bGw7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhcHBseURlZmF1bHREZXZpY2VQcmVmaXhJZk1pc3NpbmcoZGV2aWNlOiBQaWNrPERldmljZUludGVyZmFjZSwgJ3ByZWZpeCcgfCAnZGV2aWNlVHlwZSc+LCBkZWZhdWx0czogRGV2aWNlRGVmYXVsdHNJbnRlcmZhY2UpOiB2b2lkIHtcclxuICAgIGlmIChkZXZpY2UucHJlZml4Py50cmltKCkpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcHJlZml4RnJvbURlZmF1bHRzID0gZXh0cmFjdERldmljZVByZWZpeEZyb21OYW1lRXhwbGFpbmVkKGRlZmF1bHRzLmRldmljZU5hbWVFeHBsYWluZWQpO1xyXG4gICAgaWYgKHByZWZpeEZyb21EZWZhdWx0cykge1xyXG4gICAgICAgIGRldmljZS5wcmVmaXggPSBwcmVmaXhGcm9tRGVmYXVsdHM7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGRldmljZVR5cGUgPSBkZXZpY2UuZGV2aWNlVHlwZT8udHJpbSgpID8/ICcnO1xyXG4gICAgaWYgKENJU0NPX0RJR0lUX0RFVklDRV9UWVBFX1BBVFRFUk4udGVzdChkZXZpY2VUeXBlKSkge1xyXG4gICAgICAgIGRldmljZS5wcmVmaXggPSBERUZBVUxUX1NFUF9ERVZJQ0VfUFJFRklYO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export function deviceNameHasDynamicTokens(name) {
|
|
2
|
+
return /\[DN\]|\[LN\]|\[FN\]/i.test(name ?? '');
|
|
3
|
+
}
|
|
4
|
+
/** Device name field stays readonly while the template in `newName` contains placeholders. */
|
|
5
|
+
export function isDeviceNameReadonlyFromTemplate(newName) {
|
|
6
|
+
return deviceNameHasDynamicTokens(newName);
|
|
7
|
+
}
|
|
8
|
+
/** Form field value without a separate `matPrefix` when `prefix` is already part of the resolved name. */
|
|
9
|
+
export function stripDeviceNamePrefix(resolvedName, prefix) {
|
|
10
|
+
const trimmedPrefix = prefix?.trim();
|
|
11
|
+
if (!trimmedPrefix) {
|
|
12
|
+
return resolvedName;
|
|
13
|
+
}
|
|
14
|
+
return resolvedName.toUpperCase().startsWith(trimmedPrefix.toUpperCase())
|
|
15
|
+
? resolvedName.substring(trimmedPrefix.length)
|
|
16
|
+
: resolvedName;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV2aWNlLW5hbWUtZHluYW1pYy10b2tlbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90dWtpL3dpZGdldHMvdXNlci1jcmVhdGlvbi9zcmMvdXRpbHMvZGV2aWNlLW5hbWUtZHluYW1pYy10b2tlbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxVQUFVLDBCQUEwQixDQUFDLElBQStCO0lBQ3RFLE9BQU8sdUJBQXVCLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQztBQUNwRCxDQUFDO0FBRUQsOEZBQThGO0FBQzlGLE1BQU0sVUFBVSxnQ0FBZ0MsQ0FBQyxPQUFrQztJQUMvRSxPQUFPLDBCQUEwQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQy9DLENBQUM7QUFFRCwwR0FBMEc7QUFDMUcsTUFBTSxVQUFVLHFCQUFxQixDQUFDLFlBQW9CLEVBQUUsTUFBc0I7SUFDOUUsTUFBTSxhQUFhLEdBQUcsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDO0lBQ3JDLElBQUksQ0FBQyxhQUFhLEVBQUU7UUFDaEIsT0FBTyxZQUFZLENBQUM7S0FDdkI7SUFDRCxPQUFPLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3JFLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUM7UUFDOUMsQ0FBQyxDQUFDLFlBQVksQ0FBQztBQUN2QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGZ1bmN0aW9uIGRldmljZU5hbWVIYXNEeW5hbWljVG9rZW5zKG5hbWU6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAvXFxbRE5cXF18XFxbTE5cXF18XFxbRk5cXF0vaS50ZXN0KG5hbWUgPz8gJycpO1xyXG59XHJcblxyXG4vKiogRGV2aWNlIG5hbWUgZmllbGQgc3RheXMgcmVhZG9ubHkgd2hpbGUgdGhlIHRlbXBsYXRlIGluIGBuZXdOYW1lYCBjb250YWlucyBwbGFjZWhvbGRlcnMuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBpc0RldmljZU5hbWVSZWFkb25seUZyb21UZW1wbGF0ZShuZXdOYW1lOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gZGV2aWNlTmFtZUhhc0R5bmFtaWNUb2tlbnMobmV3TmFtZSk7XHJcbn1cclxuXHJcbi8qKiBGb3JtIGZpZWxkIHZhbHVlIHdpdGhvdXQgYSBzZXBhcmF0ZSBgbWF0UHJlZml4YCB3aGVuIGBwcmVmaXhgIGlzIGFscmVhZHkgcGFydCBvZiB0aGUgcmVzb2x2ZWQgbmFtZS4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHN0cmlwRGV2aWNlTmFtZVByZWZpeChyZXNvbHZlZE5hbWU6IHN0cmluZywgcHJlZml4Pzogc3RyaW5nIHwgbnVsbCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCB0cmltbWVkUHJlZml4ID0gcHJlZml4Py50cmltKCk7XHJcbiAgICBpZiAoIXRyaW1tZWRQcmVmaXgpIHtcclxuICAgICAgICByZXR1cm4gcmVzb2x2ZWROYW1lO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc29sdmVkTmFtZS50b1VwcGVyQ2FzZSgpLnN0YXJ0c1dpdGgodHJpbW1lZFByZWZpeC50b1VwcGVyQ2FzZSgpKVxyXG4gICAgICAgID8gcmVzb2x2ZWROYW1lLnN1YnN0cmluZyh0cmltbWVkUHJlZml4Lmxlbmd0aClcclxuICAgICAgICA6IHJlc29sdmVkTmFtZTtcclxufVxyXG4iXX0=
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
* to validate the name field value (without matPrefix).
|
|
4
4
|
*
|
|
5
5
|
* - `([sS][eE][pP]|BAT)[0-9a-fA-F]{12}` → `[0-9a-fA-F]{12}`
|
|
6
|
+
* - `TCT[0-9A-Z._-]{1,12}` → `[0-9A-Z._-]{1,12}`
|
|
6
7
|
* - `[a-zA-Z0-9]{1,15}` → `[a-zA-Z0-9]{1,15}` (unchanged)
|
|
7
8
|
*/
|
|
8
9
|
export function parseDeviceNameRegexBody(deviceNameRegex) {
|
|
@@ -12,15 +13,17 @@ export function parseDeviceNameRegexBody(deviceNameRegex) {
|
|
|
12
13
|
}
|
|
13
14
|
return stripLeadingPrefixGroup(fullRegex);
|
|
14
15
|
}
|
|
16
|
+
/** Character class with an optional trailing quantifier, e.g. `[0-9a-fA-F]{12}`. */
|
|
17
|
+
const CHAR_CLASS_WITH_QUANTIFIER = String.raw `\[[^\]]+\](?:\{[^}]+\})?`;
|
|
15
18
|
function stripLeadingPrefixGroup(regex) {
|
|
16
|
-
const parenMatch = regex.match(
|
|
19
|
+
const parenMatch = regex.match(new RegExp(`^(\\([^)]+\\))(${CHAR_CLASS_WITH_QUANTIFIER})$`));
|
|
17
20
|
if (parenMatch?.[2]?.trim()) {
|
|
18
21
|
return parenMatch[2];
|
|
19
22
|
}
|
|
20
|
-
const literalMatch = regex.match(
|
|
23
|
+
const literalMatch = regex.match(new RegExp(`^([A-Za-z]+)(${CHAR_CLASS_WITH_QUANTIFIER})$`));
|
|
21
24
|
if (literalMatch?.[2]?.trim()) {
|
|
22
25
|
return literalMatch[2];
|
|
23
26
|
}
|
|
24
27
|
return regex;
|
|
25
28
|
}
|
|
26
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
29
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2UtZGV2aWNlLW5hbWUtcnVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3R1a2kvd2lkZ2V0cy91c2VyLWNyZWF0aW9uL3NyYy91dGlscy9wYXJzZS1kZXZpY2UtbmFtZS1ydWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsd0JBQXdCLENBQUMsZUFBMEM7SUFDL0UsTUFBTSxTQUFTLEdBQUcsZUFBZSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUNoRCxJQUFJLENBQUMsU0FBUyxFQUFFO1FBQ1osT0FBTyxFQUFFLENBQUM7S0FDYjtJQUVELE9BQU8sdUJBQXVCLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDOUMsQ0FBQztBQUVELG9GQUFvRjtBQUNwRixNQUFNLDBCQUEwQixHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUEsMEJBQTBCLENBQUM7QUFFeEUsU0FBUyx1QkFBdUIsQ0FBQyxLQUFhO0lBQzFDLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsa0JBQWtCLDBCQUEwQixJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzdGLElBQUksVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUU7UUFDekIsT0FBTyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDeEI7SUFFRCxNQUFNLFlBQVksR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLGdCQUFnQiwwQkFBMEIsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUM3RixJQUFJLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFO1FBQzNCLE9BQU8sWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQzFCO0lBRUQsT0FBTyxLQUFLLENBQUM7QUFDakIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBTdHJpcHMgYSBsZWFkaW5nIGRldmljZS1wcmVmaXggZ3JvdXAgZnJvbSBgZGV2aWNlTmFtZVJlZ2V4YCwgcmV0dXJuaW5nIHRoZSBwYXR0ZXJuXHJcbiAqIHRvIHZhbGlkYXRlIHRoZSBuYW1lIGZpZWxkIHZhbHVlICh3aXRob3V0IG1hdFByZWZpeCkuXHJcbiAqXHJcbiAqIC0gYChbc1NdW2VFXVtwUF18QkFUKVswLTlhLWZBLUZdezEyfWAg4oaSIGBbMC05YS1mQS1GXXsxMn1gXHJcbiAqIC0gYFRDVFswLTlBLVouXy1dezEsMTJ9YCDihpIgYFswLTlBLVouXy1dezEsMTJ9YFxyXG4gKiAtIGBbYS16QS1aMC05XXsxLDE1fWAg4oaSIGBbYS16QS1aMC05XXsxLDE1fWAgKHVuY2hhbmdlZClcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZURldmljZU5hbWVSZWdleEJvZHkoZGV2aWNlTmFtZVJlZ2V4OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGZ1bGxSZWdleCA9IGRldmljZU5hbWVSZWdleD8udHJpbSgpID8/ICcnO1xyXG4gICAgaWYgKCFmdWxsUmVnZXgpIHtcclxuICAgICAgICByZXR1cm4gJyc7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHN0cmlwTGVhZGluZ1ByZWZpeEdyb3VwKGZ1bGxSZWdleCk7XHJcbn1cclxuXHJcbi8qKiBDaGFyYWN0ZXIgY2xhc3Mgd2l0aCBhbiBvcHRpb25hbCB0cmFpbGluZyBxdWFudGlmaWVyLCBlLmcuIGBbMC05YS1mQS1GXXsxMn1gLiAqL1xyXG5jb25zdCBDSEFSX0NMQVNTX1dJVEhfUVVBTlRJRklFUiA9IFN0cmluZy5yYXdgXFxbW15cXF1dK1xcXSg/Olxce1tefV0rXFx9KT9gO1xyXG5cclxuZnVuY3Rpb24gc3RyaXBMZWFkaW5nUHJlZml4R3JvdXAocmVnZXg6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBwYXJlbk1hdGNoID0gcmVnZXgubWF0Y2gobmV3IFJlZ0V4cChgXihcXFxcKFteKV0rXFxcXCkpKCR7Q0hBUl9DTEFTU19XSVRIX1FVQU5USUZJRVJ9KSRgKSk7XHJcbiAgICBpZiAocGFyZW5NYXRjaD8uWzJdPy50cmltKCkpIHtcclxuICAgICAgICByZXR1cm4gcGFyZW5NYXRjaFsyXTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBsaXRlcmFsTWF0Y2ggPSByZWdleC5tYXRjaChuZXcgUmVnRXhwKGBeKFtBLVphLXpdKykoJHtDSEFSX0NMQVNTX1dJVEhfUVVBTlRJRklFUn0pJGApKTtcclxuICAgIGlmIChsaXRlcmFsTWF0Y2g/LlsyXT8udHJpbSgpKSB7XHJcbiAgICAgICAgcmV0dXJuIGxpdGVyYWxNYXRjaFsyXTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmVnZXg7XHJcbn1cclxuIl19
|