node-tao 0.0.1
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/README.md +230 -0
- package/checks.d.ts +8 -0
- package/checks.d.ts.map +1 -0
- package/checks.js +37 -0
- package/checks.js.map +1 -0
- package/const.d.ts +24 -0
- package/const.d.ts.map +1 -0
- package/const.js +51 -0
- package/const.js.map +1 -0
- package/default-config.d.ts +4 -0
- package/default-config.d.ts.map +1 -0
- package/default-config.js +25 -0
- package/default-config.js.map +1 -0
- package/error/error.html +259 -0
- package/error-utils.d.ts +21 -0
- package/error-utils.d.ts.map +1 -0
- package/error-utils.js +163 -0
- package/error-utils.js.map +1 -0
- package/index.d.ts +3 -0
- package/index.d.ts.map +1 -0
- package/index.js +6 -0
- package/index.js.map +1 -0
- package/init.d.ts +12 -0
- package/init.d.ts.map +1 -0
- package/init.js +31 -0
- package/init.js.map +1 -0
- package/interfaces.d.ts +170 -0
- package/interfaces.d.ts.map +1 -0
- package/interfaces.js +3 -0
- package/interfaces.js.map +1 -0
- package/metrics.d.ts +16 -0
- package/metrics.d.ts.map +1 -0
- package/metrics.js +80 -0
- package/metrics.js.map +1 -0
- package/package.json +45 -0
- package/parsing-helpers.d.ts +8 -0
- package/parsing-helpers.d.ts.map +1 -0
- package/parsing-helpers.js +60 -0
- package/parsing-helpers.js.map +1 -0
- package/store.d.ts +29 -0
- package/store.d.ts.map +1 -0
- package/store.js +52 -0
- package/store.js.map +1 -0
- package/tao.d.ts +81 -0
- package/tao.d.ts.map +1 -0
- package/tao.js +533 -0
- package/tao.js.map +1 -0
- package/templates-access.d.ts +15 -0
- package/templates-access.d.ts.map +1 -0
- package/templates-access.js +38 -0
- package/templates-access.js.map +1 -0
- package/utils.d.ts +45 -0
- package/utils.d.ts.map +1 -0
- package/utils.js +227 -0
- package/utils.js.map +1 -0
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.checkForUnclosedPrefix = exports.handleQuotes = void 0;
|
|
4
|
+
const const_1 = require("./const");
|
|
5
|
+
const error_utils_1 = require("./error-utils");
|
|
6
|
+
function checkForUnclosedPrefix(templateData, expression, originalOpen, openingResultIndex, fileContent) {
|
|
7
|
+
if (templateData)
|
|
8
|
+
return;
|
|
9
|
+
const error = (0, error_utils_1.getParsingErrorData)(expression, openingResultIndex, `Unclosed prefix " ${originalOpen} "`, fileContent);
|
|
10
|
+
throw error;
|
|
11
|
+
}
|
|
12
|
+
exports.checkForUnclosedPrefix = checkForUnclosedPrefix;
|
|
13
|
+
/**
|
|
14
|
+
* Handle quotes and throw in case of an error.
|
|
15
|
+
*/
|
|
16
|
+
function handleQuotes(expression, original, closeResultIndex, fileContent) {
|
|
17
|
+
let lastIndex = 0;
|
|
18
|
+
const SINGLE_QUOTE = "'";
|
|
19
|
+
const DOUBLE_QUOTE = '"';
|
|
20
|
+
const LITERAL_QUOTE = '`';
|
|
21
|
+
if (original === SINGLE_QUOTE) {
|
|
22
|
+
lastIndex = handleSingleQuote(expression, original, closeResultIndex, fileContent);
|
|
23
|
+
}
|
|
24
|
+
else if (original === DOUBLE_QUOTE) {
|
|
25
|
+
lastIndex = handleDoubleQuote(expression, original, closeResultIndex, fileContent);
|
|
26
|
+
}
|
|
27
|
+
else if (original === LITERAL_QUOTE) {
|
|
28
|
+
lastIndex = handleLiteralQuote(expression, original, closeResultIndex, fileContent);
|
|
29
|
+
}
|
|
30
|
+
return lastIndex;
|
|
31
|
+
}
|
|
32
|
+
exports.handleQuotes = handleQuotes;
|
|
33
|
+
function handleSingleQuote(expression, original, closeResultIndex, fileContent) {
|
|
34
|
+
const_1.SINGLE_QUOTE_REGEX.lastIndex = closeResultIndex;
|
|
35
|
+
const singleQuoteMatch = const_1.SINGLE_QUOTE_REGEX.exec(expression);
|
|
36
|
+
if (!singleQuoteMatch) {
|
|
37
|
+
const error = (0, error_utils_1.getParsingErrorData)(expression, closeResultIndex, `Unclosed string " ${original} "`, fileContent);
|
|
38
|
+
throw error;
|
|
39
|
+
}
|
|
40
|
+
return const_1.SINGLE_QUOTE_REGEX.lastIndex;
|
|
41
|
+
}
|
|
42
|
+
function handleDoubleQuote(expression, original, closeResultIndex, fileContent) {
|
|
43
|
+
const_1.DOUBLE_QUOTE_REGEX.lastIndex = closeResultIndex;
|
|
44
|
+
const doubleQuoteMatch = const_1.DOUBLE_QUOTE_REGEX.exec(expression);
|
|
45
|
+
if (!doubleQuoteMatch) {
|
|
46
|
+
const error = (0, error_utils_1.getParsingErrorData)(expression, closeResultIndex, `Unclosed string " ${original} "`, fileContent);
|
|
47
|
+
throw error;
|
|
48
|
+
}
|
|
49
|
+
return const_1.DOUBLE_QUOTE_REGEX.lastIndex;
|
|
50
|
+
}
|
|
51
|
+
function handleLiteralQuote(expression, original, closeResultIndex, fileContent) {
|
|
52
|
+
const_1.LITERAL_REGEX.lastIndex = closeResultIndex;
|
|
53
|
+
const templateLitMatch = const_1.LITERAL_REGEX.exec(expression);
|
|
54
|
+
if (!templateLitMatch) {
|
|
55
|
+
const error = (0, error_utils_1.getParsingErrorData)(expression, closeResultIndex, `Unclosed string " ${original} "`, fileContent);
|
|
56
|
+
throw error;
|
|
57
|
+
}
|
|
58
|
+
return const_1.LITERAL_REGEX.lastIndex;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=parsing-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parsing-helpers.js","sourceRoot":"","sources":["../src/parsing-helpers.ts"],"names":[],"mappings":";;;AAAA,mCAAgF;AAChF,+CAAoD;AAGpD,SAAS,sBAAsB,CAC7B,YAAsC,EACtC,UAAkB,EAClB,YAAoB,EACpB,kBAA0B,EAC1B,WAAmB;IAEnB,IAAI,YAAY;QAAE,OAAO;IAEzB,MAAM,KAAK,GAAG,IAAA,iCAAmB,EAC/B,UAAU,EACV,kBAAkB,EAClB,qBAAqB,YAAY,IAAI,EACrC,WAAW,CACZ,CAAC;IAEF,MAAM,KAAK,CAAC;AACd,CAAC;AAgGsB,wDAAsB;AA9F7C;;GAEG;AACH,SAAS,YAAY,CACnB,UAAkB,EAClB,QAAgB,EAChB,gBAAwB,EACxB,WAAmB;IAEnB,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,MAAM,YAAY,GAAG,GAAG,CAAC;IACzB,MAAM,YAAY,GAAG,GAAG,CAAC;IACzB,MAAM,aAAa,GAAG,GAAG,CAAC;IAE1B,IAAI,QAAQ,KAAK,YAAY,EAAE;QAC7B,SAAS,GAAG,iBAAiB,CAAC,UAAU,EAAE,QAAQ,EAAE,gBAAgB,EAAE,WAAW,CAAC,CAAC;KACpF;SAAM,IAAI,QAAQ,KAAK,YAAY,EAAE;QACpC,SAAS,GAAG,iBAAiB,CAAC,UAAU,EAAE,QAAQ,EAAE,gBAAgB,EAAE,WAAW,CAAC,CAAC;KACpF;SAAM,IAAI,QAAQ,KAAK,aAAa,EAAE;QACrC,SAAS,GAAG,kBAAkB,CAAC,UAAU,EAAE,QAAQ,EAAE,gBAAgB,EAAE,WAAW,CAAC,CAAC;KACrF;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAuEQ,oCAAY;AArErB,SAAS,iBAAiB,CACxB,UAAkB,EAClB,QAAgB,EAChB,gBAAwB,EACxB,WAAmB;IAEnB,0BAAkB,CAAC,SAAS,GAAG,gBAAgB,CAAC;IAEhD,MAAM,gBAAgB,GAAG,0BAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC7D,IAAI,CAAC,gBAAgB,EAAE;QACrB,MAAM,KAAK,GAAG,IAAA,iCAAmB,EAC/B,UAAU,EACV,gBAAgB,EAChB,qBAAqB,QAAQ,IAAI,EACjC,WAAW,CACZ,CAAC;QAEF,MAAM,KAAK,CAAC;KACb;IAED,OAAO,0BAAkB,CAAC,SAAS,CAAC;AACtC,CAAC;AAED,SAAS,iBAAiB,CACxB,UAAkB,EAClB,QAAgB,EAChB,gBAAwB,EACxB,WAAmB;IAEnB,0BAAkB,CAAC,SAAS,GAAG,gBAAgB,CAAC;IAChD,MAAM,gBAAgB,GAAG,0BAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAE7D,IAAI,CAAC,gBAAgB,EAAE;QACrB,MAAM,KAAK,GAAG,IAAA,iCAAmB,EAC/B,UAAU,EACV,gBAAgB,EAChB,qBAAqB,QAAQ,IAAI,EACjC,WAAW,CACZ,CAAC;QAEF,MAAM,KAAK,CAAC;KACb;IAED,OAAO,0BAAkB,CAAC,SAAS,CAAC;AACtC,CAAC;AAED,SAAS,kBAAkB,CACzB,UAAkB,EAClB,QAAgB,EAChB,gBAAwB,EACxB,WAAmB;IAEnB,qBAAa,CAAC,SAAS,GAAG,gBAAgB,CAAC;IAC3C,MAAM,gBAAgB,GAAG,qBAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAExD,IAAI,CAAC,gBAAgB,EAAE;QACrB,MAAM,KAAK,GAAG,IAAA,iCAAmB,EAC/B,UAAU,EACV,gBAAgB,EAChB,qBAAqB,QAAQ,IAAI,EACjC,WAAW,CACZ,CAAC;QAEF,MAAM,KAAK,CAAC;KACb;IAED,OAAO,qBAAa,CAAC,SAAS,CAAC;AACjC,CAAC"}
|
package/store.d.ts
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export declare class Store<T> {
|
|
2
|
+
private store;
|
|
3
|
+
/**
|
|
4
|
+
* Set a new cache entry.
|
|
5
|
+
*/
|
|
6
|
+
set(key: string, value: T): void;
|
|
7
|
+
/**
|
|
8
|
+
* Get a cached value.
|
|
9
|
+
*/
|
|
10
|
+
get(key: string): T | undefined;
|
|
11
|
+
/**
|
|
12
|
+
* Get all cached values.
|
|
13
|
+
*/
|
|
14
|
+
getAll(): Record<string, T>;
|
|
15
|
+
/**
|
|
16
|
+
* Remove keys from cache.
|
|
17
|
+
* Return the number of entries deleted.
|
|
18
|
+
*/
|
|
19
|
+
remove(...keys: string[]): number;
|
|
20
|
+
/**
|
|
21
|
+
* Reset cache store.
|
|
22
|
+
*/
|
|
23
|
+
reset(): void;
|
|
24
|
+
/**
|
|
25
|
+
* Load cached values in the store.
|
|
26
|
+
*/
|
|
27
|
+
load(cached: Record<string, T>): void;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=store.d.ts.map
|
package/store.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAAA,qBAAa,KAAK,CAAC,CAAC;IAClB,OAAO,CAAC,KAAK,CAAyB;IACtC;;OAEG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAIzB;;OAEG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IAI/B;;OAEG;IACH,MAAM;IAIN;;;OAGG;IACH,MAAM,CAAC,GAAG,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM;IAWjC;;OAEG;IACH,KAAK;IAIL;;OAEG;IACH,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;CAG/B"}
|
package/store.js
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Store = void 0;
|
|
4
|
+
class Store {
|
|
5
|
+
constructor() {
|
|
6
|
+
this.store = {};
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Set a new cache entry.
|
|
10
|
+
*/
|
|
11
|
+
set(key, value) {
|
|
12
|
+
this.store[key] = value;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Get a cached value.
|
|
16
|
+
*/
|
|
17
|
+
get(key) {
|
|
18
|
+
return this.store[key];
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Get all cached values.
|
|
22
|
+
*/
|
|
23
|
+
getAll() {
|
|
24
|
+
return this.store;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Remove keys from cache.
|
|
28
|
+
* Return the number of entries deleted.
|
|
29
|
+
*/
|
|
30
|
+
remove(...keys) {
|
|
31
|
+
let deletedCount = 0;
|
|
32
|
+
for (const key of keys) {
|
|
33
|
+
delete this.store[key];
|
|
34
|
+
deletedCount += 1;
|
|
35
|
+
}
|
|
36
|
+
return deletedCount;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Reset cache store.
|
|
40
|
+
*/
|
|
41
|
+
reset() {
|
|
42
|
+
this.store = {};
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Load cached values in the store.
|
|
46
|
+
*/
|
|
47
|
+
load(cached) {
|
|
48
|
+
this.store = Object.assign(Object.assign({}, this.store), cached);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
exports.Store = Store;
|
|
52
|
+
//# sourceMappingURL=store.js.map
|
package/store.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":";;;AAAA,MAAa,KAAK;IAAlB;QACU,UAAK,GAAsB,EAAE,CAAC;IAkDxC,CAAC;IAjDC;;OAEG;IACH,GAAG,CAAC,GAAW,EAAE,KAAQ;QACvB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,GAAW;QACb,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,MAAM;QACJ,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,GAAG,IAAc;QACtB,IAAI,YAAY,GAAG,CAAC,CAAC;QAErB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;YACtB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACvB,YAAY,IAAI,CAAC,CAAC;SACnB;QAED,OAAO,YAAY,CAAC;IACtB,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;IAClB,CAAC;IAED;;OAEG;IACH,IAAI,CAAC,MAAyB;QAC5B,IAAI,CAAC,KAAK,mCAAQ,IAAI,CAAC,KAAK,GAAK,MAAM,CAAE,CAAC;IAC5C,CAAC;CACF;AAnDD,sBAmDC"}
|
package/tao.d.ts
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { Data, Helpers, HelperFunction, options } from './interfaces';
|
|
2
|
+
import { Store } from './store';
|
|
3
|
+
export declare class Tao {
|
|
4
|
+
private config;
|
|
5
|
+
private templatePaths;
|
|
6
|
+
private prefixBuild;
|
|
7
|
+
/**
|
|
8
|
+
* Stores already compiled templates.
|
|
9
|
+
*/
|
|
10
|
+
compiledStore: Store<string>;
|
|
11
|
+
/**
|
|
12
|
+
* Stores dynamically defined templates.
|
|
13
|
+
*/
|
|
14
|
+
dynamictemplatesStore: Store<string>;
|
|
15
|
+
/**
|
|
16
|
+
* Stores global helpers.
|
|
17
|
+
*/
|
|
18
|
+
helpersStore: Store<HelperFunction>;
|
|
19
|
+
private parentTemplate;
|
|
20
|
+
private childrenStore;
|
|
21
|
+
constructor(customConfig?: options);
|
|
22
|
+
private initializeConfig;
|
|
23
|
+
/**
|
|
24
|
+
* Get an array of absolute paths of the mapped files according to the view directory provided.
|
|
25
|
+
*/
|
|
26
|
+
get mappedFiles(): string[];
|
|
27
|
+
private getMetrics;
|
|
28
|
+
private compileChild;
|
|
29
|
+
private compile;
|
|
30
|
+
private parse;
|
|
31
|
+
/**
|
|
32
|
+
* Render a template with data and helpers.
|
|
33
|
+
* @param template The path of your template to render.
|
|
34
|
+
* @param data The data to inject.
|
|
35
|
+
* @param helpers The helpers functions to inject.
|
|
36
|
+
*/
|
|
37
|
+
render(template: string, data?: Data, helpers?: Helpers): string;
|
|
38
|
+
/**
|
|
39
|
+
* Render a child component. Called inside the parent template.
|
|
40
|
+
*/
|
|
41
|
+
private renderChild;
|
|
42
|
+
private compileAndExecuteChild;
|
|
43
|
+
private compileAndExecute;
|
|
44
|
+
private manageError;
|
|
45
|
+
private executeChildFunction;
|
|
46
|
+
private handleChildError;
|
|
47
|
+
private executeFunction;
|
|
48
|
+
private handleErrorMessage;
|
|
49
|
+
private initErrorTemplate;
|
|
50
|
+
private compileChildAndCache;
|
|
51
|
+
private compileAndCache;
|
|
52
|
+
private readChildFileAndGetCompiledFn;
|
|
53
|
+
private readFileAndGetCompiledFn;
|
|
54
|
+
/**
|
|
55
|
+
* Sync version is preferable, since HTML file are normally small (<100 Ko)
|
|
56
|
+
* and should be cached.
|
|
57
|
+
*/
|
|
58
|
+
private readFile;
|
|
59
|
+
/**
|
|
60
|
+
* Handle dynamically defined templates
|
|
61
|
+
*/
|
|
62
|
+
private handleLoadedTemplate;
|
|
63
|
+
private handleLoadedChildTemplate;
|
|
64
|
+
/**
|
|
65
|
+
* Handle dynamically defined templates
|
|
66
|
+
*/
|
|
67
|
+
private compileLoadedTemplate;
|
|
68
|
+
private compileLoadedChildTemplate;
|
|
69
|
+
/**
|
|
70
|
+
* Define global helpers. Define once, use everywhere.
|
|
71
|
+
* @param helpers An object of helpers.
|
|
72
|
+
*/
|
|
73
|
+
defineHelpers(helpers?: Helpers): void;
|
|
74
|
+
/**
|
|
75
|
+
* Load dynamically defined templates.
|
|
76
|
+
* @param name The name of your template. Should start with a '@'.
|
|
77
|
+
* @param template The template content.
|
|
78
|
+
*/
|
|
79
|
+
loadTemplate(name: string, template: string): void;
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=tao.d.ts.map
|
package/tao.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tao.d.ts","sourceRoot":"","sources":["../src/tao.ts"],"names":[],"mappings":"AA2BA,OAAO,EAGL,IAAI,EACJ,OAAO,EACP,cAAc,EAId,OAAO,EASR,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAchC,qBAAa,GAAG;IACd,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,WAAW,CAAM;IAEzB;;OAEG;IACI,aAAa,gBAAuB;IAC3C;;OAEG;IACI,qBAAqB,gBAAuB;IACnD;;OAEG;IACI,YAAY,wBAA+B;IAGlD,OAAO,CAAC,cAAc,CAAM;IAE5B,OAAO,CAAC,aAAa,CAAyB;gBAElC,YAAY,GAAE,OAAY;IAMtC,OAAO,CAAC,gBAAgB;IAaxB;;OAEG;IACH,IAAI,WAAW,aAEd;IAED,OAAO,CAAC,UAAU;IAYlB,OAAO,CAAC,YAAY;IAmBpB,OAAO,CAAC,OAAO;IA4Bf,OAAO,CAAC,KAAK;IAmEb;;;;;OAKG;IACH,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,GAAE,IAAS,EAAE,OAAO,GAAE,OAAY,GAAG,MAAM;IAgGxE;;OAEG;IACH,OAAO,CAAC,WAAW;IAiFnB,OAAO,CAAC,sBAAsB;IAsB9B,OAAO,CAAC,iBAAiB;IAwBzB,OAAO,CAAC,WAAW;IAWnB,OAAO,CAAC,oBAAoB;IAuB5B,OAAO,CAAC,gBAAgB;IAUxB,OAAO,CAAC,eAAe;IAyBvB,OAAO,CAAC,kBAAkB;IAsB1B,OAAO,CAAC,iBAAiB;IAQzB,OAAO,CAAC,oBAAoB;IAU5B,OAAO,CAAC,eAAe;IAUvB,OAAO,CAAC,6BAA6B;IAuBrC,OAAO,CAAC,wBAAwB;IAuBhC;;;OAGG;IACH,OAAO,CAAC,QAAQ;IAWhB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAmB5B,OAAO,CAAC,yBAAyB;IAkBjC;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAe7B,OAAO,CAAC,0BAA0B;IAgBlC;;;OAGG;IACH,aAAa,CAAC,OAAO,GAAE,OAAY;IAanC;;;;OAIG;IACH,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;CAc5C"}
|