@blinkk/root-cms 1.0.0-rc.13 → 1.0.0-rc.14
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/dist/ui/ui.js +3 -7
- package/package.json +3 -7
- package/dist/richtext.d.ts +0 -68
- package/dist/richtext.js +0 -119
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@blinkk/root-cms",
|
|
3
|
-
"version": "1.0.0-rc.
|
|
3
|
+
"version": "1.0.0-rc.14",
|
|
4
4
|
"author": "s@blinkk.com",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"engines": {
|
|
@@ -44,10 +44,6 @@
|
|
|
44
44
|
"./project": {
|
|
45
45
|
"types": "./dist/project.d.ts",
|
|
46
46
|
"import": "./dist/project.js"
|
|
47
|
-
},
|
|
48
|
-
"./richtext": {
|
|
49
|
-
"types": "./dist/richtext.d.ts",
|
|
50
|
-
"import": "./dist/richtext.js"
|
|
51
47
|
}
|
|
52
48
|
},
|
|
53
49
|
"dependencies": {
|
|
@@ -101,10 +97,10 @@
|
|
|
101
97
|
"typescript": "5.2.2",
|
|
102
98
|
"vite": "5.0.8",
|
|
103
99
|
"vitest": "^0.34.6",
|
|
104
|
-
"@blinkk/root": "1.0.0-rc.
|
|
100
|
+
"@blinkk/root": "1.0.0-rc.14"
|
|
105
101
|
},
|
|
106
102
|
"peerDependencies": {
|
|
107
|
-
"@blinkk/root": "1.0.0-rc.
|
|
103
|
+
"@blinkk/root": "1.0.0-rc.14",
|
|
108
104
|
"firebase-admin": ">=11",
|
|
109
105
|
"firebase-functions": ">=4",
|
|
110
106
|
"preact": ">=10",
|
package/dist/richtext.d.ts
DELETED
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
import * as preact from 'preact';
|
|
2
|
-
import { FunctionalComponent } from 'preact';
|
|
3
|
-
|
|
4
|
-
interface RichTextBlock {
|
|
5
|
-
type: string;
|
|
6
|
-
data?: any;
|
|
7
|
-
}
|
|
8
|
-
interface RichTextData {
|
|
9
|
-
[key: string]: any;
|
|
10
|
-
blocks: any[];
|
|
11
|
-
}
|
|
12
|
-
type RichTextBlockComponent = FunctionalComponent<any>;
|
|
13
|
-
interface RichTextProps {
|
|
14
|
-
data: RichTextData;
|
|
15
|
-
components?: Record<string, RichTextBlockComponent>;
|
|
16
|
-
}
|
|
17
|
-
/** Renders data from the "richtext" field. */
|
|
18
|
-
declare function RichText(props: RichTextProps): preact.JSX.Element;
|
|
19
|
-
declare namespace RichText {
|
|
20
|
-
var ParagraphBlock: (props: RichTextParagraphBlockProps) => preact.JSX.Element | null;
|
|
21
|
-
var HeadingBlock: (props: RichTextHeadingBlockProps) => preact.JSX.Element | null;
|
|
22
|
-
var ListBlock: (props: RichTextListBlockProps) => preact.JSX.Element | null;
|
|
23
|
-
var ImageBlock: (props: RichTextImageBlockProps) => preact.JSX.Element | null;
|
|
24
|
-
var HtmlBlock: (props: RichTextHtmlBlockProps) => preact.JSX.Element | null;
|
|
25
|
-
}
|
|
26
|
-
interface RichTextParagraphBlockProps {
|
|
27
|
-
type: 'paragraph';
|
|
28
|
-
data?: {
|
|
29
|
-
text?: string;
|
|
30
|
-
};
|
|
31
|
-
}
|
|
32
|
-
interface RichTextHeadingBlockProps {
|
|
33
|
-
type: 'heading';
|
|
34
|
-
data?: {
|
|
35
|
-
level?: number;
|
|
36
|
-
text?: string;
|
|
37
|
-
};
|
|
38
|
-
}
|
|
39
|
-
interface ListItem {
|
|
40
|
-
content?: string;
|
|
41
|
-
items?: ListItem[];
|
|
42
|
-
}
|
|
43
|
-
interface RichTextListBlockProps {
|
|
44
|
-
type: 'orderedList' | 'unorderedList';
|
|
45
|
-
data?: {
|
|
46
|
-
style?: 'ordered' | 'unordered';
|
|
47
|
-
items?: ListItem[];
|
|
48
|
-
};
|
|
49
|
-
}
|
|
50
|
-
interface RichTextImageBlockProps {
|
|
51
|
-
type: 'image';
|
|
52
|
-
data?: {
|
|
53
|
-
file?: {
|
|
54
|
-
url: string;
|
|
55
|
-
width: string | number;
|
|
56
|
-
height: string | number;
|
|
57
|
-
alt: string;
|
|
58
|
-
};
|
|
59
|
-
};
|
|
60
|
-
}
|
|
61
|
-
interface RichTextHtmlBlockProps {
|
|
62
|
-
type: 'html';
|
|
63
|
-
data?: {
|
|
64
|
-
html?: string;
|
|
65
|
-
};
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
export { RichText, type RichTextBlock, type RichTextBlockComponent, type RichTextData, type RichTextHeadingBlockProps, type RichTextHtmlBlockProps, type RichTextImageBlockProps, type RichTextListBlockProps, type RichTextParagraphBlockProps, type RichTextProps };
|
package/dist/richtext.js
DELETED
|
@@ -1,119 +0,0 @@
|
|
|
1
|
-
// core/richtext.tsx
|
|
2
|
-
import { useTranslations } from "@blinkk/root";
|
|
3
|
-
import { Fragment, jsx, jsxs } from "preact/jsx-runtime";
|
|
4
|
-
function RichText(props) {
|
|
5
|
-
var _a;
|
|
6
|
-
const components = {
|
|
7
|
-
heading: RichText.HeadingBlock,
|
|
8
|
-
html: RichText.HtmlBlock,
|
|
9
|
-
image: RichText.ImageBlock,
|
|
10
|
-
orderedList: RichText.ListBlock,
|
|
11
|
-
paragraph: RichText.ParagraphBlock,
|
|
12
|
-
unorderedList: RichText.ListBlock,
|
|
13
|
-
...props.components
|
|
14
|
-
};
|
|
15
|
-
const blocks = (((_a = props.data) == null ? void 0 : _a.blocks) || []).filter((block) => {
|
|
16
|
-
const blockType = block == null ? void 0 : block.type;
|
|
17
|
-
if (!blockType) {
|
|
18
|
-
return false;
|
|
19
|
-
}
|
|
20
|
-
if (!(blockType in components)) {
|
|
21
|
-
console.warn(`ignoring unknown richtext type: "${blockType}"`);
|
|
22
|
-
return false;
|
|
23
|
-
}
|
|
24
|
-
return true;
|
|
25
|
-
});
|
|
26
|
-
return /* @__PURE__ */ jsx(Fragment, { children: blocks.map((block) => {
|
|
27
|
-
const Block = components[block.type];
|
|
28
|
-
return /* @__PURE__ */ jsx(Block, { ...block });
|
|
29
|
-
}) });
|
|
30
|
-
}
|
|
31
|
-
RichText.ParagraphBlock = (props) => {
|
|
32
|
-
var _a;
|
|
33
|
-
if (!((_a = props.data) == null ? void 0 : _a.text)) {
|
|
34
|
-
return null;
|
|
35
|
-
}
|
|
36
|
-
const t = useTranslations();
|
|
37
|
-
return /* @__PURE__ */ jsx("p", { dangerouslySetInnerHTML: { __html: t(props.data.text) } });
|
|
38
|
-
};
|
|
39
|
-
RichText.HeadingBlock = (props) => {
|
|
40
|
-
var _a;
|
|
41
|
-
if (!((_a = props.data) == null ? void 0 : _a.text)) {
|
|
42
|
-
return null;
|
|
43
|
-
}
|
|
44
|
-
const t = useTranslations();
|
|
45
|
-
const level = props.data.level || 2;
|
|
46
|
-
const Component = `h${level}`;
|
|
47
|
-
return /* @__PURE__ */ jsx(Component, { dangerouslySetInnerHTML: { __html: t(props.data.text) } });
|
|
48
|
-
};
|
|
49
|
-
RichText.ListBlock = (props) => {
|
|
50
|
-
var _a, _b, _c;
|
|
51
|
-
if (!((_b = (_a = props.data) == null ? void 0 : _a.items) == null ? void 0 : _b.length)) {
|
|
52
|
-
return null;
|
|
53
|
-
}
|
|
54
|
-
let style = (_c = props.data) == null ? void 0 : _c.style;
|
|
55
|
-
if (!style) {
|
|
56
|
-
style = props.type === "orderedList" ? "ordered" : "unordered";
|
|
57
|
-
}
|
|
58
|
-
const Component = style === "ordered" ? "ol" : "ul";
|
|
59
|
-
const items = props.data.items;
|
|
60
|
-
const t = useTranslations();
|
|
61
|
-
return /* @__PURE__ */ jsx(Component, { children: items.map((item) => {
|
|
62
|
-
var _a2;
|
|
63
|
-
if (item.content || ((_a2 = item.items) == null ? void 0 : _a2.length)) {
|
|
64
|
-
return /* @__PURE__ */ jsxs("li", { children: [
|
|
65
|
-
item.content && /* @__PURE__ */ jsx(
|
|
66
|
-
RichText.ParagraphBlock,
|
|
67
|
-
{
|
|
68
|
-
type: "paragraph",
|
|
69
|
-
data: { text: item.content }
|
|
70
|
-
}
|
|
71
|
-
),
|
|
72
|
-
item.items && item.items.length > 0 && /* @__PURE__ */ jsx(
|
|
73
|
-
RichText.ListBlock,
|
|
74
|
-
{
|
|
75
|
-
type: props.type,
|
|
76
|
-
data: { style, items: item.items }
|
|
77
|
-
}
|
|
78
|
-
)
|
|
79
|
-
] });
|
|
80
|
-
}
|
|
81
|
-
return null;
|
|
82
|
-
}) });
|
|
83
|
-
};
|
|
84
|
-
RichText.ImageBlock = (props) => {
|
|
85
|
-
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
86
|
-
const imageUrl = (_b = (_a = props.data) == null ? void 0 : _a.file) == null ? void 0 : _b.url;
|
|
87
|
-
if (!imageUrl) {
|
|
88
|
-
return null;
|
|
89
|
-
}
|
|
90
|
-
const width = toNumber((_d = (_c = props.data) == null ? void 0 : _c.file) == null ? void 0 : _d.width);
|
|
91
|
-
const height = toNumber((_f = (_e = props.data) == null ? void 0 : _e.file) == null ? void 0 : _f.height);
|
|
92
|
-
const alt = ((_h = (_g = props.data) == null ? void 0 : _g.file) == null ? void 0 : _h.alt) || "";
|
|
93
|
-
return /* @__PURE__ */ jsx("img", { src: imageUrl, width, height, alt });
|
|
94
|
-
};
|
|
95
|
-
RichText.HtmlBlock = (props) => {
|
|
96
|
-
var _a;
|
|
97
|
-
const html = ((_a = props.data) == null ? void 0 : _a.html) || "";
|
|
98
|
-
if (!html) {
|
|
99
|
-
return null;
|
|
100
|
-
}
|
|
101
|
-
return /* @__PURE__ */ jsx("div", { dangerouslySetInnerHTML: { __html: html } });
|
|
102
|
-
};
|
|
103
|
-
function toNumber(input) {
|
|
104
|
-
if (input === void 0) {
|
|
105
|
-
return 0;
|
|
106
|
-
}
|
|
107
|
-
if (typeof input === "number") {
|
|
108
|
-
return input;
|
|
109
|
-
}
|
|
110
|
-
const parsedNumber = parseFloat(input);
|
|
111
|
-
if (isNaN(parsedNumber)) {
|
|
112
|
-
return 0;
|
|
113
|
-
}
|
|
114
|
-
return parsedNumber;
|
|
115
|
-
}
|
|
116
|
-
export {
|
|
117
|
-
RichText
|
|
118
|
-
};
|
|
119
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vY29yZS9yaWNodGV4dC50c3giXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7dXNlVHJhbnNsYXRpb25zfSBmcm9tICdAYmxpbmtrL3Jvb3QnO1xuaW1wb3J0IHtGdW5jdGlvbmFsQ29tcG9uZW50fSBmcm9tICdwcmVhY3QnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJpY2hUZXh0QmxvY2sge1xuICB0eXBlOiBzdHJpbmc7XG4gIGRhdGE/OiBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmljaFRleHREYXRhIHtcbiAgW2tleTogc3RyaW5nXTogYW55O1xuICBibG9ja3M6IGFueVtdO1xufVxuXG5leHBvcnQgdHlwZSBSaWNoVGV4dEJsb2NrQ29tcG9uZW50ID0gRnVuY3Rpb25hbENvbXBvbmVudDxhbnk+O1xuXG5leHBvcnQgaW50ZXJmYWNlIFJpY2hUZXh0UHJvcHMge1xuICBkYXRhOiBSaWNoVGV4dERhdGE7XG4gIGNvbXBvbmVudHM/OiBSZWNvcmQ8c3RyaW5nLCBSaWNoVGV4dEJsb2NrQ29tcG9uZW50Pjtcbn1cblxuLyoqIFJlbmRlcnMgZGF0YSBmcm9tIHRoZSBcInJpY2h0ZXh0XCIgZmllbGQuICovXG5leHBvcnQgZnVuY3Rpb24gUmljaFRleHQocHJvcHM6IFJpY2hUZXh0UHJvcHMpIHtcbiAgY29uc3QgY29tcG9uZW50czogUmVjb3JkPHN0cmluZywgUmljaFRleHRCbG9ja0NvbXBvbmVudD4gPSB7XG4gICAgaGVhZGluZzogUmljaFRleHQuSGVhZGluZ0Jsb2NrLFxuICAgIGh0bWw6IFJpY2hUZXh0Lkh0bWxCbG9jayxcbiAgICBpbWFnZTogUmljaFRleHQuSW1hZ2VCbG9jayxcbiAgICBvcmRlcmVkTGlzdDogUmljaFRleHQuTGlzdEJsb2NrLFxuICAgIHBhcmFncmFwaDogUmljaFRleHQuUGFyYWdyYXBoQmxvY2ssXG4gICAgdW5vcmRlcmVkTGlzdDogUmljaFRleHQuTGlzdEJsb2NrLFxuICAgIC4uLnByb3BzLmNvbXBvbmVudHMsXG4gIH07XG4gIGNvbnN0IGJsb2NrcyA9IChwcm9wcy5kYXRhPy5ibG9ja3MgfHwgW10pLmZpbHRlcigoYmxvY2spID0+IHtcbiAgICBjb25zdCBibG9ja1R5cGUgPSBibG9jaz8udHlwZTtcbiAgICBpZiAoIWJsb2NrVHlwZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoIShibG9ja1R5cGUgaW4gY29tcG9uZW50cykpIHtcbiAgICAgIGNvbnNvbGUud2FybihgaWdub3JpbmcgdW5rbm93biByaWNodGV4dCB0eXBlOiBcIiR7YmxvY2tUeXBlfVwiYCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9KTtcbiAgcmV0dXJuIChcbiAgICA8PlxuICAgICAge2Jsb2Nrcy5tYXAoKGJsb2NrKSA9PiB7XG4gICAgICAgIGNvbnN0IEJsb2NrID0gY29tcG9uZW50c1tibG9jay50eXBlXTtcbiAgICAgICAgcmV0dXJuIDxCbG9jayB7Li4uYmxvY2t9IC8+O1xuICAgICAgfSl9XG4gICAgPC8+XG4gICk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmljaFRleHRQYXJhZ3JhcGhCbG9ja1Byb3BzIHtcbiAgdHlwZTogJ3BhcmFncmFwaCc7XG4gIGRhdGE/OiB7XG4gICAgdGV4dD86IHN0cmluZztcbiAgfTtcbn1cblxuUmljaFRleHQuUGFyYWdyYXBoQmxvY2sgPSAocHJvcHM6IFJpY2hUZXh0UGFyYWdyYXBoQmxvY2tQcm9wcykgPT4ge1xuICBpZiAoIXByb3BzLmRhdGE/LnRleHQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjb25zdCB0ID0gdXNlVHJhbnNsYXRpb25zKCk7XG4gIHJldHVybiA8cCBkYW5nZXJvdXNseVNldElubmVySFRNTD17e19faHRtbDogdChwcm9wcy5kYXRhLnRleHQpfX0gLz47XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIFJpY2hUZXh0SGVhZGluZ0Jsb2NrUHJvcHMge1xuICB0eXBlOiAnaGVhZGluZyc7XG4gIGRhdGE/OiB7XG4gICAgbGV2ZWw/OiBudW1iZXI7XG4gICAgdGV4dD86IHN0cmluZztcbiAgfTtcbn1cblxudHlwZSBIZWFkaW5nQ29tcG9uZW50ID0gJ2gxJyB8ICdoMicgfCAnaDMnIHwgJ2g0JyB8ICdoNScgfCAnaDYnO1xuXG5SaWNoVGV4dC5IZWFkaW5nQmxvY2sgPSAocHJvcHM6IFJpY2hUZXh0SGVhZGluZ0Jsb2NrUHJvcHMpID0+IHtcbiAgaWYgKCFwcm9wcy5kYXRhPy50ZXh0KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgdCA9IHVzZVRyYW5zbGF0aW9ucygpO1xuICBjb25zdCBsZXZlbCA9IHByb3BzLmRhdGEubGV2ZWwgfHwgMjtcbiAgY29uc3QgQ29tcG9uZW50ID0gYGgke2xldmVsfWAgYXMgSGVhZGluZ0NvbXBvbmVudDtcbiAgcmV0dXJuIDxDb21wb25lbnQgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9e3tfX2h0bWw6IHQocHJvcHMuZGF0YS50ZXh0KX19IC8+O1xufTtcblxuaW50ZXJmYWNlIExpc3RJdGVtIHtcbiAgY29udGVudD86IHN0cmluZztcbiAgaXRlbXM/OiBMaXN0SXRlbVtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJpY2hUZXh0TGlzdEJsb2NrUHJvcHMge1xuICB0eXBlOiAnb3JkZXJlZExpc3QnIHwgJ3Vub3JkZXJlZExpc3QnO1xuICBkYXRhPzoge1xuICAgIHN0eWxlPzogJ29yZGVyZWQnIHwgJ3Vub3JkZXJlZCc7XG4gICAgaXRlbXM/OiBMaXN0SXRlbVtdO1xuICB9O1xufVxuXG5SaWNoVGV4dC5MaXN0QmxvY2sgPSAocHJvcHM6IFJpY2hUZXh0TGlzdEJsb2NrUHJvcHMpID0+IHtcbiAgaWYgKCFwcm9wcy5kYXRhPy5pdGVtcz8ubGVuZ3RoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBsZXQgc3R5bGUgPSBwcm9wcy5kYXRhPy5zdHlsZTtcbiAgaWYgKCFzdHlsZSkge1xuICAgIHN0eWxlID0gcHJvcHMudHlwZSA9PT0gJ29yZGVyZWRMaXN0JyA/ICdvcmRlcmVkJyA6ICd1bm9yZGVyZWQnO1xuICB9XG4gIGNvbnN0IENvbXBvbmVudCA9IHN0eWxlID09PSAnb3JkZXJlZCcgPyAnb2wnIDogJ3VsJztcbiAgY29uc3QgaXRlbXMgPSBwcm9wcy5kYXRhLml0ZW1zO1xuICBjb25zdCB0ID0gdXNlVHJhbnNsYXRpb25zKCk7XG4gIHJldHVybiAoXG4gICAgPENvbXBvbmVudD5cbiAgICAgIHtpdGVtcy5tYXAoKGl0ZW0pID0+IHtcbiAgICAgICAgaWYgKGl0ZW0uY29udGVudCB8fCBpdGVtLml0ZW1zPy5sZW5ndGgpIHtcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPGxpPlxuICAgICAgICAgICAgICB7aXRlbS5jb250ZW50ICYmIChcbiAgICAgICAgICAgICAgICA8UmljaFRleHQuUGFyYWdyYXBoQmxvY2tcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJwYXJhZ3JhcGhcIlxuICAgICAgICAgICAgICAgICAgZGF0YT17e3RleHQ6IGl0ZW0uY29udGVudH19XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAge2l0ZW0uaXRlbXMgJiYgaXRlbS5pdGVtcy5sZW5ndGggPiAwICYmIChcbiAgICAgICAgICAgICAgICA8UmljaFRleHQuTGlzdEJsb2NrXG4gICAgICAgICAgICAgICAgICB0eXBlPXtwcm9wcy50eXBlfVxuICAgICAgICAgICAgICAgICAgZGF0YT17e3N0eWxlLCBpdGVtczogaXRlbS5pdGVtc319XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH0pfVxuICAgIDwvQ29tcG9uZW50PlxuICApO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBSaWNoVGV4dEltYWdlQmxvY2tQcm9wcyB7XG4gIHR5cGU6ICdpbWFnZSc7XG4gIGRhdGE/OiB7XG4gICAgZmlsZT86IHtcbiAgICAgIHVybDogc3RyaW5nO1xuICAgICAgd2lkdGg6IHN0cmluZyB8IG51bWJlcjtcbiAgICAgIGhlaWdodDogc3RyaW5nIHwgbnVtYmVyO1xuICAgICAgYWx0OiBzdHJpbmc7XG4gICAgfTtcbiAgfTtcbn1cblxuUmljaFRleHQuSW1hZ2VCbG9jayA9IChwcm9wczogUmljaFRleHRJbWFnZUJsb2NrUHJvcHMpID0+IHtcbiAgY29uc3QgaW1hZ2VVcmwgPSBwcm9wcy5kYXRhPy5maWxlPy51cmw7XG4gIGlmICghaW1hZ2VVcmwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjb25zdCB3aWR0aCA9IHRvTnVtYmVyKHByb3BzLmRhdGE/LmZpbGU/LndpZHRoKTtcbiAgY29uc3QgaGVpZ2h0ID0gdG9OdW1iZXIocHJvcHMuZGF0YT8uZmlsZT8uaGVpZ2h0KTtcbiAgY29uc3QgYWx0ID0gcHJvcHMuZGF0YT8uZmlsZT8uYWx0IHx8ICcnO1xuICByZXR1cm4gPGltZyBzcmM9e2ltYWdlVXJsfSB3aWR0aD17d2lkdGh9IGhlaWdodD17aGVpZ2h0fSBhbHQ9e2FsdH0gLz47XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIFJpY2hUZXh0SHRtbEJsb2NrUHJvcHMge1xuICB0eXBlOiAnaHRtbCc7XG4gIGRhdGE/OiB7XG4gICAgaHRtbD86IHN0cmluZztcbiAgfTtcbn1cblxuUmljaFRleHQuSHRtbEJsb2NrID0gKHByb3BzOiBSaWNoVGV4dEh0bWxCbG9ja1Byb3BzKSA9PiB7XG4gIGNvbnN0IGh0bWwgPSBwcm9wcy5kYXRhPy5odG1sIHx8ICcnO1xuICBpZiAoIWh0bWwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4gPGRpdiBkYW5nZXJvdXNseVNldElubmVySFRNTD17e19faHRtbDogaHRtbH19IC8+O1xufTtcblxuZnVuY3Rpb24gdG9OdW1iZXIoaW5wdXQ/OiBzdHJpbmcgfCBudW1iZXIpOiBudW1iZXIge1xuICBpZiAoaW5wdXQgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiAwO1xuICB9XG4gIGlmICh0eXBlb2YgaW5wdXQgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIGlucHV0O1xuICB9XG4gIGNvbnN0IHBhcnNlZE51bWJlciA9IHBhcnNlRmxvYXQoaW5wdXQpO1xuICBpZiAoaXNOYU4ocGFyc2VkTnVtYmVyKSkge1xuICAgIHJldHVybiAwO1xuICB9XG4gIHJldHVybiBwYXJzZWROdW1iZXI7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiO0FBQUEsU0FBUSx1QkFBc0I7QUEyQzFCLG1CQUdXLEtBdUVILFlBMUVSO0FBdEJHLFNBQVMsU0FBUyxPQUFzQjtBQXJCL0M7QUFzQkUsUUFBTSxhQUFxRDtBQUFBLElBQ3pELFNBQVMsU0FBUztBQUFBLElBQ2xCLE1BQU0sU0FBUztBQUFBLElBQ2YsT0FBTyxTQUFTO0FBQUEsSUFDaEIsYUFBYSxTQUFTO0FBQUEsSUFDdEIsV0FBVyxTQUFTO0FBQUEsSUFDcEIsZUFBZSxTQUFTO0FBQUEsSUFDeEIsR0FBRyxNQUFNO0FBQUEsRUFDWDtBQUNBLFFBQU0sWUFBVSxXQUFNLFNBQU4sbUJBQVksV0FBVSxDQUFDLEdBQUcsT0FBTyxDQUFDLFVBQVU7QUFDMUQsVUFBTSxZQUFZLCtCQUFPO0FBQ3pCLFFBQUksQ0FBQyxXQUFXO0FBQ2QsYUFBTztBQUFBLElBQ1Q7QUFDQSxRQUFJLEVBQUUsYUFBYSxhQUFhO0FBQzlCLGNBQVEsS0FBSyxvQ0FBb0MsU0FBUyxHQUFHO0FBQzdELGFBQU87QUFBQSxJQUNUO0FBQ0EsV0FBTztBQUFBLEVBQ1QsQ0FBQztBQUNELFNBQ0UsZ0NBQ0csaUJBQU8sSUFBSSxDQUFDLFVBQVU7QUFDckIsVUFBTSxRQUFRLFdBQVcsTUFBTSxJQUFJO0FBQ25DLFdBQU8sb0JBQUMsU0FBTyxHQUFHLE9BQU87QUFBQSxFQUMzQixDQUFDLEdBQ0g7QUFFSjtBQVNBLFNBQVMsaUJBQWlCLENBQUMsVUFBdUM7QUEzRGxFO0FBNERF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
|