@zodiac-ui/editor
Version:
A rich text editor for Angular based on `@atlaskit/editor-core`.
118 lines • 18.8 kB
JavaScript
import { BLOCK_QUOTE, CODE_BLOCK, HEADING_1, HEADING_2, HEADING_3, HEADING_4, HEADING_5, HEADING_6, NORMAL_TEXT, PANEL, } from "./interfaces";
import { bindKeymapWithCommand, findKeyMapForBrowser, findShortcutByDescription, redo, undo, } from "../../lib/keymaps/keymap";
import { keymap } from "prosemirror-keymap";
import { Selection } from "prosemirror-state";
import { findWrapping } from "prosemirror-transform";
import { insertCodeBlock } from "./block-type.command";
import { redo as redoCmd, undo as undoCmd } from "prosemirror-history";
import { chainCommands } from "prosemirror-commands";
import { undoInputRule } from "prosemirror-inputrules";
const not = (fn) => (arg) => !fn(arg);
const ɵ0 = not;
const tryUndoInputRuleElseUndoHistory = chainCommands(undoInputRule, undoCmd);
export const removeBlockMarks = (state, marks) => {
// tslint:disable-next-line:no-shadowed-variable
const { selection, schema } = state;
let { tr } = state;
// Marks might not exist in Schema
const marksToRemove = marks.filter(Boolean);
if (marksToRemove.length === 0) {
return undefined;
}
/** Saves an extra dispatch */
let blockMarksExists = false;
const hasMark = (mark) => marksToRemove.indexOf(mark.type) > -1;
/**
* When you need to toggle the selection
* when another type which does not allow alignment is applied
*/
state.doc.nodesBetween(selection.from, selection.to, (node, pos) => {
if (node.type === schema.nodes.paragraph && node.marks.some(hasMark)) {
blockMarksExists = true;
const resolvedPos = state.doc.resolve(pos);
const withoutBlockMarks = node.marks.filter(not(hasMark));
tr = tr.setNodeMarkup(resolvedPos.pos, undefined, node.attrs, withoutBlockMarks);
}
});
return blockMarksExists ? tr : undefined;
};
/**
* Function will add wrapping node.
* 1. If currently selected blocks can be wrapped in the warpper type it will wrap them.
* 2. If current block can not be wrapped inside wrapping block it will create a new block below selection,
* and set selection on it.
*/
function wrapSelectionIn(type) {
return function (state, dispatch) {
let { tr } = state;
const { $from, $to } = state.selection;
const { paragraph } = state.schema.nodes;
const { alignment, indentation } = state.schema.marks;
/** Alignment or Indentation is not valid inside block types */
const removeAlignTr = removeBlockMarks(state, [alignment, indentation]);
tr = removeAlignTr || tr;
const range = $from.blockRange($to);
const wrapping = range && findWrapping(range, type);
if (range && wrapping) {
tr.wrap(range, wrapping).scrollIntoView();
}
else {
/** We always want to append a block type */
tr.replaceRangeWith($to.pos + 1, $to.pos + 1, type.createAndFill({}, paragraph.create()));
tr.setSelection(Selection.near(tr.doc.resolve(state.selection.to + 1)));
}
if (dispatch) {
dispatch(tr);
}
return true;
};
}
export function insertBlockType(name) {
return function (state, dispatch) {
const { nodes } = state.schema;
switch (name) {
case BLOCK_QUOTE.name:
if (nodes.paragraph && nodes.blockquote) {
return wrapSelectionIn(nodes.blockquote)(state, dispatch);
}
break;
case CODE_BLOCK.name:
if (nodes.codeBlock) {
return insertCodeBlock()(state, dispatch);
}
break;
case PANEL.name:
if (nodes.panel && nodes.paragraph) {
return wrapSelectionIn(nodes.panel)(state, dispatch);
}
break;
}
return false;
};
}
export function keymapPlugin(schema) {
const list = {};
const blocks = [
NORMAL_TEXT,
HEADING_1,
HEADING_2,
HEADING_3,
HEADING_4,
HEADING_5,
HEADING_6,
BLOCK_QUOTE,
];
bindKeymapWithCommand(findKeyMapForBrowser(redo), redoCmd, list);
bindKeymapWithCommand(findKeyMapForBrowser(undo), tryUndoInputRuleElseUndoHistory, list);
blocks.forEach(blockType => {
if (schema.nodes[blockType.nodeName]) {
const shortcut = findShortcutByDescription(blockType.title.defaultMessage);
if (shortcut) {
bindKeymapWithCommand(shortcut, insertBlockType(blockType.name), list);
}
}
});
return keymap(list);
}
export { ɵ0 };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5bWFwLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHpvZGlhYy11aS9lZGl0b3IvIiwic291cmNlcyI6WyJwbHVnaW5zL2Jsb2NrLXR5cGUva2V5bWFwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCxXQUFXLEVBQ1gsVUFBVSxFQUNWLFNBQVMsRUFDVCxTQUFTLEVBQ1QsU0FBUyxFQUNULFNBQVMsRUFDVCxTQUFTLEVBQ1QsU0FBUyxFQUNULFdBQVcsRUFDWCxLQUFLLEdBQ1IsTUFBTSxjQUFjLENBQUE7QUFDckIsT0FBTyxFQUNILHFCQUFxQixFQUNyQixvQkFBb0IsRUFDcEIseUJBQXlCLEVBQ3pCLElBQUksRUFDSixJQUFJLEdBQ1AsTUFBTSwwQkFBMEIsQ0FBQTtBQUNqQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sb0JBQW9CLENBQUE7QUFFM0MsT0FBTyxFQUFlLFNBQVMsRUFBZSxNQUFNLG1CQUFtQixDQUFBO0FBQ3ZFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQTtBQUVwRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sc0JBQXNCLENBQUE7QUFDdEQsT0FBTyxFQUFFLElBQUksSUFBSSxPQUFPLEVBQUUsSUFBSSxJQUFJLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFBO0FBQ3RFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQTtBQUNwRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUE7QUFzQnRELE1BQU0sR0FBRyxHQUFHLENBQUksRUFBMEIsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFBOztBQUNuRSxNQUFNLCtCQUErQixHQUFHLGFBQWEsQ0FBQyxhQUFhLEVBQUUsT0FBTyxDQUFDLENBQUE7QUFFN0UsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsQ0FDNUIsS0FBa0IsRUFD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QTtJQUNoQixDQUFDLENBQUE7QUFDTCxDQUFDO0FBRUQsTUFBTSxVQUFVLFlBQVksQ0FBQyxNQUFjO0lBQ3ZDLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQTtJQUNmLE1BQU0sTUFBTSxHQUFHO1FBQ1gsV0FBVztRQUNYLFNBQVM7UUFDVCxTQUFTO1FBQ1QsU0FBUztRQUNULFNBQVM7UUFDVCxTQUFTO1FBQ1QsU0FBUztRQUNULFdBQVc7S0FDZCxDQUFBO0lBRUQscUJBQXFCLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFBO0lBQ2hFLHFCQUFxQixDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxFQUFFLCtCQUErQixFQUFFLElBQUksQ0FBQyxDQUFBO0lBRXhGLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUU7UUFDdkIsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUNsQyxNQUFNLFFBQVEsR0FBRyx5QkFBeUIsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFBO1lBRTFFLElBQUksUUFBUSxFQUFFO2dCQUNWLHFCQUFxQixDQUFDLFFBQVEsRUFBRSxlQUFlLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFBO2FBQ3pFO1NBQ0o7SUFDTCxDQUFDLENBQUMsQ0FBQTtJQUVGLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFBO0FBQ3ZCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gICAgQkxPQ0tfUVVPVEUsXHJcbiAgICBDT0RFX0JMT0NLLFxyXG4gICAgSEVBRElOR18xLFxyXG4gICAgSEVBRElOR18yLFxyXG4gICAgSEVBRElOR18zLFxyXG4gICAgSEVBRElOR180LFxyXG4gICAgSEVBRElOR181LFxyXG4gICAgSEVBRElOR182LFxyXG4gICAgTk9STUFMX1RFWFQsXHJcbiAgICBQQU5FTCxcclxufSBmcm9tIFwiLi9pbnRlcmZhY2VzXCJcclxuaW1wb3J0IHtcclxuICAgIGJpbmRLZXltYXBXaXRoQ29tbWFuZCxcclxuICAgIGZpbmRLZXlNYXBGb3JCcm93c2VyLFxyXG4gICAgZmluZFNob3J0Y3V0QnlEZXNjcmlwdGlvbixcclxuICAgIHJlZG8sXHJcbiAgICB1bmRvLFxyXG59IGZyb20gXCIuLi8uLi9saWIva2V5bWFwcy9rZXltYXBcIlxyXG5pbXBvcnQgeyBrZXltYXAgfSBmcm9tIFwicHJvc2VtaXJyb3Ita2V5bWFwXCJcclxuaW1wb3J0IHsgQ29tbWFuZCB9IGZyb20gXCIuLi8uLi9saWIvaW50ZXJmYWNlcy9jb21tYW5kXCJcclxuaW1wb3J0IHsgRWRpdG9yU3RhdGUsIFNlbGVjdGlvbiwgVHJhbnNhY3Rpb24gfSBmcm9tIFwicHJvc2VtaXJyb3Itc3RhdGVcIlxyXG5pbXBvcnQgeyBmaW5kV3JhcHBpbmcgfSBmcm9tIFwicHJvc2VtaXJyb3ItdHJhbnNmb3JtXCJcclxuaW1wb3J0IHsgTWFyaywgTWFya1R5cGUsIFNjaGVtYSB9IGZyb20gXCJwcm9zZW1pcnJvci1tb2RlbFwiXHJcbmltcG9ydCB7IGluc2VydENvZGVCbG9jayB9IGZyb20gXCIuL2Jsb2NrLXR5cGUuY29tbWFuZFwiXHJcbmltcG9ydCB7IHJlZG8gYXMgcmVkb0NtZCwgdW5kbyBhcyB1bmRvQ21kIH0gZnJvbSBcInByb3NlbWlycm9yLWhpc3RvcnlcIlxyXG5pbXBvcnQgeyBjaGFpbkNvbW1hbmRzIH0gZnJvbSBcInByb3NlbWlycm9yLWNvbW1hbmRzXCJcclxuaW1wb3J0IHsgdW5kb0lucHV0UnVsZSB9IGZyb20gXCJwcm9zZW1pcnJvci1pbnB1dHJ1bGVzXCJcclxuXHJcbmV4cG9ydCBjb25zdCBlbnVtIElOUFVUX01FVEhPRCB7XHJcbiAgICBBU0NJSSA9IFwiYXNjaWlcIixcclxuICAgIEFVVE8gPSBcImF1dG9cIixcclxuICAgIEFVVE9fREVURUNUID0gXCJhdXRvRGV0ZWN0XCIsXHJcbiAgICBDTElQQk9BUkQgPSBcImNsaXBib2FyZFwiLFxyXG4gICAgRFJBR19BTkRfRFJPUCA9IFwiZHJhZ0FuZERyb3BcIixcclxuICAgIEVYVEVSTkFMID0gXCJleHRlcm5hbFwiLFxyXG4gICAgRk9STUFUVElORyA9IFwiYXV0b2Zvcm1hdHRpbmdcIixcclxuICAgIEZMT0FUSU5HX1RCID0gXCJmbG9hdGluZ1Rvb2xiYXJcIixcclxuICAgIEtFWUJPQVJEID0gXCJrZXlib2FyZFwiLFxyXG4gICAgSU5TRVJUX01FTlUgPSBcImluc2VydE1lbnVcIixcclxuICAgIE1BTlVBTCA9IFwibWFudWFsXCIsXHJcbiAgICBQSUNLRVIgPSBcInBpY2tlclwiLFxyXG4gICAgUElDS0VSX0NMT1VEID0gXCJjbG91ZFBpY2tlclwiLFxyXG4gICAgUVVJQ0tfSU5TRVJUID0gXCJxdWlja0luc2VydFwiLFxyXG4gICAgU0hPUlRDVVQgPSBcInNob3J0Y3V0XCIsXHJcbiAgICBUT09MQkFSID0gXCJ0b29sYmFyXCIsXHJcbiAgICBUWVBFQUhFQUQgPSBcInR5cGVBaGVhZFwiLFxyXG59XHJcblxyXG5jb25zdCBub3QgPSA8VD4oZm46ICgoYXJnczogVCkgPT4gYm9vbGVhbikpID0+IChhcmc6IFQpID0+ICFmbihhcmcpXHJcbmNvbnN0IHRyeVVuZG9JbnB1dFJ1bGVFbHNlVW5kb0hpc3RvcnkgPSBjaGFpbkNvbW1hbmRzKHVuZG9JbnB1dFJ1bGUsIHVuZG9DbWQpXHJcblxyXG5leHBvcnQgY29uc3QgcmVtb3ZlQmxvY2tNYXJrcyA9IChcclxuICAgIHN0YXRlOiBFZGl0b3JTdGF0ZSxcclxuICAgIG1hcmtzOiBBcnJheTxNYXJrVHlwZSB8IHVuZGVmaW5lZD4sXHJcbik6IFRyYW5zYWN0aW9uIHwgdW5kZWZpbmVkID0+IHtcclxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1zaGFkb3dlZC12YXJpYWJsZVxyXG4gICAgY29uc3QgeyBzZWxlY3Rpb24sIHNjaGVtYSB9ID0gc3RhdGVcclxuICAgIGxldCB7IHRyIH0gPSBzdGF0ZVxyXG5cclxuICAgIC8vIE1hcmtzIG1pZ2h0IG5vdCBleGlzdCBpbiBTY2hlbWFcclxuICAgIGNvbnN0IG1hcmtzVG9SZW1vdmUgPSBtYXJrcy5maWx0ZXIoQm9vbGVhbilcclxuICAgIGlmIChtYXJrc1RvUmVtb3ZlLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgIHJldHVybiB1bmRlZmluZWRcclxuICAgIH1cclxuXHJcbiAgICAvKiogU2F2ZXMgYW4gZXh0cmEgZGlzcGF0Y2ggKi9cclxuICAgIGxldCBibG9ja01hcmtzRXhpc3RzID0gZmFsc2VcclxuXHJcbiAgICBjb25zdCBoYXNNYXJrID0gKG1hcms6IE1hcmspID0+IG1hcmtzVG9SZW1vdmUuaW5kZXhPZihtYXJrLnR5cGUpID4gLTFcclxuICAgIC8qKlxyXG4gICAgICogV2hlbiB5b3UgbmVlZCB0byB0b2dnbGUgdGhlIHNlbGVjdGlvblxyXG4gICAgICogd2hlbiBhbm90aGVyIHR5cGUgd2hpY2ggZG9lcyBub3QgYWxsb3cgYWxpZ25tZW50IGlzIGFwcGxpZWRcclxuICAgICAqL1xyXG4gICAgc3RhdGUuZG9jLm5vZGVzQmV0d2VlbihzZWxlY3Rpb24uZnJvbSwgc2VsZWN0aW9uLnRvLCAobm9kZSwgcG9zKSA9PiB7XHJcbiAgICAgICAgaWYgKG5vZGUudHlwZSA9PT0gc2NoZW1hLm5vZGVzLnBhcmFncmFwaCAmJiBub2RlLm1hcmtzLnNvbWUoaGFzTWFyaykpIHtcclxuICAgICAgICAgICAgYmxvY2tNYXJrc0V4aXN0cyA9IHRydWVcclxuICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWRQb3MgPSBzdGF0ZS5kb2MucmVzb2x2ZShwb3MpXHJcbiAgICAgICAgICAgIGNvbnN0IHdpdGhvdXRCbG9ja01hcmtzID0gbm9kZS5tYXJrcy5maWx0ZXIobm90KGhhc01hcmspKVxyXG4gICAgICAgICAgICB0ciA9IHRyLnNldE5vZGVNYXJrdXAocmVzb2x2ZWRQb3MucG9zLCB1bmRlZmluZWQsIG5vZGUuYXR0cnMsIHdpdGhvdXRCbG9ja01hcmtzKVxyXG4gICAgICAgIH1cclxuICAgIH0pXHJcbiAgICByZXR1cm4gYmxvY2tNYXJrc0V4aXN0cyA/IHRyIDogdW5kZWZpbmVkXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBGdW5jdGlvbiB3aWxsIGFkZCB3cmFwcGluZyBub2RlLlxyXG4gKiAxLiBJZiBjdXJyZW50bHkgc2VsZWN0ZWQgYmxvY2tzIGNhbiBiZSB3cmFwcGVkIGluIHRoZSB3YXJwcGVyIHR5cGUgaXQgd2lsbCB3cmFwIHRoZW0uXHJcbiAqIDIuIElmIGN1cnJlbnQgYmxvY2sgY2FuIG5vdCBiZSB3cmFwcGVkIGluc2lkZSB3cmFwcGluZyBibG9jayBpdCB3aWxsIGNyZWF0ZSBhIG5ldyBibG9jayBiZWxvdyBzZWxlY3Rpb24sXHJcbiAqICBhbmQgc2V0IHNlbGVjdGlvbiBvbiBpdC5cclxuICovXHJcbmZ1bmN0aW9uIHdyYXBTZWxlY3Rpb25Jbih0eXBlKTogQ29tbWFuZCB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24oc3RhdGU6IEVkaXRvclN0YXRlLCBkaXNwYXRjaCkge1xyXG4gICAgICAgIGxldCB7IHRyIH0gPSBzdGF0ZVxyXG4gICAgICAgIGNvbnN0IHsgJGZyb20sICR0byB9ID0gc3RhdGUuc2VsZWN0aW9uXHJcbiAgICAgICAgY29uc3QgeyBwYXJhZ3JhcGggfSA9IHN0YXRlLnNjaGVtYS5ub2Rlc1xyXG4gICAgICAgIGNvbnN0IHsgYWxpZ25tZW50LCBpbmRlbnRhdGlvbiB9ID0gc3RhdGUuc2NoZW1hLm1hcmtzXHJcblxyXG4gICAgICAgIC8qKiBBbGlnbm1lbnQgb3IgSW5kZW50YXRpb24gaXMgbm90IHZhbGlkIGluc2lkZSBibG9jayB0eXBlcyAqL1xyXG4gICAgICAgIGNvbnN0IHJlbW92ZUFsaWduVHIgPSByZW1vdmVCbG9ja01hcmtzKHN0YXRlLCBbYWxpZ25tZW50LCBpbmRlbnRhdGlvbl0pXHJcbiAgICAgICAgdHIgPSByZW1vdmVBbGlnblRyIHx8IHRyXHJcblxyXG4gICAgICAgIGNvbnN0IHJhbmdlID0gJGZyb20uYmxvY2tSYW5nZSgkdG8pIGFzIGFueVxyXG4gICAgICAgIGNvbnN0IHdyYXBwaW5nID0gcmFuZ2UgJiYgKGZpbmRXcmFwcGluZyhyYW5nZSwgdHlwZSkgYXMgYW55KVxyXG4gICAgICAgIGlmIChyYW5nZSAmJiB3cmFwcGluZykge1xyXG4gICAgICAgICAgICB0ci53cmFwKHJhbmdlLCB3cmFwcGluZykuc2Nyb2xsSW50b1ZpZXcoKVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8qKiBXZSBhbHdheXMgd2FudCB0byBhcHBlbmQgYSBibG9jayB0eXBlICovXHJcbiAgICAgICAgICAgIHRyLnJlcGxhY2VSYW5nZVdpdGgoXHJcbiAgICAgICAgICAgICAgICAkdG8ucG9zICsgMSxcclxuICAgICAgICAgICAgICAgICR0by5wb3MgKyAxLFxyXG4gICAgICAgICAgICAgICAgdHlwZS5jcmVhdGVBbmRGaWxsKHt9LCBwYXJhZ3JhcGguY3JlYXRlKCkpLFxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICAgIHRyLnNldFNlbGVjdGlvbihTZWxlY3Rpb24ubmVhcih0ci5kb2MucmVzb2x2ZShzdGF0ZS5zZWxlY3Rpb24udG8gKyAxKSkpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChkaXNwYXRjaCkge1xyXG4gICAgICAgICAgICBkaXNwYXRjaCh0cilcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWVcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGluc2VydEJsb2NrVHlwZShuYW1lOiBzdHJpbmcpOiBDb21tYW5kIHtcclxuICAgIHJldHVybiBmdW5jdGlvbihzdGF0ZSwgZGlzcGF0Y2gpIHtcclxuICAgICAgICBjb25zdCB7IG5vZGVzIH0gPSBzdGF0ZS5zY2hlbWFcclxuXHJcbiAgICAgICAgc3dpdGNoIChuYW1lKSB7XHJcbiAgICAgICAgICAgIGNhc2UgQkxPQ0tfUVVPVEUubmFtZTpcclxuICAgICAgICAgICAgICAgIGlmIChub2Rlcy5wYXJhZ3JhcGggJiYgbm9kZXMuYmxvY2txdW90ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB3cmFwU2VsZWN0aW9uSW4obm9kZXMuYmxvY2txdW90ZSkoc3RhdGUsIGRpc3BhdGNoKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgY2FzZSBDT0RFX0JMT0NLLm5hbWU6XHJcbiAgICAgICAgICAgICAgICBpZiAobm9kZXMuY29kZUJsb2NrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGluc2VydENvZGVCbG9jaygpKHN0YXRlLCBkaXNwYXRjaClcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgIGNhc2UgUEFORUwubmFtZTpcclxuICAgICAgICAgICAgICAgIGlmIChub2Rlcy5wYW5lbCAmJiBub2Rlcy5wYXJhZ3JhcGgpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gd3JhcFNlbGVjdGlvbkluKG5vZGVzLnBhbmVsKShzdGF0ZSwgZGlzcGF0Y2gpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlXHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBrZXltYXBQbHVnaW4oc2NoZW1hOiBTY2hlbWEpIHtcclxuICAgIGNvbnN0IGxpc3QgPSB7fVxyXG4gICAgY29uc3QgYmxvY2tzID0gW1xyXG4gICAgICAgIE5PUk1BTF9URVhULFxyXG4gICAgICAgIEhFQURJTkdfMSxcclxuICAgICAgICBIRUFESU5HXzIsXHJcbiAgICAgICAgSEVBRElOR18zLFxyXG4gICAgICAgIEhFQURJTkdfNCxcclxuICAgICAgICBIRUFESU5HXzUsXHJcbiAgICAgICAgSEVBRElOR182LFxyXG4gICAgICAgIEJMT0NLX1FVT1RFLFxyXG4gICAgXVxyXG5cclxuICAgIGJpbmRLZXltYXBXaXRoQ29tbWFuZChmaW5kS2V5TWFwRm9yQnJvd3NlcihyZWRvKSwgcmVkb0NtZCwgbGlzdClcclxuICAgIGJpbmRLZXltYXBXaXRoQ29tbWFuZChmaW5kS2V5TWFwRm9yQnJvd3Nlcih1bmRvKSwgdHJ5VW5kb0lucHV0UnVsZUVsc2VVbmRvSGlzdG9yeSwgbGlzdClcclxuXHJcbiAgICBibG9ja3MuZm9yRWFjaChibG9ja1R5cGUgPT4ge1xyXG4gICAgICAgIGlmIChzY2hlbWEubm9kZXNbYmxvY2tUeXBlLm5vZGVOYW1lXSkge1xyXG4gICAgICAgICAgICBjb25zdCBzaG9ydGN1dCA9IGZpbmRTaG9ydGN1dEJ5RGVzY3JpcHRpb24oYmxvY2tUeXBlLnRpdGxlLmRlZmF1bHRNZXNzYWdlKVxyXG5cclxuICAgICAgICAgICAgaWYgKHNob3J0Y3V0KSB7XHJcbiAgICAgICAgICAgICAgICBiaW5kS2V5bWFwV2l0aENvbW1hbmQoc2hvcnRjdXQsIGluc2VydEJsb2NrVHlwZShibG9ja1R5cGUubmFtZSksIGxpc3QpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9KVxyXG5cclxuICAgIHJldHVybiBrZXltYXAobGlzdClcclxufVxyXG4iXX0=