@koala-ts/framework 0.1.0 → 1.0.0
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 +12 -27
- package/dist/core/application.d.ts +1 -1
- package/dist/core/application.d.ts.map +1 -1
- package/dist/core/application.js +9 -9
- package/dist/core/application.js.map +1 -1
- package/dist/core/response.d.ts +3 -0
- package/dist/core/response.d.ts.map +1 -0
- package/dist/core/response.js +14 -0
- package/dist/core/response.js.map +1 -0
- package/dist/core/route.d.ts +2 -2
- package/dist/core/route.d.ts.map +1 -1
- package/dist/core/route.js +10 -11
- package/dist/core/route.js.map +1 -1
- package/dist/core/types.d.ts +36 -24
- package/dist/core/types.d.ts.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,29 +1,14 @@
|
|
|
1
|
-
# Framework
|
|
1
|
+
# KoalaTs Framework 🐨
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
KoalaTs is a NodeJs, TypeScript-first framework with expressive syntax. KoalaTS is crafted for the laziest backend
|
|
4
|
+
developers because nothing pairs better with clean APIs than a good nap. The NodeJs ecosystem is vast and full of
|
|
5
|
+
sparse solutions that doesn't always play well together. KoalaTs aims to provide a cohesive and opinionated solution
|
|
6
|
+
that is easy to use and understand.
|
|
4
7
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
+ [x] Create responses from views
|
|
13
|
-
+ [x] Access request data
|
|
14
|
-
- [ ] Configuration
|
|
15
|
-
- [ ] Database
|
|
16
|
-
- [ ] Caching
|
|
17
|
-
- [ ] Task scheduling
|
|
18
|
-
- [ ] Queues
|
|
19
|
-
- [ ] Logging
|
|
20
|
-
- [ ] Events
|
|
21
|
-
- [ ] Security
|
|
22
|
-
+ [ ] Authentication
|
|
23
|
-
+ [ ] Authorization
|
|
24
|
-
+ [ ] Encryption and Hashing
|
|
25
|
-
+ [ ] Helmet
|
|
26
|
-
+ [ ] CORS
|
|
27
|
-
+ [ ] Rate limiting
|
|
28
|
-
- [ ] Console commands
|
|
29
|
-
- [x] Testing
|
|
8
|
+
## Documentation
|
|
9
|
+
|
|
10
|
+
You can find the documentation [here](https://koala-ts.github.io/docs/)
|
|
11
|
+
|
|
12
|
+
## License
|
|
13
|
+
|
|
14
|
+
KoalaTs is [MIT licensed](/LICENSE).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"application.d.ts","sourceRoot":"","sources":["../../src/core/application.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAkB,MAAM,SAAS,CAAC;AAIvD,OAAO,EAAE,YAAY,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"application.d.ts","sourceRoot":"","sources":["../../src/core/application.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAkB,MAAM,SAAS,CAAC;AAIvD,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAIzC,wBAAgB,MAAM,CAAC,CAAC,EAAE,YAAY,GAAG,YAAY,CAyBpD"}
|
package/dist/core/application.js
CHANGED
|
@@ -2,19 +2,19 @@ import Koa from 'koa';
|
|
|
2
2
|
import Router from '@koa/router';
|
|
3
3
|
import { getRoutes } from './route.js';
|
|
4
4
|
import { koaBody } from 'koa-body';
|
|
5
|
+
import { extendResponse } from './response.js';
|
|
5
6
|
export function create(_) {
|
|
6
7
|
const app = new Koa();
|
|
8
|
+
app.scope = app.context;
|
|
7
9
|
const router = new Router();
|
|
8
|
-
getRoutes().forEach((
|
|
9
|
-
const middlewareStack = [...
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
}
|
|
15
|
-
router[method](route.path, ...middlewareStack);
|
|
16
|
-
}
|
|
10
|
+
getRoutes().forEach(({ methods, path, middleware, handler, parseBody, bodyOptions, }) => {
|
|
11
|
+
const middlewareStack = [...middleware, handler];
|
|
12
|
+
methods.forEach(method => {
|
|
13
|
+
const routeMiddleware = parseBody ? [koaBody(bodyOptions), ...middlewareStack] : middlewareStack;
|
|
14
|
+
router[method](path, ...routeMiddleware);
|
|
15
|
+
});
|
|
17
16
|
});
|
|
17
|
+
app.use(extendResponse);
|
|
18
18
|
app.use(router.routes());
|
|
19
19
|
return app;
|
|
20
20
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"application.js","sourceRoot":"","sources":["../../src/core/application.ts"],"names":[],"mappings":"AACA,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEpC,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"application.js","sourceRoot":"","sources":["../../src/core/application.ts"],"names":[],"mappings":"AACA,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEpC,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACnC,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE5C,MAAM,UAAU,MAAM,CAAC,CAAe;IAClC,MAAM,GAAG,GAAG,IAAI,GAAG,EAAkB,CAAC;IACtC,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC;IAExB,MAAM,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;IAE5B,SAAS,EAAE,CAAC,OAAO,CAAC,CAAC,EACjB,OAAO,EACP,IAAI,EACJ,UAAU,EACV,OAAO,EACP,SAAS,EACT,WAAW,GACE,EAAE,EAAE;QACjB,MAAM,eAAe,GAAG,CAAC,GAAG,UAAU,EAAE,OAAO,CAAC,CAAC;QACjD,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;YACrB,MAAM,eAAe,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC;YACjG,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,GAAG,eAAe,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IACxB,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAEzB,OAAO,GAAG,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"response.d.ts","sourceRoot":"","sources":["../../src/core/response.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,KAAK,EAAa,KAAK,MAAM,EAAE,MAAM,SAAS,CAAC;AAE7D,wBAAsB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAiB9E"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export async function extendResponse(scope, next) {
|
|
2
|
+
scope.response.setHeader = function (name, value) {
|
|
3
|
+
scope.set(name, value);
|
|
4
|
+
return this;
|
|
5
|
+
};
|
|
6
|
+
scope.response.withHeaders = function (headers) {
|
|
7
|
+
Object.entries(headers).forEach(([name, value]) => {
|
|
8
|
+
scope.set(name, value);
|
|
9
|
+
});
|
|
10
|
+
return this;
|
|
11
|
+
};
|
|
12
|
+
await next();
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=response.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"response.js","sourceRoot":"","sources":["../../src/core/response.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,KAAa,EAAE,IAAW;IAC3D,KAAK,CAAC,QAAQ,CAAC,SAAS,GAAG,UAAU,IAAY,EAAE,KAAwB;QACvE,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAEvB,OAAO,IAAI,CAAC;IAChB,CAAC,CAAC;IAGF,KAAK,CAAC,QAAQ,CAAC,WAAW,GAAG,UAAU,OAA0C;QAC7E,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE;YAC9C,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC3B,CAAC,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC;IAChB,CAAC,CAAC;IAEF,MAAM,IAAI,EAAE,CAAC;AACjB,CAAC"}
|
package/dist/core/route.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import 'reflect-metadata';
|
|
2
|
-
import {
|
|
3
|
-
export declare function Route({ method, path,
|
|
2
|
+
import { IRoute, IRouteMetadata } from './types.js';
|
|
3
|
+
export declare function Route({ method, path, middleware, options }: IRoute): MethodDecorator;
|
|
4
4
|
export declare function getRoutes(): IRouteMetadata[];
|
|
5
5
|
//# sourceMappingURL=route.d.ts.map
|
package/dist/core/route.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../src/core/route.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAW,
|
|
1
|
+
{"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../src/core/route.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAW,MAAM,EAAE,cAAc,EAA8B,MAAM,SAAS,CAAC;AAItF,wBAAgB,KAAK,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,UAAe,EAAE,OAAY,EAAE,EAAE,MAAM,GAAG,eAAe,CAgB9F;AAED,wBAAgB,SAAS,IAAI,cAAc,EAAE,CAE5C"}
|
package/dist/core/route.js
CHANGED
|
@@ -1,29 +1,28 @@
|
|
|
1
1
|
import 'reflect-metadata';
|
|
2
2
|
const key = Symbol('Route');
|
|
3
|
-
export function Route({ method, path,
|
|
3
|
+
export function Route({ method, path, middleware = [], options = {} }) {
|
|
4
4
|
return function (target, propertyKey) {
|
|
5
5
|
const routes = Reflect.getMetadata(key, Reflect) || [];
|
|
6
|
+
const { parseBody, ...bodyOptions } = options;
|
|
6
7
|
routes.push({
|
|
7
8
|
path,
|
|
8
9
|
methods: qualifyMethod(method),
|
|
9
|
-
handler:
|
|
10
|
-
parseBody: parseBody,
|
|
11
|
-
middleware: middleware
|
|
10
|
+
handler: qualifyHandler(target, propertyKey),
|
|
11
|
+
parseBody: options.parseBody ?? true,
|
|
12
|
+
middleware: middleware,
|
|
13
|
+
bodyOptions: bodyOptions,
|
|
12
14
|
});
|
|
13
15
|
Reflect.defineMetadata(key, routes, Reflect);
|
|
14
16
|
};
|
|
15
17
|
}
|
|
16
18
|
export function getRoutes() {
|
|
17
|
-
return Reflect.getMetadata(key, Reflect)
|
|
19
|
+
return Reflect.getMetadata(key, Reflect) ?? [];
|
|
18
20
|
}
|
|
19
21
|
function qualifyMethod(method) {
|
|
20
|
-
const
|
|
21
|
-
|
|
22
|
-
return ['get', 'post', 'put', 'patch', 'delete', 'options', 'head'];
|
|
23
|
-
}
|
|
24
|
-
return [lowerMethod];
|
|
22
|
+
const methods = Array.isArray(method) ? method : [method];
|
|
23
|
+
return methods.flatMap(m => ['any', 'all'].includes(m.toLowerCase()) ? ['all'] : [m.toLowerCase()]);
|
|
25
24
|
}
|
|
26
|
-
function
|
|
25
|
+
function qualifyHandler(target, propertyKey) {
|
|
27
26
|
if (typeof target === 'function') {
|
|
28
27
|
return target;
|
|
29
28
|
}
|
package/dist/core/route.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route.js","sourceRoot":"","sources":["../../src/core/route.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAG1B,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;AAE5B,MAAM,UAAU,KAAK,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"route.js","sourceRoot":"","sources":["../../src/core/route.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAG1B,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;AAE5B,MAAM,UAAU,KAAK,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,EAAE,EAAE,OAAO,GAAG,EAAE,EAAU;IACzE,OAAO,UAAU,MAAc,EAAE,WAA4B;QACzD,MAAM,MAAM,GAAqB,OAAO,CAAC,WAAW,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;QACzE,MAAM,EAAE,SAAS,EAAE,GAAG,WAAW,EAAE,GAAG,OAAO,CAAC;QAE9C,MAAM,CAAC,IAAI,CAAC;YACR,IAAI;YACJ,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC;YAC9B,OAAO,EAAE,cAAc,CAAC,MAAM,EAAE,WAAW,CAAC;YAC5C,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,IAAI;YACpC,UAAU,EAAE,UAAU;YACtB,WAAW,EAAE,WAAW;SAC3B,CAAC,CAAC;QAEH,OAAO,CAAC,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IACjD,CAAC,CAAC;AACN,CAAC;AAED,MAAM,UAAU,SAAS;IACrB,OAAO,OAAO,CAAC,WAAW,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;AACnD,CAAC;AAED,SAAS,aAAa,CAAC,MAAmC;IACtD,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAC1D,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAmB,CAAC,CAAC,CAAC;AACzH,CAAC;AAED,SAAS,cAAc,CAAC,MAAe,EAAE,WAA4B;IACjE,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE,CAAC;QAC/B,OAAO,MAAiB,CAAC;IAC7B,CAAC;IAED,OAAQ,MAAc,CAAC,WAAW,CAAY,CAAC;AACnD,CAAC"}
|
package/dist/core/types.d.ts
CHANGED
|
@@ -1,44 +1,56 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
1
|
+
import Koa, { Context, DefaultState, Next, Request, Response } from 'koa';
|
|
2
|
+
import { KoaBodyMiddlewareOptions } from 'koa-body';
|
|
3
|
+
import { File } from 'formidable';
|
|
4
|
+
export type IApplication<StateT = IState, ScopeT = IScope> = Koa<StateT, ScopeT> & {
|
|
5
|
+
scope: IScope;
|
|
6
|
+
};
|
|
7
|
+
export interface IState extends DefaultState {
|
|
8
|
+
}
|
|
9
|
+
export interface IScope extends Context {
|
|
10
|
+
request: IRequest | IHttpRequest;
|
|
11
|
+
response: IResponse;
|
|
12
|
+
}
|
|
13
|
+
export interface IUploadedFile extends File {
|
|
14
|
+
}
|
|
15
|
+
export interface IFilesMap {
|
|
16
|
+
[file: string]: IUploadedFile | IUploadedFile[];
|
|
8
17
|
}
|
|
9
18
|
export interface IRequest extends Request {
|
|
10
|
-
body?:
|
|
11
|
-
|
|
12
|
-
|
|
19
|
+
body?: Record<string, any>;
|
|
20
|
+
files?: IFilesMap;
|
|
21
|
+
params: IScope['params'];
|
|
13
22
|
}
|
|
14
23
|
export interface IHttpRequest extends IRequest {
|
|
15
|
-
body:
|
|
16
|
-
[key: string]: any;
|
|
17
|
-
};
|
|
24
|
+
body: Record<string, any>;
|
|
18
25
|
}
|
|
19
|
-
export interface
|
|
20
|
-
|
|
26
|
+
export interface IResponse extends Response {
|
|
27
|
+
setHeader(name: string, value: string | string[]): IResponse;
|
|
28
|
+
withHeaders(headers: Record<string, string | string[]>): IResponse;
|
|
21
29
|
}
|
|
22
|
-
export interface IMiddleware
|
|
30
|
+
export interface IMiddleware {
|
|
23
31
|
(scope: IScope, next: INext): Promise<INext>;
|
|
24
32
|
}
|
|
25
33
|
export interface INext extends Next {
|
|
26
34
|
}
|
|
27
|
-
export interface Handler extends
|
|
35
|
+
export interface Handler extends IMiddleware {
|
|
28
36
|
}
|
|
29
|
-
export type THttpMethod = 'get' | 'post' | 'put' | 'patch' | 'delete' | 'options' | 'head' | 'any' | 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'OPTIONS' | 'HEAD' | 'ANY';
|
|
30
|
-
export type TRouterMethod = 'get' | 'post' | 'put' | 'patch' | 'delete' | 'options' | 'head';
|
|
37
|
+
export type THttpMethod = 'get' | 'post' | 'put' | 'patch' | 'delete' | 'options' | 'head' | 'any' | 'all' | 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'OPTIONS' | 'HEAD' | 'ANY' | 'ALL';
|
|
38
|
+
export type TRouterMethod = 'get' | 'post' | 'put' | 'patch' | 'delete' | 'options' | 'head' | 'all';
|
|
31
39
|
export interface IRouteMetadata {
|
|
32
40
|
path: string;
|
|
33
41
|
methods: TRouterMethod[];
|
|
34
42
|
handler: Handler;
|
|
35
43
|
parseBody: boolean;
|
|
36
|
-
middleware:
|
|
44
|
+
middleware: IMiddleware[];
|
|
45
|
+
bodyOptions: Partial<KoaBodyMiddlewareOptions>;
|
|
37
46
|
}
|
|
38
|
-
export
|
|
39
|
-
path: string;
|
|
40
|
-
method: THttpMethod;
|
|
47
|
+
export type IRouteOptions = Partial<KoaBodyMiddlewareOptions & {
|
|
41
48
|
parseBody?: boolean;
|
|
42
|
-
|
|
49
|
+
}>;
|
|
50
|
+
export interface IRoute {
|
|
51
|
+
path: string;
|
|
52
|
+
method: THttpMethod | THttpMethod[];
|
|
53
|
+
middleware?: IMiddleware[];
|
|
54
|
+
options?: IRouteOptions;
|
|
43
55
|
}
|
|
44
56
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/core/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAC1E,OAAO,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAElC,MAAM,MAAM,YAAY,CAAC,MAAM,GAAG,MAAM,EAAE,MAAM,GAAG,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG;IAC/E,KAAK,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,WAAW,MAAO,SAAQ,YAAY;CAC3C;AAED,MAAM,WAAW,MAAO,SAAQ,OAAO;IACnC,OAAO,EAAE,QAAQ,GAAG,YAAY,CAAC;IACjC,QAAQ,EAAE,SAAS,CAAC;CACvB;AAED,MAAM,WAAW,aAAc,SAAQ,IAAI;CAC1C;AAED,MAAM,WAAW,SAAS;IACtB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,aAAa,EAAE,CAAC;CACnD;AAED,MAAM,WAAW,QAAS,SAAQ,OAAO;IACrC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3B,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;CAC5B;AAED,MAAM,WAAW,YAAa,SAAQ,QAAQ;IAC1C,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC7B;AAED,MAAM,WAAW,SAAU,SAAQ,QAAQ;IACvC,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC;IAE7D,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,GAAG,SAAS,CAAC;CACtE;AAED,MAAM,WAAW,WAAW;IACxB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;CAChD;AAED,MAAM,WAAW,KAAM,SAAQ,IAAI;CAClC;AAED,MAAM,WAAW,OAAQ,SAAQ,WAAW;CAC3C;AAED,MAAM,MAAM,WAAW,GACjB,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,GAC3C,SAAS,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,GAClC,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAChC,QAAQ,GAAG,SAAS,GAAG,MAAM,GAC7B,KAAK,GAAG,KAAK,CAAC;AAEpB,MAAM,MAAM,aAAa,GACnB,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAChC,QAAQ,GAAG,SAAS,GAAG,MAAM,GAC7B,KAAK,CAAC;AAEZ,MAAM,WAAW,cAAc;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,WAAW,EAAE,CAAC;IAC1B,WAAW,EAAE,OAAO,CAAC,wBAAwB,CAAC,CAAC;CAClD;AAED,MAAM,MAAM,aAAa,GAAG,OAAO,CAAC,wBAAwB,GAAG;IAC3D,SAAS,CAAC,EAAE,OAAO,CAAC;CACvB,CAAC,CAAC;AAEH,MAAM,WAAW,MAAM;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,WAAW,GAAG,WAAW,EAAE,CAAC;IACpC,UAAU,CAAC,EAAE,WAAW,EAAE,CAAC;IAC3B,OAAO,CAAC,EAAE,aAAa,CAAC;CAC3B"}
|