@slimr/css 2.1.11 → 2.1.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.
Files changed (43) hide show
  1. package/README.md +58 -50
  2. package/cjs/addCss.d.ts +23 -0
  3. package/cjs/addCss.js +38 -0
  4. package/cjs/addCss.js.map +1 -0
  5. package/cjs/addCss.ts +33 -0
  6. package/cjs/createClass.d.ts +43 -0
  7. package/cjs/{src/createClass.js → createClass.js} +78 -132
  8. package/cjs/createClass.js.map +1 -0
  9. package/cjs/createClass.ts +82 -211
  10. package/{esm/src → cjs}/index.d.ts +1 -0
  11. package/cjs/{src/index.js → index.js} +1 -0
  12. package/cjs/index.js.map +1 -0
  13. package/cjs/index.ts +1 -0
  14. package/cjs/{src/createClass.d.ts → shorthandProps.d.ts} +7 -47
  15. package/cjs/shorthandProps.js +51 -0
  16. package/cjs/shorthandProps.js.map +1 -0
  17. package/cjs/shorthandProps.ts +118 -0
  18. package/esm/addCss.d.ts +23 -0
  19. package/esm/addCss.js +34 -0
  20. package/esm/addCss.js.map +1 -0
  21. package/esm/addCss.ts +33 -0
  22. package/esm/createClass.d.ts +43 -0
  23. package/esm/{src/createClass.js → createClass.js} +76 -128
  24. package/esm/createClass.js.map +1 -0
  25. package/esm/createClass.ts +82 -211
  26. package/{cjs/src → esm}/index.d.ts +1 -0
  27. package/esm/{src/index.js → index.js} +1 -0
  28. package/esm/index.js.map +1 -0
  29. package/esm/index.ts +1 -0
  30. package/esm/{src/createClass.d.ts → shorthandProps.d.ts} +7 -47
  31. package/esm/shorthandProps.js +47 -0
  32. package/esm/shorthandProps.js.map +1 -0
  33. package/esm/shorthandProps.ts +118 -0
  34. package/package.json +4 -1
  35. package/src/addCss.ts +33 -0
  36. package/src/createClass.ts +82 -211
  37. package/src/index.ts +1 -0
  38. package/src/shorthandProps.ts +118 -0
  39. package/tsconfig.json +1 -1
  40. package/cjs/src/createClass.js.map +0 -1
  41. package/cjs/src/index.js.map +0 -1
  42. package/esm/src/createClass.js.map +0 -1
  43. package/esm/src/index.js.map +0 -1
package/README.md CHANGED
@@ -1,6 +1,18 @@
1
- # @slimr/css
1
+ # 🪶 @slimr/css [![npm package](https://img.shields.io/npm/v/@slimr/css.svg?style=flat-square)](https://npmjs.org/package/@slimr/css)
2
2
 
