@blueprintjs/core
Version:
Core styles & components
266 lines (264 loc) • 25.1 kB
JavaScript
/*
* Copyright 2016 Palantir Technologies, Inc. All rights reserved.
* Licensed under the BSD-3 License as modified (the “License”); you may obtain a copy
* of the license at https://github.com/palantir/blueprint/blob/master/LICENSE
* and https://github.com/palantir/blueprint/blob/master/PATENTS
*/
;
exports.KeyCodes = {
8: "backspace",
9: "tab",
13: "enter",
20: "capslock",
27: "esc",
32: "space",
33: "pageup",
34: "pagedown",
35: "end",
36: "home",
37: "left",
38: "up",
39: "right",
40: "down",
45: "ins",
46: "del",
// number keys
48: "0",
49: "1",
50: "2",
51: "3",
52: "4",
53: "5",
54: "6",
55: "7",
56: "8",
57: "9",
// alphabet
65: "a",
66: "b",
67: "c",
68: "d",
69: "e",
70: "f",
71: "g",
72: "h",
73: "i",
74: "j",
75: "k",
76: "l",
77: "m",
78: "n",
79: "o",
80: "p",
81: "q",
82: "r",
83: "s",
84: "t",
85: "u",
86: "v",
87: "w",
88: "x",
89: "y",
90: "z",
// punctuation
106: "*",
107: "+",
109: "-",
110: ".",
111: "/",
186: ";",
187: "=",
188: ",",
189: "-",
190: ".",
191: "/",
192: "`",
219: "[",
220: "\\",
221: "]",
222: "\'",
};
exports.Modifiers = {
16: "shift",
17: "ctrl",
18: "alt",
91: "meta",
93: "meta",
224: "meta",
};
exports.ModifierBitMasks = {
alt: 1,
ctrl: 2,
meta: 4,
shift: 8,
};
exports.Aliases = {
cmd: "meta",
command: "meta",
escape: "esc",
minus: "-",
mod: /Mac|iPod|iPhone|iPad/.test(navigator.platform) ? "meta" : "ctrl",
option: "alt",
plus: "+",
return: "enter",
win: "meta",
};
// alph sorting is unintuitive here
// tslint:disable object-literal-sort-keys
exports.ShiftKeys = {
"~": "`",
"!": "1",
"@": "2",
"#": "3",
"$": "4",
"%": "5",
"^": "6",
"&": "7",
"*": "8",
"(": "9",
")": "0",
"_": "-",
"+": "=",
"{": "[",
"}": "]",
"|": "\\",
":": ";",
"\"": "\'",
"<": ",",
">": ".",
"?": "/",
};
// tslint:enable object-literal-sort-keys
/* tslint:enable:object-literal-key-quotes */
// Function keys
for (var i = 1; i <= 12; ++i) {
exports.KeyCodes[111 + i] = "f" + i;
}
// Numpad
for (var i = 0; i <= 9; ++i) {
exports.KeyCodes[96 + i] = "num" + i.toString();
}
function comboMatches(a, b) {
return a.modifiers === b.modifiers && a.key === b.key;
}
exports.comboMatches = comboMatches;
/**
* Converts a key combo string into a key combo object. Key combos include
* zero or more modifier keys, such as `shift` or `alt`, and exactly one
* action key, such as `A`, `enter`, or `left`.
*
* For action keys that require a shift, e.g. `@` or `|`, we inlude the
* necessary `shift` modifier and automatically convert the action key to the
* unshifted version. For example, `@` is equivalent to `shift+2`.
*/
exports.parseKeyCombo = function (combo) {
var pieces = combo.replace(/\s/g, "").toLowerCase().split("+");
var modifiers = 0;
var key = null;
for (var _i = 0, pieces_1 = pieces; _i < pieces_1.length; _i++) {
var piece = pieces_1[_i];
if (piece === "") {
throw new Error("Failed to parse key combo \"" + combo + "\".\n Valid key combos look like \"cmd + plus\", \"shift+p\", or \"!\"");
}
if (exports.Aliases[piece] != null) {
piece = exports.Aliases[piece];
}
if (exports.ModifierBitMasks[piece] != null) {
modifiers += exports.ModifierBitMasks[piece];
}
else if (exports.ShiftKeys[piece] != null) {
// tslint:disable-next-line no-string-literal
modifiers += exports.ModifierBitMasks["shift"];
key = exports.ShiftKeys[piece];
}
else {
key = piece.toLowerCase();
}
}
return { modifiers: modifiers, key: key };
};
/**
* PhantomJS's webkit totally messes up keyboard events, so we have do this
* fancy little dance with the event data to determine which key was pressed
* for unit tests.
*/
var normalizeKeyCode = function (e) {
return (e.which === 0 && e.key != null) ? e.key.charCodeAt(0) : e.which;
};
/**
* Converts a keyboard event into a valid combo prop string
*/
exports.getKeyComboString = function (e) {
var keys = [];
// modifiers first
if (e.ctrlKey) {
keys.push("ctrl");
}
if (e.altKey) {
keys.push("alt");
}
if (e.shiftKey) {
keys.push("shift");
}
if (e.metaKey) {
keys.push("meta");
}
var which = normalizeKeyCode(e);
if (exports.Modifiers[which] != null) {
}
else if (exports.KeyCodes[which] != null) {
keys.push(exports.KeyCodes[which]);
}
else {
keys.push(String.fromCharCode(which).toLowerCase());
}
// join keys with plusses
return keys.join(" + ");
};
/**
* Determines the key combo object from the given keyboard event. Again, a key
* combo includes zero or more modifiers (represented by a bitmask) and one
* action key, which we determine from the `e.which` property of the keyboard
* event.
*/
exports.getKeyCombo = function (e) {
var key = null;
var which = normalizeKeyCode(e);
if (exports.Modifiers[which] != null) {
}
else if (exports.KeyCodes[which] != null) {
key = exports.KeyCodes[which];
}
else {
key = String.fromCharCode(which).toLowerCase();
}
var modifiers = 0;
// tslint:disable no-string-literal
if (e.altKey) {
modifiers += exports.ModifierBitMasks["alt"];
}
if (e.ctrlKey) {
modifiers += exports.ModifierBitMasks["ctrl"];
}
if (e.metaKey) {
modifiers += exports.ModifierBitMasks["meta"];
}
if (e.shiftKey) {
modifiers += exports.ModifierBitMasks["shift"];
}
// tslint:enable
return { modifiers: modifiers, key: key };
};
/**
* Splits a key combo string into its constituent key values and looks up
* aliases, such as `return` -> `enter`.
*
* Unlike the parseKeyCombo method, this method does NOT convert shifted
* action keys. So `"@"` will NOT be converted to `["shift", "2"]`).
*/
exports.normalizeKeyCombo = function (combo) {
var keys = combo.replace(/\s/g, "").split("+");
return keys.map(function (key) { return exports.Aliases[key] != null ? exports.Aliases[key] : key; });
};
/* tslint:enable:no-string-literal */
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9jb21wb25lbnRzL2hvdGtleXMvaG90a2V5UGFyc2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7OztHQUtHOztBQWNVLGdCQUFRLEdBQUc7SUFDcEIsQ0FBQyxFQUFFLFdBQVc7SUFDZCxDQUFDLEVBQUUsS0FBSztJQUNSLEVBQUUsRUFBRSxPQUFPO0lBQ1gsRUFBRSxFQUFFLFVBQVU7SUFDZCxFQUFFLEVBQUUsS0FBSztJQUNULEVBQUUsRUFBRSxPQUFPO0lBQ1gsRUFBRSxFQUFFLFFBQVE7SUFDWixFQUFFLEVBQUUsVUFBVTtJQUNkLEVBQUUsRUFBRSxLQUFLO0lBQ1QsRUFBRSxFQUFFLE1BQU07SUFDVixFQUFFLEVBQUUsTUFBTTtJQUNWLEVBQUUsRUFBRSxJQUFJO0lBQ1IsRUFBRSxFQUFFLE9BQU87SUFDWCxFQUFFLEVBQUUsTUFBTTtJQUNWLEVBQUUsRUFBRSxLQUFLO0lBQ1QsRUFBRSxFQUFFLEtBQUs7SUFDVCxjQUFjO0lBQ2QsRUFBRSxFQUFHLEdBQUc7SUFDUixFQUFFLEVBQUcsR0FBRztJQUNSLEVBQUUsRUFBRyxHQUFHO0lBQ1IsRUFBRSxFQUFHLEdBQUc7SUFDUixFQUFFLEVBQUcsR0FBRztJQUNSLEVBQUUsRUFBRyxHQUFHO0lBQ1IsRUFBRSxFQUFHLEdBQUc7SUFDUixFQUFFLEVBQUcsR0FBRztJQUNSLEVBQUUsRUFBRyxHQUFHO0lBQ1IsRUFBRSxFQUFHLEdBQUc7SUFDUixXQUFXO0lBQ1gsRUFBRSxFQUFHLEdBQUc7SUFDUixFQUFFLEVBQUcsR0FBRztJQUNSLEVBQUUsRUFBRyxHQUFHO0lBQ1IsRUFBRSxFQUFHLEdBQUc7SUFDUixFQUFFLEVBQUcsR0FBRztJQUNSLEVBQUUsRUFBRyxHQUFHO0lBQ1IsRUFBRSxFQUFHLEdBQUc7SUFDUixFQUFFLEVBQUcsR0FBRztJQUNSLEVBQUUsRUFBRyxHQUFHO0lBQ1IsRUFBRSxFQUFHLEdBQUc7SUFDUixFQUFFLEVBQUcsR0FBRztJQUNSLEVBQUUsRUFBRyxHQUFHO0lBQ1IsRUFBRSxFQUFHLEdBQUc7SUFDUixFQUFFLEVBQUcsR0FBRztJQUNSLEVBQUUsRUFBRyxHQUFHO0lBQ1IsRUFBRSxFQUFHLEdBQUc7SUFDUixFQUFFLEVBQUcsR0FBRztJQUNSLEVBQUUsRUFBRyxHQUFHO0lBQ1IsRUFBRSxFQUFHLEdBQUc7SUFDUixFQUFFLEVBQUcsR0FBRztJQUNSLEVBQUUsRUFBRyxHQUFHO0lBQ1IsRUFBRSxFQUFHLEdBQUc7SUFDUixFQUFFLEVBQUcsR0FBRztJQUNSLEVBQUUsRUFBRyxHQUFHO0lBQ1IsRUFBRSxFQUFHLEdBQUc7SUFDUixFQUFFLEVBQUcsR0FBRztJQUNSLGNBQWM7SUFDZCxHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxJQUFJO0lBQ1QsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsSUFBSTtDQUNLLENBQUM7QUFFTixpQkFBUyxHQUFHO0lBQ3JCLEVBQUUsRUFBRSxPQUFPO0lBQ1gsRUFBRSxFQUFFLE1BQU07SUFDVixFQUFFLEVBQUUsS0FBSztJQUNULEVBQUUsRUFBRSxNQUFNO0lBQ1YsRUFBRSxFQUFFLE1BQU07SUFDVixHQUFHLEVBQUUsTUFBTTtDQUNHLENBQUM7QUFFTix3QkFBZ0IsR0FBRztJQUM1QixHQUFHLEVBQUUsQ0FBQztJQUNOLElBQUksRUFBRSxDQUFDO0lBQ1AsSUFBSSxFQUFFLENBQUM7SUFDUCxLQUFLLEVBQUUsQ0FBQztDQUNhLENBQUM7QUFFYixlQUFPLEdBQUc7SUFDbkIsR0FBRyxFQUFFLE1BQU07SUFDWCxPQUFPLEVBQUUsTUFBTTtJQUNmLE1BQU0sRUFBRSxLQUFLO0lBQ2IsS0FBSyxFQUFFLEdBQUc7SUFDVixHQUFHLEVBQUUsc0JBQXNCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsR0FBRyxNQUFNLEdBQUcsTUFBTTtJQUN0RSxNQUFNLEVBQUUsS0FBSztJQUNiLElBQUksRUFBRSxHQUFHO0lBQ1QsTUFBTSxFQUFFLE9BQU87SUFDZixHQUFHLEVBQUUsTUFBTTtDQUNILENBQUM7QUFFYixtQ0FBbUM7QUFDbkMsMENBQTBDO0FBQzdCLGlCQUFTLEdBQUc7SUFDckIsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLElBQUk7SUFDVCxHQUFHLEVBQUUsR0FBRztJQUNSLElBQUksRUFBRSxJQUFJO0lBQ1YsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0NBQ0EsQ0FBQztBQUNiLHlDQUF5QztBQUV6Qyw2Q0FBNkM7QUFFN0MsZ0JBQWdCO0FBQ2hCLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDM0IsZ0JBQVEsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUNoQyxDQUFDO0FBRUQsU0FBUztBQUNULEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDMUIsZ0JBQVEsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztBQUM1QyxDQUFDO0FBT0Qsc0JBQTZCLENBQVksRUFBRSxDQUFZO0lBQ25ELE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxLQUFLLENBQUMsQ0FBQyxTQUFTLElBQUksQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDO0FBQzFELENBQUM7QUFGZSxvQkFBWSxlQUUzQixDQUFBO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDVSxxQkFBYSxHQUFHLFVBQUMsS0FBYTtJQUN2QyxJQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDakUsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDO0lBQ2xCLElBQUksR0FBRyxHQUFHLElBQWMsQ0FBQztJQUN6QixHQUFHLENBQUMsQ0FBYyxVQUFNLEVBQU4saUJBQU0sRUFBTixvQkFBTSxFQUFOLElBQU0sQ0FBQztRQUFwQixJQUFJLEtBQUssZUFBQTtRQUNWLEVBQUUsQ0FBQyxDQUFDLEtBQUssS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ2YsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQ0FBOEIsS0FBSywwRkFDWSxDQUFDLENBQUM7UUFDckUsQ0FBQztRQUVELEVBQUUsQ0FBQyxDQUFDLGVBQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ3pCLEtBQUssR0FBRyxlQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDM0IsQ0FBQztRQUVELEVBQUUsQ0FBQyxDQUFDLHdCQUFnQixDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDbEMsU0FBUyxJQUFJLHdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pDLENBQUM7UUFBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsaUJBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ2xDLDZDQUE2QztZQUM3QyxTQUFTLElBQUksd0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDdkMsR0FBRyxHQUFHLGlCQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDM0IsQ0FBQztRQUFDLElBQUksQ0FBQyxDQUFDO1lBQ0osR0FBRyxHQUFHLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUM5QixDQUFDO0tBQ0o7SUFDRCxNQUFNLENBQUMsRUFBRSxvQkFBUyxFQUFFLFFBQUcsRUFBRSxDQUFDO0FBQzlCLENBQUMsQ0FBQztBQUVGOzs7O0dBSUc7QUFDSCxJQUFNLGdCQUFnQixHQUFHLFVBQUMsQ0FBZ0I7SUFDdEMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDO0FBQzVFLENBQUMsQ0FBQztBQUVGOztHQUVHO0FBQ1UseUJBQWlCLEdBQUcsVUFBQyxDQUFnQjtJQUM5QyxJQUFNLElBQUksR0FBRyxFQUFjLENBQUM7SUFFNUIsa0JBQWtCO0lBQ2xCLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUFDLENBQUM7SUFDckMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQUMsQ0FBQztJQUNuQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFBQyxDQUFDO0lBQ3ZDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUFDLENBQUM7SUFFckMsSUFBTSxLQUFLLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEMsRUFBRSxDQUFDLENBQUMsaUJBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBRS9CLENBQUM7SUFBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsZ0JBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFBQyxJQUFJLENBQUMsQ0FBQztRQUNKLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFRCx5QkFBeUI7SUFDekIsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDNUIsQ0FBQyxDQUFDO0FBRUY7Ozs7O0dBS0c7QUFDVSxtQkFBVyxHQUFHLFVBQUMsQ0FBZ0I7SUFDeEMsSUFBSSxHQUFHLEdBQUcsSUFBYyxDQUFDO0lBQ3pCLElBQU0sS0FBSyxHQUFHLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xDLEVBQUUsQ0FBQyxDQUFDLGlCQUFTLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQztJQUUvQixDQUFDO0lBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLGdCQUFRLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNqQyxHQUFHLEdBQUcsZ0JBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBQUMsSUFBSSxDQUFDLENBQUM7UUFDSixHQUFHLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNuRCxDQUFDO0lBRUQsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDO0lBQ2xCLG1DQUFtQztJQUNuQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUFDLFNBQVMsSUFBSSx3QkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUFDLENBQUM7SUFDdkQsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFBQyxTQUFTLElBQUksd0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFBQyxDQUFDO0lBQ3pELEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQUMsU0FBUyxJQUFJLHdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQUMsQ0FBQztJQUN6RCxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUFDLFNBQVMsSUFBSSx3QkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUFDLENBQUM7SUFDM0QsZ0JBQWdCO0lBRWhCLE1BQU0sQ0FBQyxFQUFFLG9CQUFTLEVBQUUsUUFBRyxFQUFFLENBQUM7QUFDOUIsQ0FBQyxDQUFDO0FBRUY7Ozs7OztHQU1HO0FBQ1UseUJBQWlCLEdBQUcsVUFBQyxLQUFhO0lBQzNDLElBQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNqRCxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFDLEdBQUcsSUFBSyxPQUFBLGVBQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLEdBQUcsZUFBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBekMsQ0FBeUMsQ0FBQyxDQUFDO0FBQ3hFLENBQUMsQ0FBQztBQUNGLHFDQUFxQyIsImZpbGUiOiJjb21wb25lbnRzL2hvdGtleXMvaG90a2V5UGFyc2VyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAyMDE2IFBhbGFudGlyIFRlY2hub2xvZ2llcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEJTRC0zIExpY2Vuc2UgYXMgbW9kaWZpZWQgKHRoZSDigJxMaWNlbnNl4oCdKTsgeW91IG1heSBvYnRhaW4gYSBjb3B5XG4gKiBvZiB0aGUgbGljZW5zZSBhdCBodHRwczovL2dpdGh1Yi5jb20vcGFsYW50aXIvYmx1ZXByaW50L2Jsb2IvbWFzdGVyL0xJQ0VOU0VcbiAqIGFuZCBodHRwczovL2dpdGh1Yi5jb20vcGFsYW50aXIvYmx1ZXByaW50L2Jsb2IvbWFzdGVyL1BBVEVOVFNcbiAqL1xuXG5leHBvcnQgaW50ZXJmYWNlIElLZXlDb2RlVGFibGUge1xuICAgIFtjb2RlOiBudW1iZXJdOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUtleUNvZGVSZXZlcnNlVGFibGUge1xuICAgIFtrZXk6IHN0cmluZ106IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJS2V5TWFwIHtcbiAgICBba2V5OiBzdHJpbmddOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjb25zdCBLZXlDb2RlcyA9IHtcbiAgICA4OiBcImJhY2tzcGFjZVwiLFxuICAgIDk6IFwidGFiXCIsXG4gICAgMTM6IFwiZW50ZXJcIixcbiAgICAyMDogXCJjYXBzbG9ja1wiLFxuICAgIDI3OiBcImVzY1wiLFxuICAgIDMyOiBcInNwYWNlXCIsXG4gICAgMzM6IFwicGFnZXVwXCIsXG4gICAgMzQ6IFwicGFnZWRvd25cIixcbiAgICAzNTogXCJlbmRcIixcbiAgICAzNjogXCJob21lXCIsXG4gICAgMzc6IFwibGVmdFwiLFxuICAgIDM4OiBcInVwXCIsXG4gICAgMzk6IFwicmlnaHRcIixcbiAgICA0MDogXCJkb3duXCIsXG4gICAgNDU6IFwiaW5zXCIsXG4gICAgNDY6IFwiZGVsXCIsXG4gICAgLy8gbnVtYmVyIGtleXNcbiAgICA0OCA6IFwiMFwiLFxuICAgIDQ5IDogXCIxXCIsXG4gICAgNTAgOiBcIjJcIixcbiAgICA1MSA6IFwiM1wiLFxuICAgIDUyIDogXCI0XCIsXG4gICAgNTMgOiBcIjVcIixcbiAgICA1NCA6IFwiNlwiLFxuICAgIDU1IDogXCI3XCIsXG4gICAgNTYgOiBcIjhcIixcbiAgICA1NyA6IFwiOVwiLFxuICAgIC8vIGFscGhhYmV0XG4gICAgNjUgOiBcImFcIixcbiAgICA2NiA6IFwiYlwiLFxuICAgIDY3IDogXCJjXCIsXG4gICAgNjggOiBcImRcIixcbiAgICA2OSA6IFwiZVwiLFxuICAgIDcwIDogXCJmXCIsXG4gICAgNzEgOiBcImdcIixcbiAgICA3MiA6IFwiaFwiLFxuICAgIDczIDogXCJpXCIsXG4gICAgNzQgOiBcImpcIixcbiAgICA3NSA6IFwia1wiLFxuICAgIDc2IDogXCJsXCIsXG4gICAgNzcgOiBcIm1cIixcbiAgICA3OCA6IFwiblwiLFxuICAgIDc5IDogXCJvXCIsXG4gICAgODAgOiBcInBcIixcbiAgICA4MSA6IFwicVwiLFxuICAgIDgyIDogXCJyXCIsXG4gICAgODMgOiBcInNcIixcbiAgICA4NCA6IFwidFwiLFxuICAgIDg1IDogXCJ1XCIsXG4gICAgODYgOiBcInZcIixcbiAgICA4NyA6IFwid1wiLFxuICAgIDg4IDogXCJ4XCIsXG4gICAgODkgOiBcInlcIixcbiAgICA5MCA6IFwielwiLFxuICAgIC8vIHB1bmN0dWF0aW9uXG4gICAgMTA2OiBcIipcIixcbiAgICAxMDc6IFwiK1wiLFxuICAgIDEwOTogXCItXCIsXG4gICAgMTEwOiBcIi5cIixcbiAgICAxMTE6IFwiL1wiLFxuICAgIDE4NjogXCI7XCIsXG4gICAgMTg3OiBcIj1cIixcbiAgICAxODg6IFwiLFwiLFxuICAgIDE4OTogXCItXCIsXG4gICAgMTkwOiBcIi5cIixcbiAgICAxOTE6IFwiL1wiLFxuICAgIDE5MjogXCJgXCIsXG4gICAgMjE5OiBcIltcIixcbiAgICAyMjA6IFwiXFxcXFwiLFxuICAgIDIyMTogXCJdXCIsXG4gICAgMjIyOiBcIlxcJ1wiLFxufSBhcyBJS2V5Q29kZVRhYmxlO1xuXG5leHBvcnQgY29uc3QgTW9kaWZpZXJzID0ge1xuICAgIDE2OiBcInNoaWZ0XCIsXG4gICAgMTc6IFwiY3RybFwiLFxuICAgIDE4OiBcImFsdFwiLFxuICAgIDkxOiBcIm1ldGFcIixcbiAgICA5MzogXCJtZXRhXCIsXG4gICAgMjI0OiBcIm1ldGFcIixcbn0gYXMgSUtleUNvZGVUYWJsZTtcblxuZXhwb3J0IGNvbnN0IE1vZGlmaWVyQml0TWFza3MgPSB7XG4gICAgYWx0OiAxLFxuICAgIGN0cmw6IDIsXG4gICAgbWV0YTogNCxcbiAgICBzaGlmdDogOCxcbn0gYXMgSUtleUNvZGVSZXZlcnNlVGFibGU7XG5cbmV4cG9ydCBjb25zdCBBbGlhc2VzID0ge1xuICAgIGNtZDogXCJtZXRhXCIsXG4gICAgY29tbWFuZDogXCJtZXRhXCIsXG4gICAgZXNjYXBlOiBcImVzY1wiLFxuICAgIG1pbnVzOiBcIi1cIixcbiAgICBtb2Q6IC9NYWN8aVBvZHxpUGhvbmV8aVBhZC8udGVzdChuYXZpZ2F0b3IucGxhdGZvcm0pID8gXCJtZXRhXCIgOiBcImN0cmxcIixcbiAgICBvcHRpb246IFwiYWx0XCIsXG4gICAgcGx1czogXCIrXCIsXG4gICAgcmV0dXJuOiBcImVudGVyXCIsXG4gICAgd2luOiBcIm1ldGFcIixcbn0gYXMgSUtleU1hcDtcblxuLy8gYWxwaCBzb3J0aW5nIGlzIHVuaW50dWl0aXZlIGhlcmVcbi8vIHRzbGludDpkaXNhYmxlIG9iamVjdC1saXRlcmFsLXNvcnQta2V5c1xuZXhwb3J0IGNvbnN0IFNoaWZ0S2V5cyA9IHtcbiAgICBcIn5cIjogXCJgXCIsXG4gICAgXCIhXCI6IFwiMVwiLFxuICAgIFwiQFwiOiBcIjJcIixcbiAgICBcIiNcIjogXCIzXCIsXG4gICAgXCIkXCI6IFwiNFwiLFxuICAgIFwiJVwiOiBcIjVcIixcbiAgICBcIl5cIjogXCI2XCIsXG4gICAgXCImXCI6IFwiN1wiLFxuICAgIFwiKlwiOiBcIjhcIixcbiAgICBcIihcIjogXCI5XCIsXG4gICAgXCIpXCI6IFwiMFwiLFxuICAgIFwiX1wiOiBcIi1cIixcbiAgICBcIitcIjogXCI9XCIsXG4gICAgXCJ7XCI6IFwiW1wiLFxuICAgIFwifVwiOiBcIl1cIixcbiAgICBcInxcIjogXCJcXFxcXCIsXG4gICAgXCI6XCI6IFwiO1wiLFxuICAgIFwiXFxcIlwiOiBcIlxcJ1wiLFxuICAgIFwiPFwiOiBcIixcIixcbiAgICBcIj5cIjogXCIuXCIsXG4gICAgXCI/XCI6IFwiL1wiLFxufSBhcyBJS2V5TWFwO1xuLy8gdHNsaW50OmVuYWJsZSBvYmplY3QtbGl0ZXJhbC1zb3J0LWtleXNcblxuLyogdHNsaW50OmVuYWJsZTpvYmplY3QtbGl0ZXJhbC1rZXktcXVvdGVzICovXG5cbi8vIEZ1bmN0aW9uIGtleXNcbmZvciAobGV0IGkgPSAxOyBpIDw9IDEyOyArK2kpIHtcbiAgICBLZXlDb2Rlc1sxMTEgKyBpXSA9IFwiZlwiICsgaTtcbn1cblxuLy8gTnVtcGFkXG5mb3IgKGxldCBpID0gMDsgaSA8PSA5OyArK2kpIHtcbiAgICBLZXlDb2Rlc1s5NiArIGldID0gXCJudW1cIiArIGkudG9TdHJpbmcoKTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJS2V5Q29tYm8ge1xuICAgIGtleT86IHN0cmluZztcbiAgICBtb2RpZmllcnM6IG51bWJlcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbWJvTWF0Y2hlcyhhOiBJS2V5Q29tYm8sIGI6IElLZXlDb21ibykge1xuICAgIHJldHVybiBhLm1vZGlmaWVycyA9PT0gYi5tb2RpZmllcnMgJiYgYS5rZXkgPT09IGIua2V5O1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGEga2V5IGNvbWJvIHN0cmluZyBpbnRvIGEga2V5IGNvbWJvIG9iamVjdC4gS2V5IGNvbWJvcyBpbmNsdWRlXG4gKiB6ZXJvIG9yIG1vcmUgbW9kaWZpZXIga2V5cywgc3VjaCBhcyBgc2hpZnRgIG9yIGBhbHRgLCBhbmQgZXhhY3RseSBvbmVcbiAqIGFjdGlvbiBrZXksIHN1Y2ggYXMgYEFgLCBgZW50ZXJgLCBvciBgbGVmdGAuXG4gKlxuICogRm9yIGFjdGlvbiBrZXlzIHRoYXQgcmVxdWlyZSBhIHNoaWZ0LCBlLmcuIGBAYCBvciBgfGAsIHdlIGlubHVkZSB0aGVcbiAqIG5lY2Vzc2FyeSBgc2hpZnRgIG1vZGlmaWVyIGFuZCBhdXRvbWF0aWNhbGx5IGNvbnZlcnQgdGhlIGFjdGlvbiBrZXkgdG8gdGhlXG4gKiB1bnNoaWZ0ZWQgdmVyc2lvbi4gRm9yIGV4YW1wbGUsIGBAYCBpcyBlcXVpdmFsZW50IHRvIGBzaGlmdCsyYC5cbiAqL1xuZXhwb3J0IGNvbnN0IHBhcnNlS2V5Q29tYm8gPSAoY29tYm86IHN0cmluZyk6IElLZXlDb21ibyA9PiB7XG4gICAgY29uc3QgcGllY2VzID0gY29tYm8ucmVwbGFjZSgvXFxzL2csIFwiXCIpLnRvTG93ZXJDYXNlKCkuc3BsaXQoXCIrXCIpO1xuICAgIGxldCBtb2RpZmllcnMgPSAwO1xuICAgIGxldCBrZXkgPSBudWxsIGFzIHN0cmluZztcbiAgICBmb3IgKGxldCBwaWVjZSBvZiBwaWVjZXMpIHtcbiAgICAgICAgaWYgKHBpZWNlID09PSBcIlwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBwYXJzZSBrZXkgY29tYm8gXCIke2NvbWJvfVwiLlxuICAgICAgICAgICAgICAgIFZhbGlkIGtleSBjb21ib3MgbG9vayBsaWtlIFwiY21kICsgcGx1c1wiLCBcInNoaWZ0K3BcIiwgb3IgXCIhXCJgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChBbGlhc2VzW3BpZWNlXSAhPSBudWxsKSB7XG4gICAgICAgICAgICBwaWVjZSA9IEFsaWFzZXNbcGllY2VdO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKE1vZGlmaWVyQml0TWFza3NbcGllY2VdICE9IG51bGwpIHtcbiAgICAgICAgICAgIG1vZGlmaWVycyArPSBNb2RpZmllckJpdE1hc2tzW3BpZWNlXTtcbiAgICAgICAgfSBlbHNlIGlmIChTaGlmdEtleXNbcGllY2VdICE9IG51bGwpIHtcbiAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZSBuby1zdHJpbmctbGl0ZXJhbFxuICAgICAgICAgICAgbW9kaWZpZXJzICs9IE1vZGlmaWVyQml0TWFza3NbXCJzaGlmdFwiXTtcbiAgICAgICAgICAgIGtleSA9IFNoaWZ0S2V5c1twaWVjZV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBrZXkgPSBwaWVjZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IG1vZGlmaWVycywga2V5IH07XG59O1xuXG4vKipcbiAqIFBoYW50b21KUydzIHdlYmtpdCB0b3RhbGx5IG1lc3NlcyB1cCBrZXlib2FyZCBldmVudHMsIHNvIHdlIGhhdmUgZG8gdGhpc1xuICogZmFuY3kgbGl0dGxlIGRhbmNlIHdpdGggdGhlIGV2ZW50IGRhdGEgdG8gZGV0ZXJtaW5lIHdoaWNoIGtleSB3YXMgcHJlc3NlZFxuICogZm9yIHVuaXQgdGVzdHMuXG4gKi9cbmNvbnN0IG5vcm1hbGl6ZUtleUNvZGUgPSAoZTogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgIHJldHVybiAoZS53aGljaCA9PT0gMCAmJiBlLmtleSAhPSBudWxsKSA/IGUua2V5LmNoYXJDb2RlQXQoMCkgOiBlLndoaWNoO1xufTtcblxuLyoqXG4gKiBDb252ZXJ0cyBhIGtleWJvYXJkIGV2ZW50IGludG8gYSB2YWxpZCBjb21ibyBwcm9wIHN0cmluZ1xuICovXG5leHBvcnQgY29uc3QgZ2V0S2V5Q29tYm9TdHJpbmcgPSAoZTogS2V5Ym9hcmRFdmVudCk6IHN0cmluZyA9PiB7XG4gICAgY29uc3Qga2V5cyA9IFtdIGFzIHN0cmluZ1tdO1xuXG4gICAgLy8gbW9kaWZpZXJzIGZpcnN0XG4gICAgaWYgKGUuY3RybEtleSkgeyBrZXlzLnB1c2goXCJjdHJsXCIpOyB9XG4gICAgaWYgKGUuYWx0S2V5KSB7IGtleXMucHVzaChcImFsdFwiKTsgfVxuICAgIGlmIChlLnNoaWZ0S2V5KSB7IGtleXMucHVzaChcInNoaWZ0XCIpOyB9XG4gICAgaWYgKGUubWV0YUtleSkgeyBrZXlzLnB1c2goXCJtZXRhXCIpOyB9XG5cbiAgICBjb25zdCB3aGljaCA9IG5vcm1hbGl6ZUtleUNvZGUoZSk7XG4gICAgaWYgKE1vZGlmaWVyc1t3aGljaF0gIT0gbnVsbCkge1xuICAgICAgICAvLyBubyBhY3Rpb24ga2V5XG4gICAgfSBlbHNlIGlmIChLZXlDb2Rlc1t3aGljaF0gIT0gbnVsbCkge1xuICAgICAgICBrZXlzLnB1c2goS2V5Q29kZXNbd2hpY2hdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBrZXlzLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZSh3aGljaCkudG9Mb3dlckNhc2UoKSk7XG4gICAgfVxuXG4gICAgLy8gam9pbiBrZXlzIHdpdGggcGx1c3Nlc1xuICAgIHJldHVybiBrZXlzLmpvaW4oXCIgKyBcIik7XG59O1xuXG4vKipcbiAqIERldGVybWluZXMgdGhlIGtleSBjb21ibyBvYmplY3QgZnJvbSB0aGUgZ2l2ZW4ga2V5Ym9hcmQgZXZlbnQuIEFnYWluLCBhIGtleVxuICogY29tYm8gaW5jbHVkZXMgemVybyBvciBtb3JlIG1vZGlmaWVycyAocmVwcmVzZW50ZWQgYnkgYSBiaXRtYXNrKSBhbmQgb25lXG4gKiBhY3Rpb24ga2V5LCB3aGljaCB3ZSBkZXRlcm1pbmUgZnJvbSB0aGUgYGUud2hpY2hgIHByb3BlcnR5IG9mIHRoZSBrZXlib2FyZFxuICogZXZlbnQuXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRLZXlDb21ibyA9IChlOiBLZXlib2FyZEV2ZW50KTogSUtleUNvbWJvID0+IHtcbiAgICBsZXQga2V5ID0gbnVsbCBhcyBzdHJpbmc7XG4gICAgY29uc3Qgd2hpY2ggPSBub3JtYWxpemVLZXlDb2RlKGUpO1xuICAgIGlmIChNb2RpZmllcnNbd2hpY2hdICE9IG51bGwpIHtcbiAgICAgICAgLy8ga2VlcCBrZXkgbnVsbFxuICAgIH0gZWxzZSBpZiAoS2V5Q29kZXNbd2hpY2hdICE9IG51bGwpIHtcbiAgICAgICAga2V5ID0gS2V5Q29kZXNbd2hpY2hdO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGtleSA9IFN0cmluZy5mcm9tQ2hhckNvZGUod2hpY2gpLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuXG4gICAgbGV0IG1vZGlmaWVycyA9IDA7XG4gICAgLy8gdHNsaW50OmRpc2FibGUgbm8tc3RyaW5nLWxpdGVyYWxcbiAgICBpZiAoZS5hbHRLZXkpIHsgbW9kaWZpZXJzICs9IE1vZGlmaWVyQml0TWFza3NbXCJhbHRcIl07IH1cbiAgICBpZiAoZS5jdHJsS2V5KSB7IG1vZGlmaWVycyArPSBNb2RpZmllckJpdE1hc2tzW1wiY3RybFwiXTsgfVxuICAgIGlmIChlLm1ldGFLZXkpIHsgbW9kaWZpZXJzICs9IE1vZGlmaWVyQml0TWFza3NbXCJtZXRhXCJdOyB9XG4gICAgaWYgKGUuc2hpZnRLZXkpIHsgbW9kaWZpZXJzICs9IE1vZGlmaWVyQml0TWFza3NbXCJzaGlmdFwiXTsgfVxuICAgIC8vIHRzbGludDplbmFibGVcblxuICAgIHJldHVybiB7IG1vZGlmaWVycywga2V5IH07XG59O1xuXG4vKipcbiAqIFNwbGl0cyBhIGtleSBjb21ibyBzdHJpbmcgaW50byBpdHMgY29uc3RpdHVlbnQga2V5IHZhbHVlcyBhbmQgbG9va3MgdXBcbiAqIGFsaWFzZXMsIHN1Y2ggYXMgYHJldHVybmAgLT4gYGVudGVyYC5cbiAqXG4gKiBVbmxpa2UgdGhlIHBhcnNlS2V5Q29tYm8gbWV0aG9kLCB0aGlzIG1ldGhvZCBkb2VzIE5PVCBjb252ZXJ0IHNoaWZ0ZWRcbiAqIGFjdGlvbiBrZXlzLiBTbyBgXCJAXCJgIHdpbGwgTk9UIGJlIGNvbnZlcnRlZCB0byBgW1wic2hpZnRcIiwgXCIyXCJdYCkuXG4gKi9cbmV4cG9ydCBjb25zdCBub3JtYWxpemVLZXlDb21ibyA9IChjb21ibzogc3RyaW5nKTogc3RyaW5nW10gPT4ge1xuICAgIGNvbnN0IGtleXMgPSBjb21iby5yZXBsYWNlKC9cXHMvZywgXCJcIikuc3BsaXQoXCIrXCIpO1xuICAgIHJldHVybiBrZXlzLm1hcCgoa2V5KSA9PiBBbGlhc2VzW2tleV0gIT0gbnVsbCA/IEFsaWFzZXNba2V5XSA6IGtleSk7XG59O1xuLyogdHNsaW50OmVuYWJsZTpuby1zdHJpbmctbGl0ZXJhbCAqL1xuIl0sInNvdXJjZVJvb3QiOiIvc291cmNlLyJ9