ngx-editor
Version:
Rich Text Editor for angular using ProseMirror
240 lines • 21.1 kB
JavaScript
import * as sl from 'prosemirror-schema-list';
import { toStyleString } from 'ngx-editor/utils';
const doc = {
content: 'block+'
};
// :: NodeSpec The text node.
const text = {
group: 'inline'
};
// :: NodeSpec A plain paragraph textblock. Represented in the DOM
// as a `<p>` element.
const paragraph = {
content: 'inline*',
group: 'block',
attrs: {
align: {
default: null,
}
},
parseDOM: [
{
tag: 'p',
getAttrs(dom) {
const { textAlign } = dom.style;
const align = dom.getAttribute('align') || textAlign || null;
return {
align
};
}
}
],
toDOM(node) {
const { align } = node.attrs;
const styles = {
textAlign: align !== 'left' ? align : null
};
const style = toStyleString(styles) || null;
return ['p', { style }, 0];
}
};
// :: NodeSpec A blockquote (`<blockquote>`) wrapping one or more blocks.
const blockquote = {
content: 'block+',
group: 'block',
defining: true,
parseDOM: [{ tag: 'blockquote' }],
toDOM() {
return ['blockquote', 0];
}
};
// :: NodeSpec A horizontal rule (`<hr>`).
const horizontalRule = {
group: 'block',
parseDOM: [{ tag: 'hr' }],
toDOM() {
return ['hr'];
}
};
// :: NodeSpec A heading textblock, with a `level` attribute that
// should hold the number 1 to 6. Parsed and serialized as `<h1>` to
// `<h6>` elements.
const heading = {
attrs: {
level: {
default: 1
},
align: {
default: null,
}
},
content: 'inline*',
group: 'block',
defining: true,
parseDOM: [
{
tag: 'h1',
getAttrs(dom) {
const { textAlign } = dom.style;
const align = dom.getAttribute('align') || textAlign || null;
return {
level: 1,
align
};
}
},
{
tag: 'h2',
getAttrs(dom) {
const { textAlign } = dom.style;
const align = dom.getAttribute('align') || textAlign || null;
return {
level: 2,
align
};
}
},
{
tag: 'h3',
getAttrs(dom) {
const { textAlign } = dom.style;
const align = dom.getAttribute('align') || textAlign || null;
return {
level: 3,
align
};
}
},
{
tag: 'h4',
getAttrs(dom) {
const { textAlign } = dom.style;
const align = dom.getAttribute('align') || textAlign || null;
return {
level: 4,
align
};
}
},
{
tag: 'h5',
getAttrs(dom) {
const { textAlign } = dom.style;
const align = dom.getAttribute('align') || textAlign || null;
return {
level: 5,
align
};
}
},
{
tag: 'h6',
getAttrs(dom) {
const { textAlign } = dom.style;
const align = dom.getAttribute('align') || textAlign || null;
return {
level: 6,
align
};
}
},
],
toDOM(node) {
const { level, align } = node.attrs;
const styles = {
textAlign: align !== 'left' ? align : null
};
const style = toStyleString(styles) || null;
return ['h' + level, { style }, 0];
}
};
// :: NodeSpec A code listing. Disallows marks or non-text inline
// nodes by default. Represented as a `<pre>` element with a
// `<code>` element inside of it.
const codeBlock = {
content: 'text*',
marks: '',
group: 'block',
code: true,
defining: true,
parseDOM: [
{
tag: 'pre',
preserveWhitespace: 'full'
}
],
toDOM() {
return ['pre', ['code', 0]];
}
};
// :: NodeSpec A hard line break, represented in the DOM as `<br>`.
const hardBreak = {
inline: true,
group: 'inline',
selectable: false,
parseDOM: [{ tag: 'br' }],
toDOM() {
return ['br'];
}
};
// :: NodeSpec An inline image (`<img>`) node. Supports `src`,
// `alt`, and `href` attributes. The latter two default to the empty
// string.
export const image = {
inline: true,
attrs: {
src: {},
alt: { default: null },
title: { default: null },
width: { default: null }
},
group: 'inline',
draggable: true,
parseDOM: [
{
tag: 'img[src]',
getAttrs(dom) {
return {
src: dom.getAttribute('src'),
title: dom.getAttribute('title'),
alt: dom.getAttribute('alt'),
width: dom.getAttribute('width')
};
}
}
],
toDOM(node) {
const { src, alt, title, width } = node.attrs;
return ['img', { src, alt, title, width }];
}
};
const listItem = {
...sl.listItem,
content: 'paragraph block*'
};
const orderedList = {
...sl.orderedList,
content: 'list_item+',
group: 'block'
};
const bulletList = {
...sl.bulletList,
content: 'list_item+',
group: 'block'
};
const nodes = {
doc,
text,
paragraph,
blockquote,
horizontal_rule: horizontalRule,
heading,
hard_break: hardBreak,
code_block: codeBlock,
image,
list_item: listItem,
ordered_list: orderedList,
bullet_list: bulletList
};
export default nodes;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtZWRpdG9yL3NjaGVtYS9ub2Rlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEtBQUssRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRTlDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUVqRCxNQUFNLEdBQUcsR0FBYTtJQUNwQixPQUFPLEVBQUUsUUFBUTtDQUNsQixDQUFDO0FBRUYsNkJBQTZCO0FBQzdCLE1BQU0sSUFBSSxHQUFhO0lBQ3JCLEtBQUssRUFBRSxRQUFRO0NBQ2hCLENBQUM7QUFFRixrRUFBa0U7QUFDbEUsc0JBQXNCO0FBQ3RCLE1BQU0sU0FBUyxHQUFhO0lBQzFCLE9BQU8sRUFBRSxTQUFTO0lBQ2xCLEtBQUssRUFBRSxPQUFPO0lBQ2QsS0FBSyxFQUFFO1FBQ0wsS0FBSyxFQUFFO1lBQ0wsT0FBTyxFQUFFLElBQUk7U0FDZDtLQUNGO0lBQ0QsUUFBUSxFQUFFO1FBQ1I7WUFDRSxHQUFHLEVBQUUsR0FBRztZQUNSLFFBQVEsQ0FBQyxHQUFnQjtnQkFDdkIsTUFBTSxFQUFFLFNBQVMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUM7Z0JBQ2hDLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksU0FBUyxJQUFJLElBQUksQ0FBQztnQkFFN0QsT0FBTztvQkFDTCxLQUFLO2lCQUNOLENBQUM7WUFDSixDQUFDO1NBQ0Y7S0FDRjtJQUNELEtBQUssQ0FBQyxJQUFJO1FBQ1IsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFFN0IsTUFBTSxNQUFNLEdBQWlDO1lBQzNDLFNBQVMsRUFBRSxLQUFLLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUk7U0FDM0MsQ0FBQztRQUNG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S0FBSyxFQUFFLEdBQUcsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDO2lCQUNqQyxDQUFDO1lBQ0osQ0FBQztTQUNGO0tBQ0Y7SUFDRCxLQUFLLENBQUMsSUFBcUI7UUFDekIsTUFBTSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDOUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDN0MsQ0FBQztDQUNGLENBQUM7QUFFRixNQUFNLFFBQVEsR0FBRztJQUNmLEdBQUcsRUFBRSxDQUFDLFFBQVE7SUFDZCxPQUFPLEVBQUUsa0JBQWtCO0NBQzVCLENBQUM7QUFFRixNQUFNLFdBQVcsR0FBRztJQUNsQixHQUFHLEVBQUUsQ0FBQyxXQUFXO0lBQ2pCLE9BQU8sRUFBRSxZQUFZO0lBQ3JCLEtBQUssRUFBRSxPQUFPO0NBQ2YsQ0FBQztBQUVGLE1BQU0sVUFBVSxHQUFHO0lBQ2pCLEdBQUcsRUFBRSxDQUFDLFVBQVU7SUFDaEIsT0FBTyxFQUFFLFlBQVk7SUFDckIsS0FBSyxFQUFFLE9BQU87Q0FDZixDQUFDO0FBRUYsTUFBTSxLQUFLLEdBQUc7SUFDWixHQUFHO0lBQ0gsSUFBSTtJQUNKLFNBQVM7SUFDVCxVQUFVO0lBQ1YsZUFBZSxFQUFFLGNBQWM7SUFDL0IsT0FBTztJQUNQLFVBQVUsRUFBRSxTQUFTO0lBQ3JCLFVBQVUsRUFBRSxTQUFTO0lBQ3JCLEtBQUs7SUFDTCxTQUFTLEVBQUUsUUFBUTtJQUNuQixZQUFZLEVBQUUsV0FBVztJQUN6QixXQUFXLEVBQUUsVUFBVTtDQUN4QixDQUFDO0FBRUYsZUFBZSxLQUFLLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBET01PdXRwdXRTcGVjLCBOb2RlIGFzIFByb3NlTWlycm9yTm9kZSwgTm9kZVNwZWMgfSBmcm9tICdwcm9zZW1pcnJvci1tb2RlbCc7XG5pbXBvcnQgKiBhcyBzbCBmcm9tICdwcm9zZW1pcnJvci1zY2hlbWEtbGlzdCc7XG5cbmltcG9ydCB7IHRvU3R5bGVTdHJpbmcgfSBmcm9tICduZ3gtZWRpdG9yL3V0aWxzJztcblxuY29uc3QgZG9jOiBOb2RlU3BlYyA9IHtcbiAgY29udGVudDogJ2Jsb2NrKydcbn07XG5cbi8vIDo6IE5vZGVTcGVjIFRoZSB0ZXh0IG5vZGUuXG5jb25zdCB0ZXh0OiBOb2RlU3BlYyA9IHtcbiAgZ3JvdXA6ICdpbmxpbmUnXG59O1xuXG4vLyA6OiBOb2RlU3BlYyBBIHBsYWluIHBhcmFncmFwaCB0ZXh0YmxvY2suIFJlcHJlc2VudGVkIGluIHRoZSBET01cbi8vIGFzIGEgYDxwPmAgZWxlbWVudC5cbmNvbnN0IHBhcmFncmFwaDogTm9kZVNwZWMgPSB7XG4gIGNvbnRlbnQ6ICdpbmxpbmUqJyxcbiAgZ3JvdXA6ICdibG9jaycsXG4gIGF0dHJzOiB7XG4gICAgYWxpZ246IHtcbiAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgfVxuICB9LFxuICBwYXJzZURPTTogW1xuICAgIHtcbiAgICAgIHRhZzogJ3AnLFxuICAgICAgZ2V0QXR0cnMoZG9tOiBIVE1MRWxlbWVudCk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgICAgICBjb25zdCB7IHRleHRBbGlnbiB9ID0gZG9tLnN0eWxlO1xuICAgICAgICBjb25zdCBhbGlnbiA9IGRvbS5nZXRBdHRyaWJ1dGUoJ2FsaWduJykgfHwgdGV4dEFsaWduIHx8IG51bGw7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBhbGlnblxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgXSxcbiAgdG9ET00obm9kZSk6IERPTU91dHB1dFNwZWMge1xuICAgIGNvbnN0IHsgYWxpZ24gfSA9IG5vZGUuYXR0cnM7XG5cbiAgICBjb25zdCBzdHlsZXM6IFBhcnRpYWw8Q1NTU3R5bGVEZWNsYXJhdGlvbj4gPSB7XG4gICAgICB0ZXh0QWxpZ246IGFsaWduICE9PSAnbGVmdCcgPyBhbGlnbiA6IG51bGxcbiAgICB9O1xuICAgIGNvbnN0IHN0eWxlID0gdG9TdHlsZVN0cmluZyhzdHlsZXMpIHx8IG51bGw7XG5cbiAgICByZXR1cm4gWydwJywgeyBzdHlsZSB9LCAwXTtcbiAgfVxufTtcblxuLy8gOjogTm9kZVNwZWMgQSBibG9ja3F1b3RlIChgPGJsb2NrcXVvdGU+YCkgd3JhcHBpbmcgb25lIG9yIG1vcmUgYmxvY2tzLlxuY29uc3QgYmxvY2txdW90ZTogTm9kZVNwZWMgPSB7XG4gIGNvbnRlbnQ6ICdibG9jaysnLFxuICBncm91cDogJ2Jsb2NrJyxcbiAgZGVmaW5pbmc6IHRydWUsXG4gIHBhcnNlRE9NOiBbeyB0YWc6ICdibG9ja3F1b3RlJyB9XSxcbiAgdG9ET00oKTogRE9NT3V0cHV0U3BlYyB7XG4gICAgcmV0dXJuIFsnYmxvY2txdW90ZScsIDBdO1xuICB9XG59O1xuXG4vLyA6OiBOb2RlU3BlYyBBIGhvcml6b250YWwgcnVsZSAoYDxocj5gKS5cbmNvbnN0IGhvcml6b250YWxSdWxlOiBOb2RlU3BlYyA9IHtcbiAgZ3JvdXA6ICdibG9jaycsXG4gIHBhcnNlRE9NOiBbeyB0YWc6ICdocicgfV0sXG4gIHRvRE9NKCk6IERPTU91dHB1dFNwZWMge1xuICAgIHJldHVybiBbJ2hyJ107XG4gIH1cbn07XG5cbi8vIDo6IE5vZGVTcGVjIEEgaGVhZGluZyB0ZXh0YmxvY2ssIHdpdGggYSBgbGV2ZWxgIGF0dHJpYnV0ZSB0aGF0XG4vLyBzaG91bGQgaG9sZCB0aGUgbnVtYmVyIDEgdG8gNi4gUGFyc2VkIGFuZCBzZXJpYWxpemVkIGFzIGA8aDE+YCB0b1xuLy8gYDxoNj5gIGVsZW1lbnRzLlxuY29uc3QgaGVhZGluZzogTm9kZVNwZWMgPSB7XG4gIGF0dHJzOiB7XG4gICAgbGV2ZWw6IHtcbiAgICAgIGRlZmF1bHQ6IDFcbiAgICB9LFxuICAgIGFsaWduOiB7XG4gICAgICBkZWZhdWx0OiBudWxsLFxuICAgIH1cbiAgfSxcbiAgY29udGVudDogJ2lubGluZSonLFxuICBncm91cDogJ2Jsb2NrJyxcbiAgZGVmaW5pbmc6IHRydWUsXG4gIHBhcnNlRE9NOiBbXG4gICAge1xuICAgICAgdGFnOiAnaDEnLFxuICAgICAgZ2V0QXR0cnMoZG9tOiBIVE1MRWxlbWVudCk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgICAgICBjb25zdCB7IHRleHRBbGlnbiB9ID0gZG9tLnN0eWxlO1xuICAgICAgICBjb25zdCBhbGlnbiA9IGRvbS5nZXRBdHRyaWJ1dGUoJ2FsaWduJykgfHwgdGV4dEFsaWduIHx8IG51bGw7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBsZXZlbDogMSxcbiAgICAgICAgICBhbGlnblxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0sXG4gICAge1xuICAgICAgdGFnOiAnaDInLFxuICAgICAgZ2V0QXR0cnMoZG9tOiBIVE1MRWxlbWVudCk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgICAgICBjb25zdCB7IHRleHRBbGlnbiB9ID0gZG9tLnN0eWxlO1xuICAgICAgICBjb25zdCBhbGlnbiA9IGRvbS5nZXRBdHRyaWJ1dGUoJ2FsaWduJykgfHwgdGV4dEFsaWduIHx8IG51bGw7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBsZXZlbDogMixcbiAgICAgICAgICBhbGlnblxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0sXG4gICAge1xuICAgICAgdGFnOiAnaDMnLFxuICAgICAgZ2V0QXR0cnMoZG9tOiBIVE1MRWxlbWVudCk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgICAgICBjb25zdCB7IHRleHRBbGlnbiB9ID0gZG9tLnN0eWxlO1xuICAgICAgICBjb25zdCBhbGlnbiA9IGRvbS5nZXRBdHRyaWJ1dGUoJ2FsaWduJykgfHwgdGV4dEFsaWduIHx8IG51bGw7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBsZXZlbDogMyxcbiAgICAgICAgICBhbGlnblxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0sXG4gICAge1xuICAgICAgdGFnOiAnaDQnLFxuICAgICAgZ2V0QXR0cnMoZG9tOiBIVE1MRWxlbWVudCk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgICAgICBjb25zdCB7IHRleHRBbGlnbiB9ID0gZG9tLnN0eWxlO1xuICAgICAgICBjb25zdCBhbGlnbiA9IGRvbS5nZXRBdHRyaWJ1dGUoJ2FsaWduJykgfHwgdGV4dEFsaWduIHx8IG51bGw7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBsZXZlbDogNCxcbiAgICAgICAgICBhbGlnblxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0sXG4gICAge1xuICAgICAgdGFnOiAnaDUnLFxuICAgICAgZ2V0QXR0cnMoZG9tOiBIVE1MRWxlbWVudCk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgICAgICBjb25zdCB7IHRleHRBbGlnbiB9ID0gZG9tLnN0eWxlO1xuICAgICAgICBjb25zdCBhbGlnbiA9IGRvbS5nZXRBdHRyaWJ1dGUoJ2FsaWduJykgfHwgdGV4dEFsaWduIHx8IG51bGw7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBsZXZlbDogNSxcbiAgICAgICAgICBhbGlnblxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0sXG4gICAge1xuICAgICAgdGFnOiAnaDYnLFxuICAgICAgZ2V0QXR0cnMoZG9tOiBIVE1MRWxlbWVudCk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgICAgICBjb25zdCB7IHRleHRBbGlnbiB9ID0gZG9tLnN0eWxlO1xuICAgICAgICBjb25zdCBhbGlnbiA9IGRvbS5nZXRBdHRyaWJ1dGUoJ2FsaWduJykgfHwgdGV4dEFsaWduIHx8IG51bGw7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBsZXZlbDogNixcbiAgICAgICAgICBhbGlnblxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0sXG4gIF0sXG4gIHRvRE9NKG5vZGUpOiBET01PdXRwdXRTcGVjIHtcbiAgICBjb25zdCB7IGxldmVsLCBhbGlnbiB9ID0gbm9kZS5hdHRycztcblxuICAgIGNvbnN0IHN0eWxlczogUGFydGlhbDxDU1NTdHlsZURlY2xhcmF0aW9uPiA9IHtcbiAgICAgIHRleHRBbGlnbjogYWxpZ24gIT09ICdsZWZ0JyA/IGFsaWduIDogbnVsbFxuICAgIH07XG4gICAgY29uc3Qgc3R5bGUgPSB0b1N0eWxlU3RyaW5nKHN0eWxlcykgfHwgbnVsbDtcblxuICAgIHJldHVybiBbJ2gnICsgbGV2ZWwsIHsgc3R5bGUgfSwgMF07XG4gIH1cbn07XG5cbi8vIDo6IE5vZGVTcGVjIEEgY29kZSBsaXN0aW5nLiBEaXNhbGxvd3MgbWFya3Mgb3Igbm9uLXRleHQgaW5saW5lXG4vLyBub2RlcyBieSBkZWZhdWx0LiBSZXByZXNlbnRlZCBhcyBhIGA8cHJlPmAgZWxlbWVudCB3aXRoIGFcbi8vIGA8Y29kZT5gIGVsZW1lbnQgaW5zaWRlIG9mIGl0LlxuY29uc3QgY29kZUJsb2NrOiBOb2RlU3BlYyA9IHtcbiAgY29udGVudDogJ3RleHQqJyxcbiAgbWFya3M6ICcnLFxuICBncm91cDogJ2Jsb2NrJyxcbiAgY29kZTogdHJ1ZSxcbiAgZGVmaW5pbmc6IHRydWUsXG4gIHBhcnNlRE9NOiBbXG4gICAge1xuICAgICAgdGFnOiAncHJlJyxcbiAgICAgIHByZXNlcnZlV2hpdGVzcGFjZTogJ2Z1bGwnXG4gICAgfVxuICBdLFxuICB0b0RPTSgpOiBET01PdXRwdXRTcGVjIHtcbiAgICByZXR1cm4gWydwcmUnLCBbJ2NvZGUnLCAwXV07XG4gIH1cbn07XG5cbi8vIDo6IE5vZGVTcGVjIEEgaGFyZCBsaW5lIGJyZWFrLCByZXByZXNlbnRlZCBpbiB0aGUgRE9NIGFzIGA8YnI+YC5cbmNvbnN0IGhhcmRCcmVhazogTm9kZVNwZWMgPSB7XG4gIGlubGluZTogdHJ1ZSxcbiAgZ3JvdXA6ICdpbmxpbmUnLFxuICBzZWxlY3RhYmxlOiBmYWxzZSxcbiAgcGFyc2VET006IFt7IHRhZzogJ2JyJyB9XSxcbiAgdG9ET00oKTogRE9NT3V0cHV0U3BlYyB7XG4gICAgcmV0dXJuIFsnYnInXTtcbiAgfVxufTtcblxuLy8gOjogTm9kZVNwZWMgQW4gaW5saW5lIGltYWdlIChgPGltZz5gKSBub2RlLiBTdXBwb3J0cyBgc3JjYCxcbi8vIGBhbHRgLCBhbmQgYGhyZWZgIGF0dHJpYnV0ZXMuIFRoZSBsYXR0ZXIgdHdvIGRlZmF1bHQgdG8gdGhlIGVtcHR5XG4vLyBzdHJpbmcuXG5leHBvcnQgY29uc3QgaW1hZ2U6IE5vZGVTcGVjID0ge1xuICBpbmxpbmU6IHRydWUsXG4gIGF0dHJzOiB7XG4gICAgc3JjOiB7fSxcbiAgICBhbHQ6IHsgZGVmYXVsdDogbnVsbCB9LFxuICAgIHRpdGxlOiB7IGRlZmF1bHQ6IG51bGwgfSxcbiAgICB3aWR0aDogeyBkZWZhdWx0OiBudWxsIH1cbiAgfSxcbiAgZ3JvdXA6ICdpbmxpbmUnLFxuICBkcmFnZ2FibGU6IHRydWUsXG4gIHBhcnNlRE9NOiBbXG4gICAge1xuICAgICAgdGFnOiAnaW1nW3NyY10nLFxuICAgICAgZ2V0QXR0cnMoZG9tOiBIVE1MRWxlbWVudCk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHNyYzogZG9tLmdldEF0dHJpYnV0ZSgnc3JjJyksXG4gICAgICAgICAgdGl0bGU6IGRvbS5nZXRBdHRyaWJ1dGUoJ3RpdGxlJyksXG4gICAgICAgICAgYWx0OiBkb20uZ2V0QXR0cmlidXRlKCdhbHQnKSxcbiAgICAgICAgICB3aWR0aDogZG9tLmdldEF0dHJpYnV0ZSgnd2lkdGgnKVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgXSxcbiAgdG9ET00obm9kZTogUHJvc2VNaXJyb3JOb2RlKTogRE9NT3V0cHV0U3BlYyB7XG4gICAgY29uc3QgeyBzcmMsIGFsdCwgdGl0bGUsIHdpZHRoIH0gPSBub2RlLmF0dHJzO1xuICAgIHJldHVybiBbJ2ltZycsIHsgc3JjLCBhbHQsIHRpdGxlLCB3aWR0aCB9XTtcbiAgfVxufTtcblxuY29uc3QgbGlzdEl0ZW0gPSB7XG4gIC4uLnNsLmxpc3RJdGVtLFxuICBjb250ZW50OiAncGFyYWdyYXBoIGJsb2NrKidcbn07XG5cbmNvbnN0IG9yZGVyZWRMaXN0ID0ge1xuICAuLi5zbC5vcmRlcmVkTGlzdCxcbiAgY29udGVudDogJ2xpc3RfaXRlbSsnLFxuICBncm91cDogJ2Jsb2NrJ1xufTtcblxuY29uc3QgYnVsbGV0TGlzdCA9IHtcbiAgLi4uc2wuYnVsbGV0TGlzdCxcbiAgY29udGVudDogJ2xpc3RfaXRlbSsnLFxuICBncm91cDogJ2Jsb2NrJ1xufTtcblxuY29uc3Qgbm9kZXMgPSB7XG4gIGRvYyxcbiAgdGV4dCxcbiAgcGFyYWdyYXBoLFxuICBibG9ja3F1b3RlLFxuICBob3Jpem9udGFsX3J1bGU6IGhvcml6b250YWxSdWxlLFxuICBoZWFkaW5nLFxuICBoYXJkX2JyZWFrOiBoYXJkQnJlYWssXG4gIGNvZGVfYmxvY2s6IGNvZGVCbG9jayxcbiAgaW1hZ2UsXG4gIGxpc3RfaXRlbTogbGlzdEl0ZW0sXG4gIG9yZGVyZWRfbGlzdDogb3JkZXJlZExpc3QsXG4gIGJ1bGxldF9saXN0OiBidWxsZXRMaXN0XG59O1xuXG5leHBvcnQgZGVmYXVsdCBub2RlcztcbiJdfQ==