3
- A tiny alternative to the popular emotion library
3
+ tiny css-in-js features, inspired by the popular emotion library
4
+
5
+ Demo: [CodeSandbox](https://codesandbox.io/s/64r9px?file=/src/App.tsx)
6
+
7
+ Features:
8
+
9
+ - Much smaller (less bundle size)
10
+ - Less is more: faster, less bugs, no breaking changes
11
+ - Is progressive -- lazy loads styles
12
+ - Css shorthand props like [chakra-ui](https://chakra-ui.com/docs/styled-system/style-props)
13
+ - CSS responsive shorthand props like [chakra-ui](https://chakra-ui.com/docs/styled-system/responsive-styles)
14
+
15
+ ## Context
4
16
 
5
17
  `@slimr` is a set of slim React (hence '@slimr') libs:
6
18
 
@@ -14,63 +26,59 @@ A tiny alternative to the popular emotion library
14
26
  - [@slimr/swr](https://www.npmjs.com/package/@slimr/swr) - A React hook for fetching data that supports stale-while-refresh eager rendering
15
27
  - [@slimr/util](https://www.npmjs.com/package/@slimr/util) - Framework agnostic Javascript polyfills
16
28
 
17
- Pros:
29
+ ## Setup/Install
18
30
 
19
- - Much less bundle size
20
- - Less is more: faster, less bugs, no breaking changes
21
- - Is progressive -- lazy loads styles along with component if component is lazy
22
- - Css shorthand props like [chakra-ui](https://chakra-ui.com/docs/styled-system/style-props):
23
- - `m` --> `margin`
24
- - `mx` --> `margin-left` and bottom
25
- - `py` --> `padding-top` and bottom
26
- - More [here](https://github.com/bdombro/slimr/blob/65bf012086760b7e481a4064f3be8aea6a098b91/packages/css/src/index.ts#L73)!
27
- - CSS Breakpoints shorthand like [chakra-ui](https://chakra-ui.com/docs/styled-system/responsive-styles):
31
+ ```bash
32
+ npm i @slimr/css
33
+ ```
28
34
 
29
- ```css
30
- margin: [auto, null, inherit];
31
- /* Translates to */
32
- margin: auto;
33
- @media (min-width: 48em) {
34
- margin: inherit;
35
- }
36
- ```
35
+ ## API
37
36
 
38
- - Breakpoints are `[30em, 48em, 62em, 80em, 96em]`
37
+ ### addCss
39
38
 
40
- Cons:
39
+ Injects css to the page head
41
40
 
42
- - No SSR support
41
+ - Queues and batches injections for better performance
42
+ - Has local cache to recall prior adds, to reduce duplicates and dom changes
43
43
 
44
- ## Setup/Install
44
+ ```typescript
45
+ import { addCSs } from '@slimr/css'
46
+ addCss(`.foo { color: green; }`) // queues css for injection
47
+ addCss(`.foo { color: green; }`) // ignored bc duplicate
48
+ addCss(`.foo { background: purplse`) // queues more css
49
+ // the queue will be executed next javascript tick
50
+ ```
45
51
 
46
- ```bash
47
- npm i @slimr/css
52
+ ### `css` (alias for `createClass`)
53
+
54
+ Upserts and returns a unique css class for a given css string
55
+
56
+ - Leverages addCss under the hood, so very performant
57
+ - Supports several css short-hands, inspired by [Chakra-UI's box](https://chakra-ui.com/docs/styled-system/responsive-styles)
58
+ - Supports array values for responsive styles, similar to Chakra-UI's box. More [here](https://github.com/bdombro/slimr/blob/65bf012086760b7e481a4064f3be8aea6a098b91/packages/css/src/index.ts#L73)
59
+
60
+ ```typescript
61
+ import {createClass, css} from '@slimr/css'
62
+ c1 = createClass('c: red;') // queues the create of new css class 's0'
63
+ c2 = createClass('c: red;') // is duplicate so will return 's0'
64
+ c3 = createClass`c: red;` // same
65
+ c4 = css`c: red;` // same
66
+ // c1 = c2 = c3 = c4
67
+ <div className={css`c: red;`} /> // will resolve to 's0' like above
68
+ c5 = css`c: blue;` // queues the create of new css class 's1'
69
+ c6 = css`w: [100%, null, 400px]` // width = 100% on mobile and table, 400px on desktop
48
70
  ```
49
71
 
50
- ## Usage
51
-
52
- ```tsx
53
- // Add some global styles
54
- addCss`
55
- body {
56
- color: lightgray;
57
- }
58
- `
59
- return (
60
- <div
61
- className={css`
62
- background: white;
63
- color: ${on ? 'red' : 'initial'};
64
- &:hover {
65
- font-weight: bold;
66
- }
67
- font-size: [20px, null, 16px];
68
- `}
69
- >
70
- Helo css!
71
- </div>
72
- )
73
- }
72
+ ...and the queue will be executed next javascript tick
73
+
74
+ ### `classJoin`
75
+
76
+ Joins class names and omits falsey props
77
+
78
+ ```typescript
79
+ import { classJoin } from '@slimr/css'
80
+ classJoin('a', 'b', 'c') // 'a b c'
81
+ classJoin('a', 0, 'b', null, 'c') // 'a b c'
74
82
  ```
75
83
 
76
84
  ## Comparisons
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Injects css to the page head
3
+ *
4
+ * - Lazy: Will not be added until the component mounts, if called from within a component
5
+ * - Batches dom changes for better performance
6
+ * - Has local cache to recall prior adds, to reduce duplicates and dom changes
7
+ *
8
+ * @param css
9
+ * css to be injected
10
+ *
11
+ * @returns void
12
+ *
13
+ * @example
14
+ * addCss(`.myClass { color: red; }`) // queues css for injection
15
+ * addCss(`.myClass { color: red; }`) // is duplicate so will not be added
16
+ * addCss(`.myClass { color: blue; }`) // queues css for injection
17
+ * // ...and the queue will be executed next javascript tick
18
+ */
19
+ export declare function addCss(css: string): void;
20
+ export declare namespace addCss {
21
+ var que: Set<string>;
22
+ var count: number;
23
+ }
package/cjs/addCss.js ADDED
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.addCss = void 0;
4
+ /**
5
+ * Injects css to the page head
6
+ *
7
+ * - Lazy: Will not be added until the component mounts, if called from within a component
8
+ * - Batches dom changes for better performance
9
+ * - Has local cache to recall prior adds, to reduce duplicates and dom changes
10
+ *
11
+ * @param css
12
+ * css to be injected
13
+ *
14
+ * @returns void
15
+ *
16
+ * @example
17
+ * addCss(`.myClass { color: red; }`) // queues css for injection
18
+ * addCss(`.myClass { color: red; }`) // is duplicate so will not be added
19
+ * addCss(`.myClass { color: blue; }`) // queues css for injection
20
+ * // ...and the queue will be executed next javascript tick
21
+ */
22
+ function addCss(css) {
23
+ addCss.que.add(css);
24
+ setTimeout(() => {
25
+ const css = [...addCss.que].join('\n');
26
+ if (css) {
27
+ addCss.que.clear();
28
+ const s = document.createElement('style');
29
+ s.id = `u${addCss.count++}`;
30
+ s.innerHTML = css;
31
+ document.head.appendChild(s);
32
+ }
33
+ }, 0);
34
+ }
35
+ exports.addCss = addCss;
36
+ addCss.que = new Set();
37
+ addCss.count = 0;
38
+ //# sourceMappingURL=addCss.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"addCss.js","sourceRoot":"","sources":["../src/addCss.ts"],"names":[],"mappings":";;;AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,SAAgB,MAAM,CAAC,GAAW;IAChC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IACnB,UAAU,CAAC,GAAG,EAAE;QACd,MAAM,GAAG,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACtC,IAAI,GAAG,EAAE;YACP,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,CAAA;YAClB,MAAM,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAA;YACzC,CAAC,CAAC,EAAE,GAAG,IAAI,MAAM,CAAC,KAAK,EAAE,EAAE,CAAA;YAC3B,CAAC,CAAC,SAAS,GAAG,GAAG,CAAA;YACjB,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAA;SAC7B;IACH,CAAC,EAAE,CAAC,CAAC,CAAA;AACP,CAAC;AAZD,wBAYC;AACD,MAAM,CAAC,GAAG,GAAG,IAAI,GAAG,EAAU,CAAA;AAC9B,MAAM,CAAC,KAAK,GAAG,CAAC,CAAA"}
package/cjs/addCss.ts ADDED
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Injects css to the page head
3
+ *
4
+ * - Lazy: Will not be added until the component mounts, if called from within a component
5
+ * - Batches dom changes for better performance
6
+ * - Has local cache to recall prior adds, to reduce duplicates and dom changes
7
+ *
8
+ * @param css
9
+ * css to be injected
10
+ *
11
+ * @returns void
12
+ *
13
+ * @example
14
+ * addCss(`.myClass { color: red; }`) // queues css for injection
15
+ * addCss(`.myClass { color: red; }`) // is duplicate so will not be added
16
+ * addCss(`.myClass { color: blue; }`) // queues css for injection
17
+ * // ...and the queue will be executed next javascript tick
18
+ */
19
+ export function addCss(css: string) {
20
+ addCss.que.add(css)
21
+ setTimeout(() => {
22
+ const css = [...addCss.que].join('\n')
23
+ if (css) {
24
+ addCss.que.clear()
25
+ const s = document.createElement('style')
26
+ s.id = `u${addCss.count++}`
27
+ s.innerHTML = css
28
+ document.head.appendChild(s)
29
+ }
30
+ }, 0)
31
+ }
32
+ addCss.que = new Set<string>()
33
+ addCss.count = 0
@@ -0,0 +1,43 @@
1
+ import { T2SProps } from '@slimr/util';
2
+ /**
3
+ * Joins class names and omits falsey props
4
+ *
5
+ * @param classes
6
+ * class names to be joined
7
+ *
8
+ * @returns a string of joined class names
9
+ *
10
+ * @example
11
+ * ```typescript
12
+ * classJoin('a', 'b', 'c') // 'a b c'
13
+ * classJoin('a', 0, 'b', null, 'c') // 'a b c'
14
+ * ```
15
+ */
16
+ export declare function classJoin(...classes: (string | 0 | null | undefined)[]): string;
17
+ /**
18
+ * Upserts and returns a unique css class for a given css string
19
+ *
20
+ * @param cssString
21
+ * string or template string, to be injected. Shorthand props are supported (see Readme).
22
+ *
23
+ * @returns a unique class name
24
+ *
25
+ * @example
26
+ * ```typescript
27
+ * c1 = createClass('c: red;') // queues the create of new css class 's0'
28
+ * c2 = createClass('c: red;') // is duplicate so will return 's0'
29
+ * c3 = createClass`c: red;` // same
30
+ * c4 = css`c: red;` // same
31
+ * // c1 = c2 = c3 = c4
32
+ * <div className={css`c: red;`} /> // will resolve to 's0' like above
33
+ * c5 = css`c: blue;` // queues the create of new css class 's1'
34
+ * c6 = css`w: [100%, null, 400px]` // width = 100% on mobile and table, 400px on desktop
35
+ * ```
36
+ * ...and the queue will be executed next javascript tick
37
+ */
38
+ export declare function createClass(...p: T2SProps): string;
39
+ export declare namespace createClass {
40
+ var breakPoints: string[];
41
+ var count: number;
42
+ var history: Map<string, string>;
43
+ }
@@ -1,13 +1,85 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createClass = exports.addCss = exports.t2s = exports.shorthandProps = exports.shorthandPropsMap = exports.classJoin = exports.breakPoints = void 0;
4
- /** Breakpoints like chakra */
5
- exports.breakPoints = ['30em', '48em', '62em', '80em', '96em'];
6
- /** Joins class names and filters out blanks */
3
+ exports.createClass = exports.classJoin = void 0;
4
+ const util_1 = require("@slimr/util");
5
+ const addCss_js_1 = require("./addCss.js");
6
+ const shorthandProps_js_1 = require("./shorthandProps.js");
7
+ /**
8
+ * Joins class names and omits falsey props
9
+ *
10
+ * @param classes
11
+ * class names to be joined
12
+ *
13
+ * @returns a string of joined class names
14
+ *
15
+ * @example
16
+ * ```typescript
17
+ * classJoin('a', 'b', 'c') // 'a b c'
18
+ * classJoin('a', 0, 'b', null, 'c') // 'a b c'
19
+ * ```
20
+ */
7
21
  function classJoin(...classes) {
8
22
  return classes.filter(c => c && typeof c === 'string').join(' ');
9
23
  }
10
24
  exports.classJoin = classJoin;
25
+ /**
26
+ * Upserts and returns a unique css class for a given css string
27
+ *
28
+ * @param cssString
29
+ * string or template string, to be injected. Shorthand props are supported (see Readme).
30
+ *
31
+ * @returns a unique class name
32
+ *
33
+ * @example
34
+ * ```typescript
35
+ * c1 = createClass('c: red;') // queues the create of new css class 's0'
36
+ * c2 = createClass('c: red;') // is duplicate so will return 's0'
37
+ * c3 = createClass`c: red;` // same
38
+ * c4 = css`c: red;` // same
39
+ * // c1 = c2 = c3 = c4
40
+ * <div className={css`c: red;`} /> // will resolve to 's0' like above
41
+ * c5 = css`c: blue;` // queues the create of new css class 's1'
42
+ * c6 = css`w: [100%, null, 400px]` // width = 100% on mobile and table, 400px on desktop
43
+ * ```
44
+ * ...and the queue will be executed next javascript tick
45
+ */
46
+ function createClass(...p) {
47
+ let css = (0, util_1.t2s)(...p);
48
+ if (!css)
49
+ return '';
50
+ let className = createClass.history.get(css);
51
+ if (!className) {
52
+ className = 's' + createClass.count++;
53
+ createClass.history.set(css, className);
54
+ css = deleteComments(css);
55
+ css = (0, shorthandProps_js_1.expandShorthands)(css);
56
+ css = expandArrayValues(css);
57
+ const qs = findQueries(css);
58
+ for (const q of qs.reverse()) {
59
+ css = css.slice(0, q.start) + css.slice(q.end);
60
+ }
61
+ css = `.${className}{\n${css}\n}\n`;
62
+ css += qs
63
+ .map(q => {
64
+ if (q.query.startsWith('&')) {
65
+ return `.${className}${q.query.slice(1)}{\n${q.innerBody}\n}`;
66
+ }
67
+ if (q.query.startsWith('@keyframes')) {
68
+ return q.outerBody;
69
+ }
70
+ return `${q.query}{\n.${className}{${q.innerBody}\n}\n}`;
71
+ })
72
+ .join('\n');
73
+ css = trimByLine(css) + '\n\n';
74
+ (0, addCss_js_1.addCss)(css);
75
+ }
76
+ return className;
77
+ }
78
+ exports.createClass = createClass;
79
+ /** Breakpoints like chakra */
80
+ createClass.breakPoints = ['30em', '48em', '62em', '80em', '96em'];
81
+ createClass.count = 0;
82
+ createClass.history = new Map();
11
83
  /** delete css comments **/
12
84
  function deleteComments(css) {
13
85
  return css.replace(/{\/\*[\s\S]*?(?=\*\/})\*\/}/gm, '');
@@ -35,7 +107,7 @@ function expandArrayValues(css) {
35
107
  if (i === 0) {
36
108
  return `${prop}: ${val};`;
37
109
  }
38
- return `@media (min-width: ${exports.breakPoints[i - 1]}) { ${prop}: ${val}; }`;
110
+ return `@media (min-width: ${createClass.breakPoints[i - 1]}) { ${prop}: ${val}; }`;
39
111
  })
40
112
  .join('\n');
41
113
  }
@@ -43,48 +115,6 @@ function expandArrayValues(css) {
43
115
  })
44
116
  .join('\n');
45
117
  }
46
- exports.shorthandPropsMap = {
47
- ai: 'align-items',
48
- b: 'border',
49
- br: 'border-radius',
50
- bg: 'background',
51
- c: 'color',
52
- d: 'display',
53
- f: 'flex',
54
- fd: 'flex-direction',
55
- i: 'inset',
56
- h: 'height',
57
- jc: 'justify-content',
58
- m: 'margin',
59
- ml: 'margin-left',
60
- mr: 'margin-right',
61
- mt: 'margin-top',
62
- mb: 'margin-bottom',
63
- maxW: 'max-width',
64
- minW: 'min-width',
65
- p: 'padding',
66
- pl: 'padding-left',
67
- pr: 'padding-right',
68
- pt: 'padding-top',
69
- pb: 'padding-bottom',
70
- pos: 'position',
71
- ta: 'text-align',
72
- w: 'width',
73
- z: 'z-index',
74
- };
75
- exports.shorthandProps = [...Object.keys(exports.shorthandPropsMap), 'mx', 'my', 'px', 'py'];
76
- /** Expand short-hand css props to full */
77
- function expandProps(css) {
78
- css = '\n' + css; // inject a newline to make the regex easier
79
- // Handle 'mx', 'my', 'px', 'py'
80
- css = css
81
- .replace(/([mp])x:([^;]*)/g, '$1l:$2;\n$1r:$2')
82
- .replace(/([mp])y:([^;]*);/g, '$1t:$2;\n$1b:$2');
83
- Object.entries(exports.shorthandPropsMap).forEach(([k, v]) => {
84
- css = css.replace(new RegExp(`([ \n\t;])${k}:`, 'g'), `$1${v}:`);
85
- });
86
- return css.trim();
87
- }
88
118
  /** Find @keyframes, @media, @container queries in css **/
89
119
  function findQueries(css) {
90
120
  const queries = [];
@@ -120,95 +150,11 @@ function findQueries(css) {
120
150
  return queries;
121
151
  }
122
152
  /** Trims whitespace for every line */
123
- function trim(css) {
153
+ function trimByLine(css) {
124
154
  return css
125
155
  .split('\n')
126
156
  .map(l => l.trim())
127
157
  .filter(l => l)
128
158
  .join('\n');
129
159
  }
130
- /**
131
- * Assemble a string from a template string array and a list of placeholders.
132
- *
133
- * - If the first argument is a string, it is returned as is.
134
- *
135
- * i.e.
136
- * myFoo(...props: TemplateStringProps) => {
137
- * const inputStr = t2s(...props);
138
- * }
139
- * myFoo`hello ${name}` => 'hello world'
140
- * myFoo(`hello ${name}`) => 'hello world'
141
- */
142
- function t2s(...tsp) {
143
- const [s, ...p] = tsp;
144
- return typeof s === 'string' ? s : s.map((s, i) => s + (p?.[i] ?? '')).join('');
145
- }
146
- exports.t2s = t2s;
147
- /**
148
- * Injects css to the page
149
- *
150
- * - Batches adds for performance
151
- *
152
- * @param css - css to be injected
153
- * @returns void
154
- */
155
- function addCss(css) {
156
- addCss.que.add(css);
157
- setTimeout(() => {
158
- const css = [...addCss.que].join('\n');
159
- if (css) {
160
- addCss.que.clear();
161
- const s = document.createElement('style');
162
- s.id = `u${addCss.count++}`;
163
- s.innerHTML = css;
164
- document.head.appendChild(s);
165
- }
166
- }, 0);
167
- }
168
- exports.addCss = addCss;
169
- addCss.que = new Set();
170
- addCss.count = 0;
171
- /**
172
- * Injects css and creates unique class names
173
- *
174
- * - Skips if already added
175
- *
176
- * @param css - string or template string, to be injected
177
- * @returns a unique class name
178
- */
179
- function createClass(...p) {
180
- let css = t2s(...p);
181
- if (!css)
182
- return '';
183
- let className = createClass.history.get(css);
184
- if (!className) {
185
- className = 's' + createClass.count++;
186
- createClass.history.set(css, className);
187
- css = deleteComments(css);
188
- css = expandProps(css);
189
- css = expandArrayValues(css);
190
- const qs = findQueries(css);
191
- for (const q of qs.reverse()) {
192
- css = css.slice(0, q.start) + css.slice(q.end);
193
- }
194
- css = `.${className}{\n${css}\n}\n`;
195
- css += qs
196
- .map(q => {
197
- if (q.query.startsWith('&')) {
198
- return `.${className}${q.query.slice(1)}{\n${q.innerBody}\n}`;
199
- }
200
- if (q.query.startsWith('@keyframes')) {
201
- return q.outerBody;
202
- }
203
- return `${q.query}{\n.${className}{${q.innerBody}\n}\n}`;
204
- })
205
- .join('\n');
206
- css = trim(css) + '\n\n';
207
- addCss(css);
208
- }
209
- return className;
210
- }
211
- exports.createClass = createClass;
212
- createClass.count = 0;
213
- createClass.history = new Map();
214
160
  //# sourceMappingURL=createClass.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createClass.js","sourceRoot":"","sources":["../src/createClass.ts"],"names":[],"mappings":"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"}