dinegg 3.8.3 → 3.9.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/decorator/ControllerDecorator.d.ts +2 -3
- package/decorator/ControllerDecorator.js +32 -8
- package/decorator/permission.d.ts +1 -1
- package/decorator/permission.js +26 -15
- package/decorator/routeMetadata.d.ts +11 -0
- package/decorator/routeMetadata.js +18 -0
- package/lib/core/controller/dineggControllerInitializer.js +14 -7
- package/package.json +1 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { Application
|
|
1
|
+
import { Application } from "egg";
|
|
2
2
|
import "reflect-metadata";
|
|
3
|
-
|
|
3
|
+
import { MiddlewaresType } from "./routeMetadata";
|
|
4
4
|
/** 装饰器,get请求 */
|
|
5
5
|
export declare function get(path: string | string[], middlewares?: MiddlewaresType): (target: any, name: string, descriptor: PropertyDescriptor) => void;
|
|
6
6
|
/** 装饰器,post请求 */
|
|
@@ -24,4 +24,3 @@ export declare function controller(opt: {
|
|
|
24
24
|
* 遍历所有的控制器方法然后绑定
|
|
25
25
|
*/
|
|
26
26
|
export declare function bindRouter(app: Application): void;
|
|
27
|
-
export {};
|
|
@@ -2,26 +2,50 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.bindRouter = exports.controller = exports.patch = exports.del = exports.put = exports.post = exports.get = void 0;
|
|
4
4
|
require("reflect-metadata");
|
|
5
|
-
const
|
|
5
|
+
const routeMetadata_1 = require("./routeMetadata");
|
|
6
6
|
const controllerMappingKey = Symbol.for("dinegg#controllerMapping");
|
|
7
7
|
/**
|
|
8
8
|
* factory create a route bind . decorator for class method.
|
|
9
9
|
*/
|
|
10
10
|
function createRoute(method = "get", path, middlewares) {
|
|
11
|
-
//
|
|
11
|
+
// 24.10.26 use Reflect Metadata
|
|
12
12
|
return function (target, name, descriptor) {
|
|
13
|
-
if (
|
|
14
|
-
|
|
13
|
+
if (typeof descriptor.value !== "function")
|
|
14
|
+
return;
|
|
15
|
+
let routeMetadata = (0, routeMetadata_1.getRouteMetaData)(target.constructor);
|
|
16
|
+
if (!routeMetadata[name]) {
|
|
17
|
+
routeMetadata[name] = [];
|
|
15
18
|
}
|
|
16
19
|
if (Array.isArray(path)) {
|
|
17
20
|
for (const pathItem of path) {
|
|
18
|
-
|
|
21
|
+
routeMetadata[name].push({
|
|
22
|
+
method: method,
|
|
23
|
+
path: pathItem,
|
|
24
|
+
middlewares,
|
|
25
|
+
});
|
|
19
26
|
}
|
|
20
27
|
}
|
|
21
28
|
else {
|
|
22
|
-
|
|
29
|
+
routeMetadata[name].push({ method: method, path, middlewares });
|
|
23
30
|
}
|
|
24
31
|
};
|
|
32
|
+
// return function (target: any, name: string, descriptor: PropertyDescriptor) {
|
|
33
|
+
// if (typeof descriptor.value !== "function") return;
|
|
34
|
+
// if (!descriptor.value[routeSymbolKey]) {
|
|
35
|
+
// descriptor.value[routeSymbolKey] = [];
|
|
36
|
+
// }
|
|
37
|
+
// if (Array.isArray(path)) {
|
|
38
|
+
// for (const pathItem of path) {
|
|
39
|
+
// descriptor.value[routeSymbolKey].push({
|
|
40
|
+
// method: method,
|
|
41
|
+
// path: pathItem,
|
|
42
|
+
// middlewares,
|
|
43
|
+
// });
|
|
44
|
+
// }
|
|
45
|
+
// } else {
|
|
46
|
+
// descriptor.value[routeSymbolKey].push({ method: method, path, middlewares });
|
|
47
|
+
// }
|
|
48
|
+
// };
|
|
25
49
|
}
|
|
26
50
|
/** 装饰器,get请求 */
|
|
27
51
|
function get(path, middlewares) {
|
|
@@ -73,7 +97,7 @@ function reduceControllerMethod(router, controller) {
|
|
|
73
97
|
return reduceControllerMethod(router, controller[item]);
|
|
74
98
|
}
|
|
75
99
|
//若函数,注册路由 note : 此处之所以能拿到,是因为dinegg重写了控制器的loader
|
|
76
|
-
const routeObjArr = controller[item][routeSymbolKey];
|
|
100
|
+
const routeObjArr = controller[item][routeMetadata_1.routeSymbolKey];
|
|
77
101
|
if (!routeObjArr || !Array.isArray(routeObjArr)) {
|
|
78
102
|
return;
|
|
79
103
|
}
|
|
@@ -123,4 +147,4 @@ function bindRouter(app) {
|
|
|
123
147
|
reduceControllerMethod(app.router, app.controller);
|
|
124
148
|
}
|
|
125
149
|
exports.bindRouter = bindRouter;
|
|
126
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
150
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udHJvbGxlckRlY29yYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIkNvbnRyb2xsZXJEZWNvcmF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBVUEsNEJBQTBCO0FBQzFCLG1EQUFvRjtBQUVwRixNQUFNLG9CQUFvQixHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsMEJBQTBCLENBQUMsQ0FBQztBQUlwRTs7R0FFRztBQUNILFNBQVMsV0FBVyxDQUNuQixTQUFzQixLQUFLLEVBQzNCLElBQXVCLEVBQ3ZCLFdBQTZCO0lBRTdCLGdDQUFnQztJQUNoQyxPQUFPLFVBQVUsTUFBVyxFQUFFLElBQVksRUFBRSxVQUE4QjtRQUN6RSxJQUFJLE9BQU8sVUFBVSxDQUFDLEtBQUssS0FBSyxVQUFVO1lBQUUsT0FBTztRQUVuRCxJQUFJLGFBQWEsR0FBRyxJQUFBLGdDQUFnQixFQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUV6RCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3pCLGFBQWEsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7U0FDekI7UUFFRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDeEIsS0FBSyxNQUFNLFFBQVEsSUFBSSxJQUFJLEVBQUU7Z0JBQzVCLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUM7b0JBQ3hCLE1BQU0sRUFBRSxNQUFNO29CQUNkLElBQUksRUFBRSxRQUFRO29CQUNkLFdBQVc7aUJBQ1gsQ0FBQyxDQUFDO2FBQ0g7U0FDRDthQUFNO1lBQ04sYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUM7U0FDaEU7SUFDRixDQUFDLENBQUM7SUFDRixnRkFBZ0Y7SUFDaEYsdURBQXVEO0lBRXZELDRDQUE0QztJQUM1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
|
|
@@ -3,7 +3,7 @@ import { Application, Context } from "egg";
|
|
|
3
3
|
* 绑定方法权限标识的装饰器,实现控制器http请求时的权限控制
|
|
4
4
|
* - 需外部定义角色验证规则来配合
|
|
5
5
|
*/
|
|
6
|
-
export declare function permission(permId: string | string[]): (prototype:
|
|
6
|
+
export declare function permission(permId: string | string[]): (prototype: Object, property: string, descriptor: PropertyDescriptor) => void;
|
|
7
7
|
/** 定义抽象类外部继承实现权限控制自定义类 */
|
|
8
8
|
export declare abstract class AbstractPermissionAccessControl implements PermissionAccessControl {
|
|
9
9
|
app: Application;
|
package/decorator/permission.js
CHANGED
|
@@ -1,20 +1,30 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.AbstractPermissionAccessControl = exports.permission = void 0;
|
|
4
|
-
const routeSymbolKey = Symbol.for("dinegg#Route");
|
|
5
4
|
const permissionSymbolKey = Symbol.for("dinegg#permissionAccessControl");
|
|
6
5
|
/** 权限控制函数 */
|
|
7
6
|
async function checkAccess(permId, methodName, ctx, app) {
|
|
8
7
|
// @ts-ignore 该属性为一个类,由外部用户定义,提供控制方法权限的自定义实现类
|
|
9
8
|
if (!app.PermissionAccessControl) {
|
|
10
9
|
// 如果用户未定义权限控制自定义类,则执行到此处表示想要控制却没有定义类,应该报错。
|
|
11
|
-
return {
|
|
10
|
+
return {
|
|
11
|
+
isError: true,
|
|
12
|
+
msg: `PermissionAccessControl Error: the app.PermissionAccessControl Class is not provide.`,
|
|
13
|
+
};
|
|
12
14
|
}
|
|
13
15
|
app.coreLogger.debug("方法权限控制:%s %s %s", permId, methodName, ctx.request.path);
|
|
14
16
|
// @ts-ignore
|
|
15
|
-
const ins = new app.PermissionAccessControl({
|
|
17
|
+
const ins = new app.PermissionAccessControl({
|
|
18
|
+
ctx,
|
|
19
|
+
app,
|
|
20
|
+
permId,
|
|
21
|
+
methodName,
|
|
22
|
+
});
|
|
16
23
|
if (!ins.main) {
|
|
17
|
-
return {
|
|
24
|
+
return {
|
|
25
|
+
isError: true,
|
|
26
|
+
msg: `PermissionAccessControl Error: the Class must be provide the [main] method and it should return Promise.`,
|
|
27
|
+
};
|
|
18
28
|
}
|
|
19
29
|
try {
|
|
20
30
|
const res = await ins.main();
|
|
@@ -39,17 +49,19 @@ async function checkAccess(permId, methodName, ctx, app) {
|
|
|
39
49
|
*/
|
|
40
50
|
function permission(permId) {
|
|
41
51
|
permId = Array.isArray(permId) ? permId : [permId];
|
|
42
|
-
// @ts-ignore
|
|
43
52
|
return function (prototype, property, descriptor) {
|
|
44
53
|
const oldMethod = descriptor.value;
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
54
|
+
let metaPermId = Reflect.getMetadata(permissionSymbolKey, prototype, property);
|
|
55
|
+
if (!metaPermId) {
|
|
56
|
+
metaPermId = [];
|
|
57
|
+
Reflect.defineMetadata(permissionSymbolKey, metaPermId, prototype, property);
|
|
58
|
+
}
|
|
59
|
+
metaPermId.push(...permId);
|
|
48
60
|
// 这里this可能是controller的实例,也可能是service的实例
|
|
49
|
-
descriptor.value = async function () {
|
|
50
|
-
const checkResult = await checkAccess(
|
|
61
|
+
descriptor.value = async function (...args) {
|
|
62
|
+
const checkResult = await checkAccess(Reflect.getMetadata(permissionSymbolKey, prototype, property) || [], property, this.ctx, this.app);
|
|
51
63
|
if (checkResult.isError) {
|
|
52
|
-
this.ctx.status =
|
|
64
|
+
this.ctx.status = 401; //设置400响应 http
|
|
53
65
|
// 权限校验未通过,按标准设置响应前端json
|
|
54
66
|
return {
|
|
55
67
|
code: 50000,
|
|
@@ -58,10 +70,9 @@ function permission(permId) {
|
|
|
58
70
|
details: [checkResult.msg],
|
|
59
71
|
};
|
|
60
72
|
}
|
|
61
|
-
return await oldMethod.apply(this,
|
|
73
|
+
return await oldMethod.apply(this, args);
|
|
62
74
|
};
|
|
63
|
-
descriptor.value[
|
|
64
|
-
descriptor.value[permissionSymbolKey] = oldMethod[permissionSymbolKey];
|
|
75
|
+
// descriptor.value[permissionSymbolKey] = oldMethod[permissionSymbolKey];
|
|
65
76
|
};
|
|
66
77
|
}
|
|
67
78
|
exports.permission = permission;
|
|
@@ -75,4 +86,4 @@ class AbstractPermissionAccessControl {
|
|
|
75
86
|
}
|
|
76
87
|
}
|
|
77
88
|
exports.AbstractPermissionAccessControl = AbstractPermissionAccessControl;
|
|
78
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
89
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInBlcm1pc3Npb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEsTUFBTSxtQkFBbUIsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLGdDQUFnQyxDQUFDLENBQUM7QUFFekUsYUFBYTtBQUNiLEtBQUssVUFBVSxXQUFXLENBQUMsTUFBZ0IsRUFBRSxVQUFrQixFQUFFLEdBQVksRUFBRSxHQUFnQjtJQUM5Riw2Q0FBNkM7SUFDN0MsSUFBSSxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsRUFBRTtRQUNqQywyQ0FBMkM7UUFDM0MsT0FBTztZQUNOLE9BQU8sRUFBRSxJQUFJO1lBQ2IsR0FBRyxFQUFFLHNGQUFzRjtTQUMzRixDQUFDO0tBQ0Y7SUFDRCxHQUFHLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFOUUsYUFBYTtJQUNiLE1BQU0sR0FBRyxHQUE0QixJQUFJLEdBQUcsQ0FBQyx1QkFBdUIsQ0FBQztRQUNwRSxHQUFHO1FBQ0gsR0FBRztRQUNILE1BQU07UUFDTixVQUFVO0tBQ1YsQ0FBQyxDQUFDO0lBQ0gsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUU7UUFDZCxPQUFPO1lBQ04sT0FBTyxFQUFFLElBQUk7WUFDYixHQUFHLEVBQUUsMEdBQTBHO1NBQy9HLENBQUM7S0FDRjtJQUNELElBQUk7UUFDSCxNQUFNLEdBQUcsR0FBRyxNQUFNLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUM3QixJQUFJLEdBQUcsSUFBSSxJQUFJO1lBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDO1FBQ3RELElBQUksR0FBRyxLQUFLLEtBQUssRUFBRTtZQUNsQixPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUks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
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Context } from "egg";
|
|
2
|
+
export declare const routeSymbolKey: unique symbol;
|
|
3
|
+
/** 函数名绑定的路由列表,key为函数名 */
|
|
4
|
+
export type RouteMetaData = Record<string, {
|
|
5
|
+
method: string;
|
|
6
|
+
path: string;
|
|
7
|
+
middlewares?: MiddlewaresType;
|
|
8
|
+
}[]>;
|
|
9
|
+
export type MiddlewaresType = ((ctx: Context, next: () => Promise<void>) => Promise<void>)[];
|
|
10
|
+
export declare function setRouteMetaData(obj: Object, value: RouteMetaData): void;
|
|
11
|
+
export declare function getRouteMetaData(obj: Object): RouteMetaData;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getRouteMetaData = exports.setRouteMetaData = exports.routeSymbolKey = void 0;
|
|
4
|
+
exports.routeSymbolKey = Symbol.for("dinegg#Route");
|
|
5
|
+
function setRouteMetaData(obj, value) {
|
|
6
|
+
return Reflect.defineMetadata(exports.routeSymbolKey, value, obj, "routes");
|
|
7
|
+
}
|
|
8
|
+
exports.setRouteMetaData = setRouteMetaData;
|
|
9
|
+
function getRouteMetaData(obj) {
|
|
10
|
+
let value = Reflect.getMetadata(exports.routeSymbolKey, obj, "routes");
|
|
11
|
+
if (!value) {
|
|
12
|
+
value = {};
|
|
13
|
+
setRouteMetaData(obj, value);
|
|
14
|
+
}
|
|
15
|
+
return value;
|
|
16
|
+
}
|
|
17
|
+
exports.getRouteMetaData = getRouteMetaData;
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGVNZXRhZGF0YS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInJvdXRlTWV0YWRhdGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRWEsUUFBQSxjQUFjLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztBQVV6RCxTQUFnQixnQkFBZ0IsQ0FBQyxHQUFXLEVBQUUsS0FBb0I7SUFDakUsT0FBTyxPQUFPLENBQUMsY0FBYyxDQUFDLHNCQUFjLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBQyxRQUFRLENBQUMsQ0FBQztBQUNwRSxDQUFDO0FBRkQsNENBRUM7QUFFRCxTQUFnQixnQkFBZ0IsQ0FBQyxHQUFXO0lBQzNDLElBQUksS0FBSyxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUMsc0JBQWMsRUFBRSxHQUFHLEVBQUMsUUFBUSxDQUFrQixDQUFDO0lBQy9FLElBQUksQ0FBQyxLQUFLLEVBQUU7UUFDWCxLQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ1gsZ0JBQWdCLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO0tBQzdCO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZCxDQUFDO0FBUEQsNENBT0MifQ==
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
// @ts-nocheck
|
|
2
2
|
"use strict";
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
const routeMetadata_1 = require("../../../decorator/routeMetadata");
|
|
4
5
|
/** dinegg
|
|
5
6
|
* 特殊的controller为了使用装饰器,替换使用egg-core内的初始化方法
|
|
6
7
|
* 复制egg-core中的loader controller进行改造的,如果官方修改了该文件,也需要跟随一起改。
|
|
@@ -10,7 +11,6 @@ const is = require("is-type-of");
|
|
|
10
11
|
const utility = require("utility");
|
|
11
12
|
const utils = require("egg-core/lib/utils");
|
|
12
13
|
const FULLPATH = require("egg-core/lib/loader/file_loader").FULLPATH;
|
|
13
|
-
const touteSymbol = Symbol.for("dinegg#Route");
|
|
14
14
|
const controllerMappingSymbol = Symbol.for("dinegg#controllerMapping");
|
|
15
15
|
const roleSymbolKey = Symbol.for("dinegg#controllerRole");
|
|
16
16
|
/** dinegg框架改造后的控制器入口,
|
|
@@ -24,7 +24,10 @@ function default_1(obj, opt) {
|
|
|
24
24
|
// return class HomeController extends app.Controller {};
|
|
25
25
|
// }
|
|
26
26
|
// ```
|
|
27
|
-
if (is.function(obj) &&
|
|
27
|
+
if (is.function(obj) &&
|
|
28
|
+
!is.generatorFunction(obj) &&
|
|
29
|
+
!is.class(obj) &&
|
|
30
|
+
!is.asyncFunction(obj)) {
|
|
28
31
|
obj = obj(this.app);
|
|
29
32
|
}
|
|
30
33
|
if (is.class(obj)) {
|
|
@@ -60,9 +63,11 @@ function wrapClass(Controller) {
|
|
|
60
63
|
// prevent to override sub method
|
|
61
64
|
if (is.function(d.value) && !ret.hasOwnProperty(key)) {
|
|
62
65
|
ret[key] = methodToMiddleware(Controller, key);
|
|
63
|
-
ret[key][FULLPATH] =
|
|
64
|
-
|
|
65
|
-
|
|
66
|
+
ret[key][FULLPATH] =
|
|
67
|
+
Controller.prototype.fullPath + "#" + Controller.name + "." + key + "()";
|
|
68
|
+
// 24.10.26 使用Reflect获取绑定的路由,但注意只有最外层控制器类才行,继承类如果有装饰器绑定路由,则不会生效
|
|
69
|
+
const routes = (0, routeMetadata_1.getRouteMetaData)(Controller);
|
|
70
|
+
ret[key][routeMetadata_1.routeSymbolKey] = routes[key] || [];
|
|
66
71
|
// note 支持在控制器类构造函数上绑定一个控制器通用的路由mapping 类型为字符串数组
|
|
67
72
|
ret[controllerMappingSymbol] = Controller[controllerMappingSymbol];
|
|
68
73
|
}
|
|
@@ -79,7 +84,9 @@ function wrapClass(Controller) {
|
|
|
79
84
|
}
|
|
80
85
|
// 不要egg的参数,直接传入常用的body,query,params
|
|
81
86
|
args = [this.request.body, this.request.query, this.params];
|
|
82
|
-
const ctrls = utils
|
|
87
|
+
const ctrls = utils
|
|
88
|
+
.callFn(controller[key], args, controller)
|
|
89
|
+
.then((res) => {
|
|
83
90
|
// console.log("ctrls", res);
|
|
84
91
|
if (res) {
|
|
85
92
|
controller.ctx.body = res;
|
|
@@ -121,4 +128,4 @@ function wrapObject(obj, path, prefix) {
|
|
|
121
128
|
return objectControllerMiddleware;
|
|
122
129
|
}
|
|
123
130
|
}
|
|
124
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
131
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGluZWdnQ29udHJvbGxlckluaXRpYWxpemVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZGluZWdnQ29udHJvbGxlckluaXRpYWxpemVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWM7QUFFZCxZQUFZLENBQUM7O0FBR2Isb0VBQW9GO0FBRXBGOzs7R0FHRztBQUVILE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUM3QixNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7QUFDakMsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQ25DLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0FBQzVDLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztBQUVyRSxNQUFNLHVCQUF1QixHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsMEJBQTBCLENBQUMsQ0FBQztBQUN2RSxNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLHVCQUF1QixDQUFDLENBQUM7QUFFMUQ7OztNQUdNO0FBQ04sbUJBQXlCLEdBQUcsRUFBRSxHQUFHO0lBQ2hDLHdDQUF3QztJQUN4QyxRQUFRO0lBQ1IsNEJBQTRCO0lBQzVCLDJEQUEyRDtJQUMzRCxJQUFJO0lBQ0osTUFBTTtJQUNOLElBQ0MsRUFBRSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7UUFDaEIsQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDO1FBQzFCLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUM7UUFDZCxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLEVBQ3JCO1FBQ0QsR0FBRyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7S0FDcEI7SUFDRCxJQUFJLEVBQUUs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
|