@blinkk/root-cms 1.0.0-rc.14 → 1.0.0-rc.16

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.
@@ -0,0 +1,73 @@
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 RichTextContextProps {
14
+ components?: Record<string, RichTextBlockComponent>;
15
+ }
16
+ declare const RichTextContext: preact.Context<RichTextContextProps>;
17
+ declare function useRichTextContext(): RichTextContextProps;
18
+ interface RichTextProps {
19
+ data: RichTextData;
20
+ components?: Record<string, RichTextBlockComponent>;
21
+ }
22
+ /** Renders data from the "richtext" field. */
23
+ declare function RichText(props: RichTextProps): preact.JSX.Element;
24
+ declare namespace RichText {
25
+ var ParagraphBlock: (props: RichTextParagraphBlockProps) => preact.JSX.Element | null;
26
+ var HeadingBlock: (props: RichTextHeadingBlockProps) => preact.JSX.Element | null;
27
+ var ListBlock: (props: RichTextListBlockProps) => preact.JSX.Element | null;
28
+ var ImageBlock: (props: RichTextImageBlockProps) => preact.JSX.Element | null;
29
+ var HtmlBlock: (props: RichTextHtmlBlockProps) => preact.JSX.Element | null;
30
+ }
31
+ interface RichTextParagraphBlockProps {
32
+ type: 'paragraph';
33
+ data?: {
34
+ text?: string;
35
+ };
36
+ }
37
+ interface RichTextHeadingBlockProps {
38
+ type: 'heading';
39
+ data?: {
40
+ level?: number;
41
+ text?: string;
42
+ };
43
+ }
44
+ interface ListItem {
45
+ content?: string;
46
+ items?: ListItem[];
47
+ }
48
+ interface RichTextListBlockProps {
49
+ type: 'orderedList' | 'unorderedList';
50
+ data?: {
51
+ style?: 'ordered' | 'unordered';
52
+ items?: ListItem[];
53
+ };
54
+ }
55
+ interface RichTextImageBlockProps {
56
+ type: 'image';
57
+ data?: {
58
+ file?: {
59
+ url: string;
60
+ width: string | number;
61
+ height: string | number;
62
+ alt: string;
63
+ };
64
+ };
65
+ }
66
+ interface RichTextHtmlBlockProps {
67
+ type: 'html';
68
+ data?: {
69
+ html?: string;
70
+ };
71
+ }
72
+
73
+ export { RichText, type RichTextBlock, type RichTextBlockComponent, RichTextContext, type RichTextContextProps, type RichTextData, type RichTextHeadingBlockProps, type RichTextHtmlBlockProps, type RichTextImageBlockProps, type RichTextListBlockProps, type RichTextParagraphBlockProps, type RichTextProps, useRichTextContext };
@@ -0,0 +1,129 @@
1
+ // core/richtext.tsx
2
+ import { useTranslations } from "@blinkk/root";
3
+ import { createContext } from "preact";
4
+ import { useContext } from "preact/hooks";
5
+ import { Fragment, jsx, jsxs } from "preact/jsx-runtime";
6
+ var RichTextContext = createContext({});
7
+ function useRichTextContext() {
8
+ return useContext(RichTextContext);
9
+ }
10
+ function RichText(props) {
11
+ var _a;
12
+ const richTextContext = useRichTextContext();
13
+ const components = {
14
+ heading: RichText.HeadingBlock,
15
+ html: RichText.HtmlBlock,
16
+ image: RichText.ImageBlock,
17
+ orderedList: RichText.ListBlock,
18
+ paragraph: RichText.ParagraphBlock,
19
+ unorderedList: RichText.ListBlock,
20
+ ...richTextContext.components,
21
+ ...props.components
22
+ };
23
+ const blocks = (((_a = props.data) == null ? void 0 : _a.blocks) || []).filter((block) => {
24
+ const blockType = block == null ? void 0 : block.type;
25
+ if (!blockType) {
26
+ return false;
27
+ }
28
+ if (!(blockType in components)) {
29
+ console.warn(`ignoring unknown richtext type: "${blockType}"`);
30
+ return false;
31
+ }
32
+ return true;
33
+ });
34
+ return /* @__PURE__ */ jsx(Fragment, { children: blocks.map((block) => {
35
+ const Block = components[block.type];
36
+ return /* @__PURE__ */ jsx(Block, { ...block });
37
+ }) });
38
+ }
39
+ RichText.ParagraphBlock = (props) => {
40
+ var _a;
41
+ if (!((_a = props.data) == null ? void 0 : _a.text)) {
42
+ return null;
43
+ }
44
+ const t = useTranslations();
45
+ return /* @__PURE__ */ jsx("p", { dangerouslySetInnerHTML: { __html: t(props.data.text) } });
46
+ };
47
+ RichText.HeadingBlock = (props) => {
48
+ var _a;
49
+ if (!((_a = props.data) == null ? void 0 : _a.text)) {
50
+ return null;
51
+ }
52
+ const t = useTranslations();
53
+ const level = props.data.level || 2;
54
+ const Component = `h${level}`;
55
+ return /* @__PURE__ */ jsx(Component, { dangerouslySetInnerHTML: { __html: t(props.data.text) } });
56
+ };
57
+ RichText.ListBlock = (props) => {
58
+ var _a, _b, _c;
59
+ if (!((_b = (_a = props.data) == null ? void 0 : _a.items) == null ? void 0 : _b.length)) {
60
+ return null;
61
+ }
62
+ let style = (_c = props.data) == null ? void 0 : _c.style;
63
+ if (!style) {
64
+ style = props.type === "orderedList" ? "ordered" : "unordered";
65
+ }
66
+ const Component = style === "ordered" ? "ol" : "ul";
67
+ const items = props.data.items;
68
+ const t = useTranslations();
69
+ return /* @__PURE__ */ jsx(Component, { children: items.map((item) => {
70
+ var _a2;
71
+ if (item.content || ((_a2 = item.items) == null ? void 0 : _a2.length)) {
72
+ return /* @__PURE__ */ jsxs("li", { children: [
73
+ item.content && /* @__PURE__ */ jsx(
74
+ RichText.ParagraphBlock,
75
+ {
76
+ type: "paragraph",
77
+ data: { text: item.content }
78
+ }
79
+ ),
80
+ item.items && item.items.length > 0 && /* @__PURE__ */ jsx(
81
+ RichText.ListBlock,
82
+ {
83
+ type: props.type,
84
+ data: { style, items: item.items }
85
+ }
86
+ )
87
+ ] });
88
+ }
89
+ return null;
90
+ }) });
91
+ };
92
+ RichText.ImageBlock = (props) => {
93
+ var _a, _b, _c, _d, _e, _f, _g, _h;
94
+ const imageUrl = (_b = (_a = props.data) == null ? void 0 : _a.file) == null ? void 0 : _b.url;
95
+ if (!imageUrl) {
96
+ return null;
97
+ }
98
+ const width = toNumber((_d = (_c = props.data) == null ? void 0 : _c.file) == null ? void 0 : _d.width);
99
+ const height = toNumber((_f = (_e = props.data) == null ? void 0 : _e.file) == null ? void 0 : _f.height);
100
+ const alt = ((_h = (_g = props.data) == null ? void 0 : _g.file) == null ? void 0 : _h.alt) || "";
101
+ return /* @__PURE__ */ jsx("img", { src: imageUrl, width, height, alt });
102
+ };
103
+ RichText.HtmlBlock = (props) => {
104
+ var _a;
105
+ const html = ((_a = props.data) == null ? void 0 : _a.html) || "";
106
+ if (!html) {
107
+ return null;
108
+ }
109
+ return /* @__PURE__ */ jsx("div", { dangerouslySetInnerHTML: { __html: html } });
110
+ };
111
+ function toNumber(input) {
112
+ if (input === void 0) {
113
+ return 0;
114
+ }
115
+ if (typeof input === "number") {
116
+ return input;
117
+ }
118
+ const parsedNumber = parseFloat(input);
119
+ if (isNaN(parsedNumber)) {
120
+ return 0;
121
+ }
122
+ return parsedNumber;
123
+ }
124
+ export {
125
+ RichText,
126
+ RichTextContext,
127
+ useRichTextContext
128
+ };
129
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vY29yZS9yaWNodGV4dC50c3giXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7dXNlVHJhbnNsYXRpb25zfSBmcm9tICdAYmxpbmtrL3Jvb3QnO1xuaW1wb3J0IHtGdW5jdGlvbmFsQ29tcG9uZW50LCBjcmVhdGVDb250ZXh0fSBmcm9tICdwcmVhY3QnO1xuaW1wb3J0IHt1c2VDb250ZXh0fSBmcm9tICdwcmVhY3QvaG9va3MnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJpY2hUZXh0QmxvY2sge1xuICB0eXBlOiBzdHJpbmc7XG4gIGRhdGE/OiBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmljaFRleHREYXRhIHtcbiAgW2tleTogc3RyaW5nXTogYW55O1xuICBibG9ja3M6IGFueVtdO1xufVxuXG5leHBvcnQgdHlwZSBSaWNoVGV4dEJsb2NrQ29tcG9uZW50ID0gRnVuY3Rpb25hbENvbXBvbmVudDxhbnk+O1xuXG5leHBvcnQgaW50ZXJmYWNlIFJpY2hUZXh0Q29udGV4dFByb3BzIHtcbiAgY29tcG9uZW50cz86IFJlY29yZDxzdHJpbmcsIFJpY2hUZXh0QmxvY2tDb21wb25lbnQ+O1xufVxuXG5leHBvcnQgY29uc3QgUmljaFRleHRDb250ZXh0ID0gY3JlYXRlQ29udGV4dDxSaWNoVGV4dENvbnRleHRQcm9wcz4oe30pO1xuXG5leHBvcnQgZnVuY3Rpb24gdXNlUmljaFRleHRDb250ZXh0KCk6IFJpY2hUZXh0Q29udGV4dFByb3BzIHtcbiAgcmV0dXJuIHVzZUNvbnRleHQoUmljaFRleHRDb250ZXh0KTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSaWNoVGV4dFByb3BzIHtcbiAgZGF0YTogUmljaFRleHREYXRhO1xuICBjb21wb25lbnRzPzogUmVjb3JkPHN0cmluZywgUmljaFRleHRCbG9ja0NvbXBvbmVudD47XG59XG5cbi8qKiBSZW5kZXJzIGRhdGEgZnJvbSB0aGUgXCJyaWNodGV4dFwiIGZpZWxkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFJpY2hUZXh0KHByb3BzOiBSaWNoVGV4dFByb3BzKSB7XG4gIGNvbnN0IHJpY2hUZXh0Q29udGV4dCA9IHVzZVJpY2hUZXh0Q29udGV4dCgpO1xuICBjb25zdCBjb21wb25lbnRzOiBSZWNvcmQ8c3RyaW5nLCBSaWNoVGV4dEJsb2NrQ29tcG9uZW50PiA9IHtcbiAgICBoZWFkaW5nOiBSaWNoVGV4dC5IZWFkaW5nQmxvY2ssXG4gICAgaHRtbDogUmljaFRleHQuSHRtbEJsb2NrLFxuICAgIGltYWdlOiBSaWNoVGV4dC5JbWFnZUJsb2NrLFxuICAgIG9yZGVyZWRMaXN0OiBSaWNoVGV4dC5MaXN0QmxvY2ssXG4gICAgcGFyYWdyYXBoOiBSaWNoVGV4dC5QYXJhZ3JhcGhCbG9jayxcbiAgICB1bm9yZGVyZWRMaXN0OiBSaWNoVGV4dC5MaXN0QmxvY2ssXG4gICAgLi4ucmljaFRleHRDb250ZXh0LmNvbXBvbmVudHMsXG4gICAgLi4ucHJvcHMuY29tcG9uZW50cyxcbiAgfTtcbiAgY29uc3QgYmxvY2tzID0gKHByb3BzLmRhdGE/LmJsb2NrcyB8fCBbXSkuZmlsdGVyKChibG9jaykgPT4ge1xuICAgIGNvbnN0IGJsb2NrVHlwZSA9IGJsb2NrPy50eXBlO1xuICAgIGlmICghYmxvY2tUeXBlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICghKGJsb2NrVHlwZSBpbiBjb21wb25lbnRzKSkge1xuICAgICAgY29uc29sZS53YXJuKGBpZ25vcmluZyB1bmtub3duIHJpY2h0ZXh0IHR5cGU6IFwiJHtibG9ja1R5cGV9XCJgKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH0pO1xuICByZXR1cm4gKFxuICAgIDw+XG4gICAgICB7YmxvY2tzLm1hcCgoYmxvY2spID0+IHtcbiAgICAgICAgY29uc3QgQmxvY2sgPSBjb21wb25lbnRzW2Jsb2NrLnR5cGVdO1xuICAgICAgICByZXR1cm4gPEJsb2NrIHsuLi5ibG9ja30gLz47XG4gICAgICB9KX1cbiAgICA8Lz5cbiAgKTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSaWNoVGV4dFBhcmFncmFwaEJsb2NrUHJvcHMge1xuICB0eXBlOiAncGFyYWdyYXBoJztcbiAgZGF0YT86IHtcbiAgICB0ZXh0Pzogc3RyaW5nO1xuICB9O1xufVxuXG5SaWNoVGV4dC5QYXJhZ3JhcGhCbG9jayA9IChwcm9wczogUmljaFRleHRQYXJhZ3JhcGhCbG9ja1Byb3BzKSA9PiB7XG4gIGlmICghcHJvcHMuZGF0YT8udGV4dCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IHQgPSB1c2VUcmFuc2xhdGlvbnMoKTtcbiAgcmV0dXJuIDxwIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPXt7X19odG1sOiB0KHByb3BzLmRhdGEudGV4dCl9fSAvPjtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmljaFRleHRIZWFkaW5nQmxvY2tQcm9wcyB7XG4gIHR5cGU6ICdoZWFkaW5nJztcbiAgZGF0YT86IHtcbiAgICBsZXZlbD86IG51bWJlcjtcbiAgICB0ZXh0Pzogc3RyaW5nO1xuICB9O1xufVxuXG50eXBlIEhlYWRpbmdDb21wb25lbnQgPSAnaDEnIHwgJ2gyJyB8ICdoMycgfCAnaDQnIHwgJ2g1JyB8ICdoNic7XG5cblJpY2hUZXh0LkhlYWRpbmdCbG9jayA9IChwcm9wczogUmljaFRleHRIZWFkaW5nQmxvY2tQcm9wcykgPT4ge1xuICBpZiAoIXByb3BzLmRhdGE/LnRleHQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjb25zdCB0ID0gdXNlVHJhbnNsYXRpb25zKCk7XG4gIGNvbnN0IGxldmVsID0gcHJvcHMuZGF0YS5sZXZlbCB8fCAyO1xuICBjb25zdCBDb21wb25lbnQgPSBgaCR7bGV2ZWx9YCBhcyBIZWFkaW5nQ29tcG9uZW50O1xuICByZXR1cm4gPENvbXBvbmVudCBkYW5nZXJvdXNseVNldElubmVySFRNTD17e19faHRtbDogdChwcm9wcy5kYXRhLnRleHQpfX0gLz47XG59O1xuXG5pbnRlcmZhY2UgTGlzdEl0ZW0ge1xuICBjb250ZW50Pzogc3RyaW5nO1xuICBpdGVtcz86IExpc3RJdGVtW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmljaFRleHRMaXN0QmxvY2tQcm9wcyB7XG4gIHR5cGU6ICdvcmRlcmVkTGlzdCcgfCAndW5vcmRlcmVkTGlzdCc7XG4gIGRhdGE/OiB7XG4gICAgc3R5bGU/OiAnb3JkZXJlZCcgfCAndW5vcmRlcmVkJztcbiAgICBpdGVtcz86IExpc3RJdGVtW107XG4gIH07XG59XG5cblJpY2hUZXh0Lkxpc3RCbG9jayA9IChwcm9wczogUmljaFRleHRMaXN0QmxvY2tQcm9wcykgPT4ge1xuICBpZiAoIXByb3BzLmRhdGE/Lml0ZW1zPy5sZW5ndGgpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGxldCBzdHlsZSA9IHByb3BzLmRhdGE/LnN0eWxlO1xuICBpZiAoIXN0eWxlKSB7XG4gICAgc3R5bGUgPSBwcm9wcy50eXBlID09PSAnb3JkZXJlZExpc3QnID8gJ29yZGVyZWQnIDogJ3Vub3JkZXJlZCc7XG4gIH1cbiAgY29uc3QgQ29tcG9uZW50ID0gc3R5bGUgPT09ICdvcmRlcmVkJyA/ICdvbCcgOiAndWwnO1xuICBjb25zdCBpdGVtcyA9IHByb3BzLmRhdGEuaXRlbXM7XG4gIGNvbnN0IHQgPSB1c2VUcmFuc2xhdGlvbnMoKTtcbiAgcmV0dXJuIChcbiAgICA8Q29tcG9uZW50PlxuICAgICAge2l0ZW1zLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICBpZiAoaXRlbS5jb250ZW50IHx8IGl0ZW0uaXRlbXM/Lmxlbmd0aCkge1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8bGk+XG4gICAgICAgICAgICAgIHtpdGVtLmNvbnRlbnQgJiYgKFxuICAgICAgICAgICAgICAgIDxSaWNoVGV4dC5QYXJhZ3JhcGhCbG9ja1xuICAgICAgICAgICAgICAgICAgdHlwZT1cInBhcmFncmFwaFwiXG4gICAgICAgICAgICAgICAgICBkYXRhPXt7dGV4dDogaXRlbS5jb250ZW50fX1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICB7aXRlbS5pdGVtcyAmJiBpdGVtLml0ZW1zLmxlbmd0aCA+IDAgJiYgKFxuICAgICAgICAgICAgICAgIDxSaWNoVGV4dC5MaXN0QmxvY2tcbiAgICAgICAgICAgICAgICAgIHR5cGU9e3Byb3BzLnR5cGV9XG4gICAgICAgICAgICAgICAgICBkYXRhPXt7c3R5bGUsIGl0ZW1zOiBpdGVtLml0ZW1zfX1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSl9XG4gICAgPC9Db21wb25lbnQ+XG4gICk7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIFJpY2hUZXh0SW1hZ2VCbG9ja1Byb3BzIHtcbiAgdHlwZTogJ2ltYWdlJztcbiAgZGF0YT86IHtcbiAgICBmaWxlPzoge1xuICAgICAgdXJsOiBzdHJpbmc7XG4gICAgICB3aWR0aDogc3RyaW5nIHwgbnVtYmVyO1xuICAgICAgaGVpZ2h0OiBzdHJpbmcgfCBudW1iZXI7XG4gICAgICBhbHQ6IHN0cmluZztcbiAgICB9O1xuICB9O1xufVxuXG5SaWNoVGV4dC5JbWFnZUJsb2NrID0gKHByb3BzOiBSaWNoVGV4dEltYWdlQmxvY2tQcm9wcykgPT4ge1xuICBjb25zdCBpbWFnZVVybCA9IHByb3BzLmRhdGE/LmZpbGU/LnVybDtcbiAgaWYgKCFpbWFnZVVybCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IHdpZHRoID0gdG9OdW1iZXIocHJvcHMuZGF0YT8uZmlsZT8ud2lkdGgpO1xuICBjb25zdCBoZWlnaHQgPSB0b051bWJlcihwcm9wcy5kYXRhPy5maWxlPy5oZWlnaHQpO1xuICBjb25zdCBhbHQgPSBwcm9wcy5kYXRhPy5maWxlPy5hbHQgfHwgJyc7XG4gIHJldHVybiA8aW1nIHNyYz17aW1hZ2VVcmx9IHdpZHRoPXt3aWR0aH0gaGVpZ2h0PXtoZWlnaHR9IGFsdD17YWx0fSAvPjtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmljaFRleHRIdG1sQmxvY2tQcm9wcyB7XG4gIHR5cGU6ICdodG1sJztcbiAgZGF0YT86IHtcbiAgICBodG1sPzogc3RyaW5nO1xuICB9O1xufVxuXG5SaWNoVGV4dC5IdG1sQmxvY2sgPSAocHJvcHM6IFJpY2hUZXh0SHRtbEJsb2NrUHJvcHMpID0+IHtcbiAgY29uc3QgaHRtbCA9IHByb3BzLmRhdGE/Lmh0bWwgfHwgJyc7XG4gIGlmICghaHRtbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiA8ZGl2IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPXt7X19odG1sOiBodG1sfX0gLz47XG59O1xuXG5mdW5jdGlvbiB0b051bWJlcihpbnB1dD86IHN0cmluZyB8IG51bWJlcik6IG51bWJlciB7XG4gIGlmIChpbnB1dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gaW5wdXQ7XG4gIH1cbiAgY29uc3QgcGFyc2VkTnVtYmVyID0gcGFyc2VGbG9hdChpbnB1dCk7XG4gIGlmIChpc05hTihwYXJzZWROdW1iZXIpKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgcmV0dXJuIHBhcnNlZE51bWJlcjtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7QUFBQSxTQUFRLHVCQUFzQjtBQUM5QixTQUE2QixxQkFBb0I7QUFDakQsU0FBUSxrQkFBaUI7QUFzRHJCLG1CQUdXLEtBdUVILFlBMUVSO0FBcENHLElBQU0sa0JBQWtCLGNBQW9DLENBQUMsQ0FBQztBQUU5RCxTQUFTLHFCQUEyQztBQUN6RCxTQUFPLFdBQVcsZUFBZTtBQUNuQztBQVFPLFNBQVMsU0FBUyxPQUFzQjtBQWhDL0M7QUFpQ0UsUUFBTSxrQkFBa0IsbUJBQW1CO0FB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