UNPKG

matrix-react-sdk

Version:
396 lines (366 loc) 41.4 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.registerShortcut = exports.toggleDialog = exports.CMD_OR_CTRL = exports.Modifiers = exports.Categories = void 0; var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var sdk = _interopRequireWildcard(require("../index")); var _Modal = _interopRequireDefault(require("../Modal")); var _languageHandler = require("../languageHandler"); var _Keyboard = require("../Keyboard"); /* Copyright 2020 The Matrix.org Foundation C.I.C. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ // TS: once languageHandler is TS we can probably inline this into the enum (0, _languageHandler._td)("Navigation"); (0, _languageHandler._td)("Calls"); (0, _languageHandler._td)("Composer"); (0, _languageHandler._td)("Room List"); (0, _languageHandler._td)("Autocomplete"); let Categories; // TS: once languageHandler is TS we can probably inline this into the enum exports.Categories = Categories; (function (Categories) { Categories["NAVIGATION"] = "Navigation"; Categories["CALLS"] = "Calls"; Categories["COMPOSER"] = "Composer"; Categories["ROOM_LIST"] = "Room List"; Categories["ROOM"] = "Room"; Categories["AUTOCOMPLETE"] = "Autocomplete"; })(Categories || (exports.Categories = Categories = {})); (0, _languageHandler._td)("Alt"); (0, _languageHandler._td)("Alt Gr"); (0, _languageHandler._td)("Shift"); (0, _languageHandler._td)("Super"); (0, _languageHandler._td)("Ctrl"); let Modifiers; // Meta-modifier: isMac ? CMD : CONTROL exports.Modifiers = Modifiers; (function (Modifiers) { Modifiers["ALT"] = "Alt"; Modifiers["ALT_GR"] = "Alt Gr"; Modifiers["SHIFT"] = "Shift"; Modifiers["SUPER"] = "Super"; Modifiers["COMMAND"] = "Command"; Modifiers["CONTROL"] = "Ctrl"; })(Modifiers || (exports.Modifiers = Modifiers = {})); const CMD_OR_CTRL = _Keyboard.isMac ? Modifiers.COMMAND : Modifiers.CONTROL; exports.CMD_OR_CTRL = CMD_OR_CTRL; const shortcuts /*: Record<Categories, IShortcut[]>*/ = { [Categories.COMPOSER]: [{ keybinds: [{ modifiers: [CMD_OR_CTRL], key: _Keyboard.Key.B }], description: (0, _languageHandler._td)("Toggle Bold") }, { keybinds: [{ modifiers: [CMD_OR_CTRL], key: _Keyboard.Key.I }], description: (0, _languageHandler._td)("Toggle Italics") }, { keybinds: [{ modifiers: [CMD_OR_CTRL], key: _Keyboard.Key.GREATER_THAN }], description: (0, _languageHandler._td)("Toggle Quote") }, { keybinds: [{ modifiers: [Modifiers.SHIFT], key: _Keyboard.Key.ENTER }], description: (0, _languageHandler._td)("New line") }, { keybinds: [{ key: _Keyboard.Key.ARROW_UP }, { key: _Keyboard.Key.ARROW_DOWN }], description: (0, _languageHandler._td)("Navigate recent messages to edit") }, { keybinds: [{ modifiers: [CMD_OR_CTRL], key: _Keyboard.Key.HOME }, { modifiers: [CMD_OR_CTRL], key: _Keyboard.Key.END }], description: (0, _languageHandler._td)("Jump to start/end of the composer") }, { keybinds: [{ modifiers: [Modifiers.CONTROL, Modifiers.ALT], key: _Keyboard.Key.ARROW_UP }, { modifiers: [Modifiers.CONTROL, Modifiers.ALT], key: _Keyboard.Key.ARROW_DOWN }], description: (0, _languageHandler._td)("Navigate composer history") }, { keybinds: [{ key: _Keyboard.Key.ESCAPE }], description: (0, _languageHandler._td)("Cancel replying to a message") }], [Categories.CALLS]: [{ keybinds: [{ modifiers: [CMD_OR_CTRL], key: _Keyboard.Key.D }], description: (0, _languageHandler._td)("Toggle microphone mute") }, { keybinds: [{ modifiers: [CMD_OR_CTRL], key: _Keyboard.Key.E }], description: (0, _languageHandler._td)("Toggle video on/off") }], [Categories.ROOM]: [{ keybinds: [{ key: _Keyboard.Key.PAGE_UP }, { key: _Keyboard.Key.PAGE_DOWN }], description: (0, _languageHandler._td)("Scroll up/down in the timeline") }, { keybinds: [{ key: _Keyboard.Key.ESCAPE }], description: (0, _languageHandler._td)("Dismiss read marker and jump to bottom") }, { keybinds: [{ modifiers: [Modifiers.SHIFT], key: _Keyboard.Key.PAGE_UP }], description: (0, _languageHandler._td)("Jump to oldest unread message") }, { keybinds: [{ modifiers: [CMD_OR_CTRL, Modifiers.SHIFT], key: _Keyboard.Key.U }], description: (0, _languageHandler._td)("Upload a file") }, { keybinds: [{ modifiers: [CMD_OR_CTRL], key: _Keyboard.Key.F }], description: (0, _languageHandler._td)("Search (must be enabled)") }], [Categories.ROOM_LIST]: [{ keybinds: [{ modifiers: [CMD_OR_CTRL], key: _Keyboard.Key.K }], description: (0, _languageHandler._td)("Jump to room search") }, { keybinds: [{ key: _Keyboard.Key.ARROW_UP }, { key: _Keyboard.Key.ARROW_DOWN }], description: (0, _languageHandler._td)("Navigate up/down in the room list") }, { keybinds: [{ key: _Keyboard.Key.ENTER }], description: (0, _languageHandler._td)("Select room from the room list") }, { keybinds: [{ key: _Keyboard.Key.ARROW_LEFT }], description: (0, _languageHandler._td)("Collapse room list section") }, { keybinds: [{ key: _Keyboard.Key.ARROW_RIGHT }], description: (0, _languageHandler._td)("Expand room list section") }, { keybinds: [{ key: _Keyboard.Key.ESCAPE }], description: (0, _languageHandler._td)("Clear room list filter field") }], [Categories.NAVIGATION]: [{ keybinds: [{ modifiers: [Modifiers.ALT, Modifiers.SHIFT], key: _Keyboard.Key.ARROW_UP }, { modifiers: [Modifiers.ALT, Modifiers.SHIFT], key: _Keyboard.Key.ARROW_DOWN }], description: (0, _languageHandler._td)("Previous/next unread room or DM") }, { keybinds: [{ modifiers: [Modifiers.ALT], key: _Keyboard.Key.ARROW_UP }, { modifiers: [Modifiers.ALT], key: _Keyboard.Key.ARROW_DOWN }], description: (0, _languageHandler._td)("Previous/next room or DM") }, { keybinds: [{ modifiers: [CMD_OR_CTRL], key: _Keyboard.Key.BACKTICK }], description: (0, _languageHandler._td)("Toggle the top left menu") }, { keybinds: [{ key: _Keyboard.Key.ESCAPE }], description: (0, _languageHandler._td)("Close dialog or context menu") }, { keybinds: [{ key: _Keyboard.Key.ENTER }, { key: _Keyboard.Key.SPACE }], description: (0, _languageHandler._td)("Activate selected button") }, { keybinds: [{ modifiers: [CMD_OR_CTRL], key: _Keyboard.Key.PERIOD }], description: (0, _languageHandler._td)("Toggle right panel") }, { keybinds: [{ modifiers: [CMD_OR_CTRL], key: _Keyboard.Key.SLASH }], description: (0, _languageHandler._td)("Toggle this dialog") }, { keybinds: [{ modifiers: [Modifiers.CONTROL, _Keyboard.isMac ? Modifiers.SHIFT : Modifiers.ALT], key: _Keyboard.Key.H }], description: (0, _languageHandler._td)("Go to Home View") }], [Categories.AUTOCOMPLETE]: [{ keybinds: [{ key: _Keyboard.Key.ARROW_UP }, { key: _Keyboard.Key.ARROW_DOWN }], description: (0, _languageHandler._td)("Move autocomplete selection up/down") }, { keybinds: [{ key: _Keyboard.Key.ESCAPE }], description: (0, _languageHandler._td)("Cancel autocomplete") }] }; const categoryOrder = [Categories.COMPOSER, Categories.AUTOCOMPLETE, Categories.ROOM, Categories.ROOM_LIST, Categories.NAVIGATION, Categories.CALLS]; const modifierIcon /*: Record<string, string>*/ = { [Modifiers.COMMAND]: "⌘" }; if (_Keyboard.isMac) { modifierIcon[Modifiers.ALT] = "⌥"; } const alternateKeyName /*: Record<string, string>*/ = { [_Keyboard.Key.PAGE_UP]: (0, _languageHandler._td)("Page Up"), [_Keyboard.Key.PAGE_DOWN]: (0, _languageHandler._td)("Page Down"), [_Keyboard.Key.ESCAPE]: (0, _languageHandler._td)("Esc"), [_Keyboard.Key.ENTER]: (0, _languageHandler._td)("Enter"), [_Keyboard.Key.SPACE]: (0, _languageHandler._td)("Space"), [_Keyboard.Key.HOME]: (0, _languageHandler._td)("Home"), [_Keyboard.Key.END]: (0, _languageHandler._td)("End") }; const keyIcon /*: Record<string, string>*/ = { [_Keyboard.Key.ARROW_UP]: "↑", [_Keyboard.Key.ARROW_DOWN]: "↓", [_Keyboard.Key.ARROW_LEFT]: "←", [_Keyboard.Key.ARROW_RIGHT]: "→" }; const Shortcut /*: React.FC<{ shortcut: IShortcut; }>*/ = ({ shortcut }) => { const classes = (0, _classnames.default)({ "mx_KeyboardShortcutsDialog_inline": shortcut.keybinds.every(k => !k.modifiers || k.modifiers.length === 0) }); return /*#__PURE__*/React.createElement("div", { className: classes }, /*#__PURE__*/React.createElement("h5", null, (0, _languageHandler._t)(shortcut.description)), shortcut.keybinds.map(s => { let text = s.key; if (alternateKeyName[s.key]) { text = (0, _languageHandler._t)(alternateKeyName[s.key]); } else if (keyIcon[s.key]) { text = keyIcon[s.key]; } return /*#__PURE__*/React.createElement("div", { key: s.key }, s.modifiers && s.modifiers.map(m => { return /*#__PURE__*/React.createElement(React.Fragment, { key: m }, /*#__PURE__*/React.createElement("kbd", null, modifierIcon[m] || (0, _languageHandler._t)(m)), "+"); }), /*#__PURE__*/React.createElement("kbd", null, text)); })); }; let activeModal /*: IModal*/ = null; const toggleDialog = () => { if (activeModal) { activeModal.close(); activeModal = null; return; } const sections = categoryOrder.map(category => { const list = shortcuts[category]; return /*#__PURE__*/React.createElement("div", { className: "mx_KeyboardShortcutsDialog_category", key: category }, /*#__PURE__*/React.createElement("h3", null, (0, _languageHandler._t)(category)), /*#__PURE__*/React.createElement("div", null, list.map(shortcut => /*#__PURE__*/React.createElement(Shortcut, { key: shortcut.description, shortcut: shortcut })))); }); const InfoDialog = sdk.getComponent('dialogs.InfoDialog'); activeModal = _Modal.default.createTrackedDialog("Keyboard Shortcuts", "", InfoDialog, { className: "mx_KeyboardShortcutsDialog", title: (0, _languageHandler._t)("Keyboard Shortcuts"), description: sections, hasCloseButton: true, onKeyDown: ev => { if (ev.ctrlKey && !ev.shiftKey && !ev.altKey && !ev.metaKey && ev.key === _Keyboard.Key.SLASH) { // Ctrl + / ev.stopPropagation(); activeModal.close(); } }, onFinished: () => { activeModal = null; } }); }; exports.toggleDialog = toggleDialog; const registerShortcut = (category /*: Categories*/ , defn /*: IShortcut*/ ) => { shortcuts[category].push(defn); }; exports.registerShortcut = registerShortcut; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hY2Nlc3NpYmlsaXR5L0tleWJvYXJkU2hvcnRjdXRzLnRzeCJdLCJuYW1lcyI6WyJDYXRlZ29yaWVzIiwiTW9kaWZpZXJzIiwiQ01EX09SX0NUUkwiLCJpc01hYyIsIkNPTU1BTkQiLCJDT05UUk9MIiwic2hvcnRjdXRzIiwiQ09NUE9TRVIiLCJrZXliaW5kcyIsIm1vZGlmaWVycyIsImtleSIsIktleSIsIkIiLCJkZXNjcmlwdGlvbiIsIkkiLCJHUkVBVEVSX1RIQU4iLCJTSElGVCIsIkVOVEVSIiwiQVJST1dfVVAiLCJBUlJPV19ET1dOIiwiSE9NRSIsIkVORCIsIkFMVCIsIkVTQ0FQRSIsIkNBTExTIiwiRCIsIkUiLCJST09NIiwiUEFHRV9VUCIsIlBBR0VfRE9XTiIsIlUiLCJGIiwiUk9PTV9MSVNUIiwiSyIsIkFSUk9XX0xFRlQiLCJBUlJPV19SSUdIVCIsIk5BVklHQVRJT04iLCJCQUNLVElDSyIsIlNQQUNFIiwiUEVSSU9EIiwiU0xBU0giLCJIIiwiQVVUT0NPTVBMRVRFIiwiY2F0ZWdvcnlPcmRlciIsIm1vZGlmaWVySWNvbiIsImFsdGVybmF0ZUtleU5hbWUiLCJrZXlJY29uIiwiU2hvcnRjdXQiLCJzaG9ydGN1dCIsImNsYXNzZXMiLCJldmVyeSIsImsiLCJsZW5ndGgiLCJtYXAiLCJzIiwidGV4dCIsIm0iLCJhY3RpdmVNb2RhbCIsInRvZ2dsZURpYWxvZyIsImNsb3NlIiwic2VjdGlvbnMiLCJjYXRlZ29yeSIsImxpc3QiLCJJbmZvRGlhbG9nIiwic2RrIiwiZ2V0Q29tcG9uZW50IiwiTW9kYWwiLCJjcmVhdGVUcmFja2VkRGlhbG9nIiwiY2xhc3NOYW1lIiwidGl0bGUiLCJoYXNDbG9zZUJ1dHRvbiIsIm9uS2V5RG93biIsImV2IiwiY3RybEtleSIsInNoaWZ0S2V5IiwiYWx0S2V5IiwibWV0YUtleSIsInN0b3BQcm9wYWdhdGlvbiIsIm9uRmluaXNoZWQiLCJyZWdpc3RlclNob3J0Y3V0IiwiZGVmbiIsInB1c2giXSwi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RUFBRSxDQUFDRSxRQUFsQixJQUE4QixDQUFDRixFQUFFLENBQUNHLE1BQWxDLElBQTRDLENBQUNILEVBQUUsQ0FBQ0ksT0FBaEQsSUFBMkRKLEVBQUUsQ0FBQzlELEdBQUgsS0FBV0MsY0FBSTZCLEtBQTlFLEVBQXFGO0FBQUU7QUFDbkZnQyxRQUFBQSxFQUFFLENBQUNLLGVBQUg7QUFDQXBCLFFBQUFBLFdBQVcsQ0FBQ0UsS0FBWjtBQUNIO0FBQ0osS0FWeUU7QUFXMUVtQixJQUFBQSxVQUFVLEVBQUUsTUFBTTtBQUNkckIsTUFBQUEsV0FBVyxHQUFHLElBQWQ7QUFDSDtBQWJ5RSxHQUFoRSxDQUFkO0FBZUgsQ0EvQk07Ozs7QUFpQ0EsTUFBTXNCLGdCQUFnQixHQUFHLENBQUNsQjtBQUFEO0FBQUEsRUFBdUJtQjtBQUF2QjtBQUFBLEtBQTJDO0FBQ3ZFMUUsRUFBQUEsU0FBUyxDQUFDdUQsUUFBRCxDQUFULENBQW9Cb0IsSUFBcEIsQ0FBeUJELElBQXpCO0FBQ0gsQ0FGTSIsInNvdXJjZXNDb250ZW50IjpbIi8qXG5Db3B5cmlnaHQgMjAyMCBUaGUgTWF0cml4Lm9yZyBGb3VuZGF0aW9uIEMuSS5DLlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiovXG5cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSBcImNsYXNzbmFtZXNcIjtcblxuaW1wb3J0ICogYXMgc2RrIGZyb20gXCIuLi9pbmRleFwiO1xuaW1wb3J0IE1vZGFsIGZyb20gXCIuLi9Nb2RhbFwiO1xuaW1wb3J0IHsgX3QsIF90ZCB9IGZyb20gXCIuLi9sYW5ndWFnZUhhbmRsZXJcIjtcbmltcG9ydCB7aXNNYWMsIEtleX0gZnJvbSBcIi4uL0tleWJvYXJkXCI7XG5cbi8vIFRTOiBvbmNlIGxhbmd1YWdlSGFuZGxlciBpcyBUUyB3ZSBjYW4gcHJvYmFibHkgaW5saW5lIHRoaXMgaW50byB0aGUgZW51bVxuX3RkKFwiTmF2aWdhdGlvblwiKTtcbl90ZChcIkNhbGxzXCIpO1xuX3RkKFwiQ29tcG9zZXJcIik7XG5fdGQoXCJSb29tIExpc3RcIik7XG5fdGQoXCJBdXRvY29tcGxldGVcIik7XG5cbmV4cG9ydCBlbnVtIENhdGVnb3JpZXMge1xuICAgIE5BVklHQVRJT04gPSBcIk5hdmlnYXRpb25cIixcbiAgICBDQUxMUyA9IFwiQ2FsbHNcIixcbiAgICBDT01QT1NFUiA9IFwiQ29tcG9zZXJcIixcbiAgICBST09NX0xJU1QgPSBcIlJvb20gTGlzdFwiLFxuICAgIFJPT00gPSBcIlJvb21cIixcbiAgICBBVVRPQ09NUExFVEUgPSBcIkF1dG9jb21wbGV0ZVwiLFxufVxuXG4vLyBUUzogb25jZSBsYW5ndWFnZUhhbmRsZXIgaXMgVFMgd2UgY2FuIHByb2JhYmx5IGlubGluZSB0aGlzIGludG8gdGhlIGVudW1cbl90ZChcIkFsdFwiKTtcbl90ZChcIkFsdCBHclwiKTtcbl90ZChcIlNoaWZ0XCIpO1xuX3RkKFwiU3VwZXJcIik7XG5fdGQoXCJDdHJsXCIpO1xuXG5leHBvcnQgZW51bSBNb2RpZmllcnMge1xuICAgIEFMVCA9IFwiQWx0XCIsIC8vIE9wdGlvbiBvbiBNYWMgYW5kIGRpc3BsYXllZCBhcyBhbiBJY29uXG4gICAgQUxUX0dSID0gXCJBbHQgR3JcIixcbiAgICBTSElGVCA9IFwiU2hpZnRcIixcbiAgICBTVVBFUiA9IFwiU3VwZXJcIiwgLy8gc2hvdWxkIHRoaXMgYmUgXCJXaW5kb3dzXCI/XG4gICAgLy8gSW5zdGVhZCBvZiB1c2luZyBiZWxvdywgY29uc2lkZXIgQ01EX09SX0NUUkxcbiAgICBDT01NQU5EID0gXCJDb21tYW5kXCIsIC8vIFRoaXMgZ2V0cyBkaXNwbGF5ZWQgYXMgYW4gSWNvblxuICAgIENPTlRST0wgPSBcIkN0cmxcIixcbn1cblxuLy8gTWV0YS1tb2RpZmllcjogaXNNYWMgPyBDTUQgOiBDT05UUk9MXG5leHBvcnQgY29uc3QgQ01EX09SX0NUUkwgPSBpc01hYyA/IE1vZGlmaWVycy5DT01NQU5EIDogTW9kaWZpZXJzLkNPTlRST0w7XG5cbmludGVyZmFjZSBJS2V5YmluZCB7XG4gICAgbW9kaWZpZXJzPzogTW9kaWZpZXJzW107XG4gICAga2V5OiBzdHJpbmc7IC8vIFRTOiBmaXggdGhpcyBvbmNlIEtleSBpcyBhbiBlbnVtXG59XG5cbmludGVyZmFjZSBJU2hvcnRjdXQge1xuICAgIGtleWJpbmRzOiBJS2V5YmluZFtdO1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG59XG5cbmNvbnN0IHNob3J0Y3V0czogUmVjb3JkPENhdGVnb3JpZXMsIElTaG9ydGN1dFtdPiA9IHtcbiAgICBbQ2F0ZWdvcmllcy5DT01QT1NFUl06IFtcbiAgICAgICAge1xuICAgICAgICAgICAga2V5YmluZHM6IFt7XG4gICAgICAgICAgICAgICAgbW9kaWZpZXJzOiBbQ01EX09SX0NUUkxdLFxuICAgICAgICAgICAgICAgIGtleTogS2V5LkIsXG4gICAgICAgICAgICB9XSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBfdGQoXCJUb2dnbGUgQm9sZFwiKSxcbiAgICAgICAgfSwge1xuICAgICAgICAgICAga2V5YmluZHM6IFt7XG4gICAgICAgICAgICAgICAgbW9kaWZpZXJzOiBbQ01EX09SX0NUUkxdLFxuICAgICAgICAgICAgICAgIGtleTogS2V5LkksXG4gICAgICAgICAgICB9XSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBfdGQoXCJUb2dnbGUgSXRhbGljc1wiKSxcbiAgICAgICAgfSwge1xuICAgICAgICAgICAga2V5YmluZHM6IFt7XG4gICAgICAgICAgICAgICAgbW9kaWZpZXJzOiBbQ01EX09SX0NUUkxdLFxuICAgICAgICAgICAgICAgIGtleTogS2V5LkdSRUFURVJfVEhBTixcbiAgICAgICAgICAgIH1dLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IF90ZChcIlRvZ2dsZSBRdW90ZVwiKSxcbiAgICAgICAgfSwge1xuICAgICAgICAgICAga2V5YmluZHM6IFt7XG4gICAgICAgICAgICAgICAgbW9kaWZpZXJzOiBbTW9kaWZpZXJzLlNISUZUXSxcbiAgICAgICAgICAgICAgICBrZXk6IEtleS5FTlRFUixcbiAgICAgICAgICAgIH1dLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IF90ZChcIk5ldyBsaW5lXCIpLFxuICAgICAgICB9LCB7XG4gICAgICAgICAgICBrZXliaW5kczogW3tcbiAgICAgICAgICAgICAgICBrZXk6IEtleS5BUlJPV19VUCxcbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBrZXk6IEtleS5BUlJPV19ET1dOLFxuICAgICAgICAgICAgfV0sXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogX3RkKFwiTmF2aWdhdGUgcmVjZW50IG1lc3NhZ2VzIHRvIGVkaXRcIiksXG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIGtleWJpbmRzOiBbe1xuICAgICAgICAgICAgICAgIG1vZGlmaWVyczogW0NNRF9PUl9DVFJMXSxcbiAgICAgICAgICAgICAgICBrZXk6IEtleS5IT01FLFxuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG1vZGlmaWVyczogW0NNRF9PUl9DVFJMXSxcbiAgICAgICAgICAgICAgICBrZXk6IEtleS5FTkQsXG4gICAgICAgICAgICB9XSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBfdGQoXCJKdW1wIHRvIHN0YXJ0L2VuZCBvZiB0aGUgY29tcG9zZXJcIiksXG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIGtleWJpbmRzOiBbe1xuICAgICAgICAgICAgICAgIG1vZGlmaWVyczogW01vZGlmaWVycy5DT05UUk9MLCBNb2RpZmllcnMuQUxUXSxcbiAgICAgICAgICAgICAgICBrZXk6IEtleS5BUlJPV19VUCxcbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBtb2RpZmllcnM6IFtNb2RpZmllcnMuQ09OVFJPTCwgTW9kaWZpZXJzLkFMVF0sXG4gICAgICAgICAgICAgICAga2V5OiBLZXkuQVJST1dfRE9XTixcbiAgICAgICAgICAgIH1dLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IF90ZChcIk5hdmlnYXRlIGNvbXBvc2VyIGhpc3RvcnlcIiksXG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIGtleWJpbmRzOiBbe1xuICAgICAgICAgICAgICAgIGtleTogS2V5LkVTQ0FQRSxcbiAgICAgICAgICAgIH1dLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IF90ZChcIkNhbmNlbCByZXBseWluZyB0byBhIG1lc3NhZ2VcIiksXG4gICAgICAgIH0sXG4gICAgXSxcblxuICAgIFtDYXRlZ29yaWVzLkNBTExTXTogW1xuICAgICAgICB7XG4gICAgICAgICAgICBrZXliaW5kczogW3tcbiAgICAgICAgICAgICAgICBtb2RpZmllcnM6IFtDTURfT1JfQ1RSTF0sXG4gICAgICAgICAgICAgICAga2V5OiBLZXkuRCxcbiAgICAgICAgICAgIH1dLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IF90ZChcIlRvZ2dsZSBtaWNyb3Bob25lIG11dGVcIiksXG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIGtleWJpbmRzOiBbe1xuICAgICAgICAgICAgICAgIG1vZGlmaWVyczogW0NNRF9PUl9DVFJMXSxcbiAgICAgICAgICAgICAgICBrZXk6IEtleS5FLFxuICAgICAgICAgICAgfV0sXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogX3RkKFwiVG9nZ2xlIHZpZGVvIG9uL29mZlwiKSxcbiAgICAgICAgfSxcbiAgICBdLFxuXG4gICAgW0NhdGVnb3JpZXMuUk9PTV06IFtcbiAgICAgICAge1xuICAgICAgICAgICAga2V5YmluZHM6IFt7XG4gICAgICAgICAgICAgICAga2V5OiBLZXkuUEFHRV9VUCxcbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBrZXk6IEtleS5QQUdFX0RPV04sXG4gICAgICAgICAgICB9XSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBfdGQoXCJTY3JvbGwgdXAvZG93biBpbiB0aGUgdGltZWxpbmVcIiksXG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIGtleWJpbmRzOiBbe1xuICAgICAgICAgICAgICAgIGtleTogS2V5LkVTQ0FQRSxcbiAgICAgICAgICAgIH1dLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IF90ZChcIkRpc21pc3MgcmVhZCBtYXJrZXIgYW5kIGp1bXAgdG8gYm90dG9tXCIpLFxuICAgICAgICB9LCB7XG4gICAgICAgICAgICBrZXliaW5kczogW3tcbiAgICAgICAgICAgICAgICBtb2RpZmllcnM6IFtNb2RpZmllcnMuU0hJRlRdLFxuICAgICAgICAgICAgICAgIGtleTogS2V5LlBBR0VfVVAsXG4gICAgICAgICAgICB9XSxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogX3RkKFwiSnVtcCB0byBvbGRlc3QgdW5yZWFkIG1lc3NhZ2VcIiksXG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIGtleWJpbmRzOiBbe1xuICAgICAgICAgICAgICAgIG1vZGlmaWVyczogW0NNRF9PUl9DVFJMLCBNb2RpZmllcnMuU0hJRlRdLFxuICAgICAgICAgICAgICAgIGtleTogS2V5LlUsXG4gICAgICAgICAgICB9XSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBfdGQoXCJVcGxvYWQgYSBmaWxlXCIpLFxuICAgICAgICB9LCB7XG4gICAgICAgICAgICBrZXliaW5kczogW3tcbiAgICAgICAgICAgICAgICBtb2RpZmllcnM6IFtDTURfT1JfQ1RSTF0sXG4gICAgICAgICAgICAgICAga2V5OiBLZXkuRixcbiAgICAgICAgICAgIH1dLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IF90ZChcIlNlYXJjaCAobXVzdCBiZSBlbmFibGVkKVwiKSxcbiAgICAgICAgfSxcbiAgICBdLFxuXG4gICAgW0NhdGVnb3JpZXMuUk9PTV9MSVNUXTogW1xuICAgICAgICB7XG4gICAgICAgICAgICBrZXliaW5kczogW3tcbiAgICAgICAgICAgICAgICBtb2RpZmllcnM6IFtDTURfT1JfQ1RSTF0sXG4gICAgICAgICAgICAgICAga2V5OiBLZXkuSyxcbiAgICAgICAgICAgIH1dLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IF90ZChcIkp1bXAgdG8gcm9vbSBzZWFyY2hcIiksXG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIGtleWJpbmRzOiBbe1xuICAgICAgICAgICAgICAgIGtleTogS2V5LkFSUk9XX1VQLFxuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIGtleTogS2V5LkFSUk9XX0RPV04sXG4gICAgICAgICAgICB9XSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBfdGQoXCJOYXZpZ2F0ZSB1cC9kb3duIGluIHRoZSByb29tIGxpc3RcIiksXG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIGtleWJpbmRzOiBbe1xuICAgICAgICAgICAgICAgIGtleTogS2V5LkVOVEVSLFxuICAgICAgICAgICAgfV0sXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogX3RkKFwiU2VsZWN0IHJvb20gZnJvbSB0aGUgcm9vbSBsaXN0XCIpLFxuICAgICAgICB9LCB7XG4gICAgICAgICAgICBrZXliaW5kczogW3tcbiAgICAgICAgICAgICAgICBrZXk6IEtleS5BUlJPV19MRUZULFxuICAgICAgICAgICAgfV0sXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogX3RkKFwiQ29sbGFwc2Ugcm9vbSBsaXN0IHNlY3Rpb25cIiksXG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIGtleWJpbmRzOiBbe1xuICAgICAgICAgICAgICAgIGtleTogS2V5LkFSUk9XX1JJR0hULFxuICAgICAgICAgICAgfV0sXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogX3RkKFwiRXhwYW5kIHJvb20gbGlzdCBzZWN0aW9uXCIpLFxuICAgICAgICB9LCB7XG4gICAgICAgICAgICBrZXliaW5kczogW3tcbiAgICAgICAgICAgICAgICBrZXk6IEtleS5FU0NBUEUsXG4gICAgICAgICAgICB9XSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBfdGQoXCJDbGVhciByb29tIGxpc3QgZmlsdGVyIGZpZWxkXCIpLFxuICAgICAgICB9LFxuICAgIF0sXG5cbiAgICBbQ2F0ZWdvcmllcy5OQVZJR0FUSU9OXTogW1xuICAgICAgICB7XG4gICAgICAgICAgICBrZXliaW5kczogW3tcbiAgICAgICAgICAgICAgICBtb2RpZmllcnM6IFtNb2RpZmllcnMuQUxULCBNb2RpZmllcnMuU0hJRlRdLFxuICAgICAgICAgICAgICAgIGtleTogS2V5LkFSUk9XX1VQLFxuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG1vZGlmaWVyczogW01vZGlmaWVycy5BTFQsIE1vZGlmaWVycy5TSElGVF0sXG4gICAgICAgICAgICAgICAga2V5OiBLZXkuQVJST1dfRE9XTixcbiAgICAgICAgICAgIH1dLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IF90ZChcIlByZXZpb3VzL25leHQgdW5yZWFkIHJvb20gb3IgRE1cIiksXG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIGtleWJpbmRzOiBbe1xuICAgICAgICAgICAgICAgIG1vZGlmaWVyczogW01vZGlmaWVycy5BTFRdLFxuICAgICAgICAgICAgICAgIGtleTogS2V5LkFSUk9XX1VQLFxuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG1vZGlmaWVyczogW01vZGlmaWVycy5BTFRdLFxuICAgICAgICAgICAgICAgIGtleTogS2V5LkFSUk9XX0RPV04sXG4gICAgICAgICAgICB9XSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBfdGQoXCJQcmV2aW91cy9uZXh0IHJvb20gb3IgRE1cIiksXG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIGtleWJpbmRzOiBbe1xuICAgICAgICAgICAgICAgIG1vZGlmaWVyczogW0NNRF9PUl9DVFJMXSxcbiAgICAgICAgICAgICAgICBrZXk6IEtleS5CQUNLVElDSyxcbiAgICAgICAgICAgIH1dLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IF90ZChcIlRvZ2dsZSB0aGUgdG9wIGxlZnQgbWVudVwiKSxcbiAgICAgICAgfSwge1xuICAgICAgICAgICAga2V5YmluZHM6IFt7XG4gICAgICAgICAgICAgICAga2V5OiBLZXkuRVNDQVBFLFxuICAgICAgICAgICAgfV0sXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogX3RkKFwiQ2xvc2UgZGlhbG9nIG9yIGNvbnRleHQgbWVudVwiKSxcbiAgICAgICAgfSwge1xuICAgICAgICAgICAga2V5YmluZHM6IFt7XG4gICAgICAgICAgICAgICAga2V5OiBLZXkuRU5URVIsXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAga2V5OiBLZXkuU1BBQ0UsXG4gICAgICAgICAgICB9XSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBfdGQoXCJBY3RpdmF0ZSBzZWxlY3RlZCBidXR0b25cIiksXG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIGtleWJpbmRzOiBbe1xuICAgICAgICAgICAgICAgIG1vZGlmaWVyczogW0NNRF9PUl9DVFJMXSxcbiAgICAgICAgICAgICAgICBrZXk6IEtleS5QRVJJT0QsXG4gICAgICAgICAgICB9XSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBfdGQoXCJUb2dnbGUgcmlnaHQgcGFuZWxcIiksXG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIGtleWJpbmRzOiBbe1xuICAgICAgICAgICAgICAgIG1vZGlmaWVyczogW0NNRF9PUl9DVFJMXSxcbiAgICAgICAgICAgICAgICBrZXk6IEtleS5TTEFTSCxcbiAgICAgICAgICAgIH1dLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IF90ZChcIlRvZ2dsZSB0aGlzIGRpYWxvZ1wiKSxcbiAgICAgICAgfSwge1xuICAgICAgICAgICAga2V5YmluZHM6IFt7XG4gICAgICAgICAgICAgICAgbW9kaWZpZXJzOiBbTW9kaWZpZXJzLkNPTlRST0wsIGlzTWFjID8gTW9kaWZpZXJzLlNISUZUIDogTW9kaWZpZXJzLkFMVF0sXG4gICAgICAgICAgICAgICAga2V5OiBLZXkuSCxcbiAgICAgICAgICAgIH1dLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IF90ZChcIkdvIHRvIEhvbWUgVmlld1wiKSxcbiAgICAgICAgfSxcbiAgICBdLFxuXG4gICAgW0NhdGVnb3JpZXMuQVVUT0NPTVBMRVRFXTogW1xuICAgICAgICB7XG4gICAgICAgICAgICBrZXliaW5kczogW3tcbiAgICAgICAgICAgICAgICBrZXk6IEtleS5BUlJPV19VUCxcbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBrZXk6IEtleS5BUlJPV19ET1dOLFxuICAgICAgICAgICAgfV0sXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogX3RkKFwiTW92ZSBhdXRvY29tcGxldGUgc2VsZWN0aW9uIHVwL2Rvd25cIiksXG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIGtleWJpbmRzOiBbe1xuICAgICAgICAgICAgICAgIGtleTogS2V5LkVTQ0FQRSxcbiAgICAgICAgICAgIH1dLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IF90ZChcIkNhbmNlbCBhdXRvY29tcGxldGVcIiksXG4gICAgICAgIH0sXG4gICAgXSxcbn07XG5cbmNvbnN0IGNhdGVnb3J5T3JkZXIgPSBbXG4gICAgQ2F0ZWdvcmllcy5DT01QT1NFUixcbiAgICBDYXRlZ29yaWVzLkFVVE9DT01QTEVURSxcbiAgICBDYXRlZ29yaWVzLlJPT00sXG4gICAgQ2F0ZWdvcmllcy5ST09NX0xJU1QsXG4gICAgQ2F0ZWdvcmllcy5OQVZJR0FUSU9OLFxuICAgIENhdGVnb3JpZXMuQ0FMTFMsXG5dO1xuXG5pbnRlcmZhY2UgSU1vZGFsIHtcbiAgICBjbG9zZTogKCkgPT4gdm9pZDtcbiAgICBmaW5pc2hlZDogUHJvbWlzZTxhbnlbXT47XG59XG5cbmNvbnN0IG1vZGlmaWVySWNvbjogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICBbTW9kaWZpZXJzLkNPTU1BTkRdOiBcIuKMmFwiLFxufTtcblxuaWYgKGlzTWFjKSB7XG4gICAgbW9kaWZpZXJJY29uW01vZGlmaWVycy5BTFRdID0gXCLijKVcIjtcbn1cblxuY29uc3QgYWx0ZXJuYXRlS2V5TmFtZTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICBbS2V5LlBBR0VfVVBdOiBfdGQoXCJQYWdlIFVwXCIpLFxuICAgIFtLZXkuUEFHRV9ET1dOXTogX3RkKFwiUGFnZSBEb3duXCIpLFxuICAgIFtLZXkuRVNDQVBFXTogX3RkKFwiRXNjXCIpLFxuICAgIFtLZXkuRU5URVJdOiBfdGQoXCJFbnRlclwiKSxcbiAgICBbS2V5LlNQQUNFXTogX3RkKFwiU3BhY2VcIiksXG4gICAgW0tleS5IT01FXTogX3RkKFwiSG9tZVwiKSxcbiAgICBbS2V5LkVORF06IF90ZChcIkVuZFwiKSxcbn07XG5jb25zdCBrZXlJY29uOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgIFtLZXkuQVJST1dfVVBdOiBcIuKGkVwiLFxuICAgIFtLZXkuQVJST1dfRE9XTl06IFwi4oaTXCIsXG4gICAgW0tleS5BUlJPV19MRUZUXTogXCLihpBcIixcbiAgICBbS2V5LkFSUk9XX1JJR0hUXTogXCLihpJcIixcbn07XG5cbmNvbnN0IFNob3J0Y3V0OiBSZWFjdC5GQzx7XG4gICAgc2hvcnRjdXQ6IElTaG9ydGN1dDtcbn0+ID0gKHtzaG9ydGN1dH0pID0+IHtcbiAgICBjb25zdCBjbGFzc2VzID0gY2xhc3NOYW1lcyh7XG4gICAgICAgIFwibXhfS2V5Ym9hcmRTaG9ydGN1dHNEaWFsb2dfaW5saW5lXCI6IHNob3J0Y3V0LmtleWJpbmRzLmV2ZXJ5KGsgPT4gIWsubW9kaWZpZXJzIHx8IGsubW9kaWZpZXJzLmxlbmd0aCA9PT0gMCksXG4gICAgfSk7XG5cbiAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9e2NsYXNzZXN9PlxuICAgICAgICA8aDU+eyBfdChzaG9ydGN1dC5kZXNjcmlwdGlvbikgfTwvaDU+XG4gICAgICAgIHsgc2hvcnRjdXQua2V5YmluZHMubWFwKHMgPT4ge1xuICAgICAgICAgICAgbGV0IHRleHQgPSBzLmtleTtcbiAgICAgICAgICAgIGlmIChhbHRlcm5hdGVLZXlOYW1lW3Mua2V5XSkge1xuICAgICAgICAgICAgICAgIHRleHQgPSBfdChhbHRlcm5hdGVLZXlOYW1lW3Mua2V5XSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGtleUljb25bcy5rZXldKSB7XG4gICAgICAgICAgICAgICAgdGV4dCA9IGtleUljb25bcy5rZXldO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gPGRpdiBrZXk9e3Mua2V5fT5cbiAgICAgICAgICAgICAgICB7IHMubW9kaWZpZXJzICYmIHMubW9kaWZpZXJzLm1hcChtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxSZWFjdC5GcmFnbWVudCBrZXk9e219PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGtiZD57IG1vZGlmaWVySWNvblttXSB8fCBfdChtKSB9PC9rYmQ+K1xuICAgICAgICAgICAgICAgICAgICA8L1JlYWN0LkZyYWdtZW50PjtcbiAgICAgICAgICAgICAgICB9KSB9XG4gICAgICAgICAgICAgICAgPGtiZD57IHRleHQgfTwva2JkPlxuICAgICAgICAgICAgPC9kaXY+O1xuICAgICAgICB9KSB9XG4gICAgPC9kaXY+O1xufTtcblxubGV0IGFjdGl2ZU1vZGFsOiBJTW9kYWwgPSBudWxsO1xuZXhwb3J0IGNvbnN0IHRvZ2dsZURpYWxvZyA9ICgpID0+IHtcbiAgICBpZiAoYWN0aXZlTW9kYWwpIHtcbiAgICAgICAgYWN0aXZlTW9kYWwuY2xvc2UoKTtcbiAgICAgICAgYWN0aXZlTW9kYWwgPSBudWxsO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2VjdGlvbnMgPSBjYXRlZ29yeU9yZGVyLm1hcChjYXRlZ29yeSA9PiB7XG4gICAgICAgIGNvbnN0IGxpc3QgPSBzaG9ydGN1dHNbY2F0ZWdvcnldO1xuICAgICAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJteF9LZXlib2FyZFNob3J0Y3V0c0RpYWxvZ19jYXRlZ29yeVwiIGtleT17Y2F0ZWdvcnl9PlxuICAgICAgICAgICAgPGgzPntfdChjYXRlZ29yeSl9PC9oMz5cbiAgICAgICAgICAgIDxkaXY+e2xpc3QubWFwKHNob3J0Y3V0ID0+IDxTaG9ydGN1dCBrZXk9e3Nob3J0Y3V0LmRlc2NyaXB0aW9ufSBzaG9ydGN1dD17c2hvcnRjdXR9IC8+KX08L2Rpdj5cbiAgICAgICAgPC9kaXY+O1xuICAgIH0pO1xuXG4gICAgY29uc3QgSW5mb0RpYWxvZyA9IHNkay5nZXRDb21wb25lbnQoJ2RpYWxvZ3MuSW5mb0RpYWxvZycpO1xuICAgIGFjdGl2ZU1vZGFsID0gTW9kYWwuY3JlYXRlVHJhY2tlZERpYWxvZyhcIktleWJvYXJkIFNob3J0Y3V0c1wiLCBcIlwiLCBJbmZvRGlhbG9nLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJteF9LZXlib2FyZFNob3J0Y3V0c0RpYWxvZ1wiLFxuICAgICAgICB0aXRsZTogX3QoXCJLZXlib2FyZCBTaG9ydGN1dHNcIiksXG4gICAgICAgIGRlc2NyaXB0aW9uOiBzZWN0aW9ucyxcbiAgICAgICAgaGFzQ2xvc2VCdXR0b246IHRydWUsXG4gICAgICAgIG9uS2V5RG93bjogKGV2KSA9PiB7XG4gICAgICAgICAgICBpZiAoZXYuY3RybEtleSAmJiAhZXYuc2hpZnRLZXkgJiYgIWV2LmFsdEtleSAmJiAhZXYubWV0YUtleSAmJiBldi5rZXkgPT09IEtleS5TTEFTSCkgeyAvLyBDdHJsICsgL1xuICAgICAgICAgICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgIGFjdGl2ZU1vZGFsLmNsb3NlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG9uRmluaXNoZWQ6ICgpID0+IHtcbiAgICAgICAgICAgIGFjdGl2ZU1vZGFsID0gbnVsbDtcbiAgICAgICAgfSxcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCByZWdpc3RlclNob3J0Y3V0ID0gKGNhdGVnb3J5OiBDYXRlZ29yaWVzLCBkZWZuOiBJU2hvcnRjdXQpID0+IHtcbiAgICBzaG9ydGN1dHNbY2F0ZWdvcnldLnB1c2goZGVmbik7XG59O1xuIl19