@opra/nestjs 1.21.0 → 1.22.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/{esm/mq-controller.factory.js → mq-controller.factory.js} +1 -4
- package/package.json +11 -28
- package/{esm/rpc-controller.factory.js → rpc-controller.factory.js} +6 -3
- package/{esm/ws-controller.factory.js → ws-controller.factory.js} +1 -4
- package/cjs/augmentation/nestjs.augmentation.js +0 -25
- package/cjs/constants.js +0 -4
- package/cjs/decorators/public.decorator.js +0 -7
- package/cjs/index.js +0 -12
- package/cjs/mq-controller.factory.js +0 -12
- package/cjs/opra-nest-utils.js +0 -36
- package/cjs/package.json +0 -3
- package/cjs/rpc-controller.factory.js +0 -120
- package/cjs/rpc-params.factory.js +0 -13
- package/cjs/ws-controller.factory.js +0 -12
- package/esm/package.json +0 -3
- package/types/index.d.cts +0 -9
- /package/{types/augmentation → augmentation}/nestjs.augmentation.d.ts +0 -0
- /package/{esm/augmentation → augmentation}/nestjs.augmentation.js +0 -0
- /package/{types/constants.d.ts → constants.d.ts} +0 -0
- /package/{esm/constants.js → constants.js} +0 -0
- /package/{types/decorators → decorators}/public.decorator.d.ts +0 -0
- /package/{esm/decorators → decorators}/public.decorator.js +0 -0
- /package/{types/index.d.ts → index.d.ts} +0 -0
- /package/{esm/index.js → index.js} +0 -0
- /package/{types/mq-controller.factory.d.ts → mq-controller.factory.d.ts} +0 -0
- /package/{types/opra-nest-utils.d.ts → opra-nest-utils.d.ts} +0 -0
- /package/{esm/opra-nest-utils.js → opra-nest-utils.js} +0 -0
- /package/{types/rpc-controller.factory.d.ts → rpc-controller.factory.d.ts} +0 -0
- /package/{types/rpc-params.factory.d.ts → rpc-params.factory.d.ts} +0 -0
- /package/{esm/rpc-params.factory.js → rpc-params.factory.js} +0 -0
- /package/{types/ws-controller.factory.d.ts → ws-controller.factory.d.ts} +0 -0
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
import { MQ_CONTROLLER_METADATA } from '@opra/common';
|
|
2
2
|
import { RpcControllerFactory } from './rpc-controller.factory.js';
|
|
3
3
|
export class MQControllerFactory extends RpcControllerFactory {
|
|
4
|
-
|
|
5
|
-
super(...arguments);
|
|
6
|
-
this._metadataKey = MQ_CONTROLLER_METADATA;
|
|
7
|
-
}
|
|
4
|
+
_metadataKey = MQ_CONTROLLER_METADATA;
|
|
8
5
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@opra/nestjs",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.22.0",
|
|
4
4
|
"description": "Opra NestJS module",
|
|
5
5
|
"author": "Panates",
|
|
6
6
|
"license": "MIT",
|
|
@@ -10,47 +10,30 @@
|
|
|
10
10
|
"tslib": "^2.8.1"
|
|
11
11
|
},
|
|
12
12
|
"peerDependencies": {
|
|
13
|
-
"@opra/common": "^1.
|
|
14
|
-
"@opra/core": "^1.
|
|
13
|
+
"@opra/common": "^1.22.0",
|
|
14
|
+
"@opra/core": "^1.22.0",
|
|
15
15
|
"@nestjs/common": "^10.0.0 || ^11.0.0",
|
|
16
16
|
"@nestjs/core": "^10.0.0 || ^11.0.0",
|
|
17
17
|
"@nestjs/microservices": "^10.0.0 || ^11.0.0"
|
|
18
18
|
},
|
|
19
|
-
"type": "module",
|
|
20
19
|
"exports": {
|
|
21
20
|
".": {
|
|
22
|
-
"
|
|
23
|
-
|
|
24
|
-
"default": "./esm/index.js"
|
|
25
|
-
},
|
|
26
|
-
"require": {
|
|
27
|
-
"types": "./types/index.d.cts",
|
|
28
|
-
"default": "./cjs/index.js"
|
|
29
|
-
},
|
|
30
|
-
"default": "./esm/index.js"
|
|
21
|
+
"types": "./index.d.ts",
|
|
22
|
+
"default": "./index.js"
|
|
31
23
|
},
|
|
32
24
|
"./package.json": "./package.json"
|
|
33
25
|
},
|
|
34
|
-
"
|
|
35
|
-
"module": "./
|
|
36
|
-
"types": "./
|
|
26
|
+
"type": "module",
|
|
27
|
+
"module": "./index.js",
|
|
28
|
+
"types": "./index.d.ts",
|
|
29
|
+
"engines": {
|
|
30
|
+
"node": ">=20.0"
|
|
31
|
+
},
|
|
37
32
|
"repository": {
|
|
38
33
|
"type": "git",
|
|
39
34
|
"url": "git+https://github.com/panates/opra.git",
|
|
40
35
|
"directory": "packages/nestjs"
|
|
41
36
|
},
|
|
42
|
-
"engines": {
|
|
43
|
-
"node": ">=16.0",
|
|
44
|
-
"npm": ">=7.0.0"
|
|
45
|
-
},
|
|
46
|
-
"files": [
|
|
47
|
-
"bin/",
|
|
48
|
-
"cjs/",
|
|
49
|
-
"esm/",
|
|
50
|
-
"types/",
|
|
51
|
-
"LICENSE",
|
|
52
|
-
"README.md"
|
|
53
|
-
],
|
|
54
37
|
"keywords": [
|
|
55
38
|
"opra",
|
|
56
39
|
"nestjs",
|
|
@@ -10,12 +10,15 @@ import { RPC_CONTROLLER_METADATA } from '@opra/common';
|
|
|
10
10
|
import { OpraNestUtils } from './opra-nest-utils.js';
|
|
11
11
|
import { RpcParamsFactory } from './rpc-params.factory.js';
|
|
12
12
|
let RpcControllerFactory = class RpcControllerFactory {
|
|
13
|
+
modulesContainer;
|
|
14
|
+
externalContextCreator;
|
|
15
|
+
_metadataKey = RPC_CONTROLLER_METADATA;
|
|
16
|
+
_coreModuleRef;
|
|
17
|
+
paramsFactory = new RpcParamsFactory();
|
|
18
|
+
injector = new Injector();
|
|
13
19
|
constructor(modulesContainer, externalContextCreator) {
|
|
14
20
|
this.modulesContainer = modulesContainer;
|
|
15
21
|
this.externalContextCreator = externalContextCreator;
|
|
16
|
-
this._metadataKey = RPC_CONTROLLER_METADATA;
|
|
17
|
-
this.paramsFactory = new RpcParamsFactory();
|
|
18
|
-
this.injector = new Injector();
|
|
19
22
|
}
|
|
20
23
|
wrapControllers() {
|
|
21
24
|
const out = [];
|
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
import { WS_CONTROLLER_METADATA } from '@opra/common';
|
|
2
2
|
import { RpcControllerFactory } from './rpc-controller.factory.js';
|
|
3
3
|
export class WSControllerFactory extends RpcControllerFactory {
|
|
4
|
-
|
|
5
|
-
super(...arguments);
|
|
6
|
-
this._metadataKey = WS_CONTROLLER_METADATA;
|
|
7
|
-
}
|
|
4
|
+
_metadataKey = WS_CONTROLLER_METADATA;
|
|
8
5
|
}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const common_1 = require("@nestjs/common");
|
|
4
|
-
const external_exception_filter_js_1 = require("@nestjs/core/exceptions/external-exception-filter.js");
|
|
5
|
-
const common_2 = require("@opra/common");
|
|
6
|
-
var WSControllerDecoratorFactory = common_2.classes.WSControllerDecoratorFactory;
|
|
7
|
-
const { MQControllerDecoratorFactory } = common_2.classes;
|
|
8
|
-
const oldCatchMethod = external_exception_filter_js_1.ExternalExceptionFilter.prototype.catch;
|
|
9
|
-
external_exception_filter_js_1.ExternalExceptionFilter.prototype.catch = function (exception, host) {
|
|
10
|
-
const opraContext = host.getArgByIndex(3);
|
|
11
|
-
// Prevents error logging for all Opra controllers
|
|
12
|
-
if (opraContext && opraContext.request && opraContext.response)
|
|
13
|
-
throw exception;
|
|
14
|
-
oldCatchMethod(exception, host);
|
|
15
|
-
};
|
|
16
|
-
MQControllerDecoratorFactory.augment((decorator, decoratorChain) => {
|
|
17
|
-
decoratorChain.push((_, target) => {
|
|
18
|
-
(0, common_1.Controller)()(target);
|
|
19
|
-
});
|
|
20
|
-
});
|
|
21
|
-
WSControllerDecoratorFactory.augment((decorator, decoratorChain) => {
|
|
22
|
-
decoratorChain.push((_, target) => {
|
|
23
|
-
(0, common_1.Controller)()(target);
|
|
24
|
-
});
|
|
25
|
-
});
|
package/cjs/constants.js
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.Public = void 0;
|
|
4
|
-
const common_1 = require("@nestjs/common");
|
|
5
|
-
const constants_js_1 = require("../constants.js");
|
|
6
|
-
const Public = () => (0, common_1.SetMetadata)(constants_js_1.IS_PUBLIC_KEY, true);
|
|
7
|
-
exports.Public = Public;
|
package/cjs/index.js
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const tslib_1 = require("tslib");
|
|
4
|
-
require("reflect-metadata");
|
|
5
|
-
require("./augmentation/nestjs.augmentation.js");
|
|
6
|
-
tslib_1.__exportStar(require("./constants.js"), exports);
|
|
7
|
-
tslib_1.__exportStar(require("./decorators/public.decorator.js"), exports);
|
|
8
|
-
tslib_1.__exportStar(require("./mq-controller.factory.js"), exports);
|
|
9
|
-
tslib_1.__exportStar(require("./opra-nest-utils.js"), exports);
|
|
10
|
-
tslib_1.__exportStar(require("./rpc-controller.factory.js"), exports);
|
|
11
|
-
tslib_1.__exportStar(require("./rpc-params.factory.js"), exports);
|
|
12
|
-
tslib_1.__exportStar(require("./ws-controller.factory.js"), exports);
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.MQControllerFactory = void 0;
|
|
4
|
-
const common_1 = require("@opra/common");
|
|
5
|
-
const rpc_controller_factory_js_1 = require("./rpc-controller.factory.js");
|
|
6
|
-
class MQControllerFactory extends rpc_controller_factory_js_1.RpcControllerFactory {
|
|
7
|
-
constructor() {
|
|
8
|
-
super(...arguments);
|
|
9
|
-
this._metadataKey = common_1.MQ_CONTROLLER_METADATA;
|
|
10
|
-
}
|
|
11
|
-
}
|
|
12
|
-
exports.MQControllerFactory = MQControllerFactory;
|
package/cjs/opra-nest-utils.js
DELETED
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.OpraNestUtils = void 0;
|
|
4
|
-
const GUARDS_METADATA = '__guards__';
|
|
5
|
-
const INTERCEPTORS_METADATA = '__interceptors__';
|
|
6
|
-
const EXCEPTION_FILTERS_METADATA = '__exceptionFilters__';
|
|
7
|
-
class OpraNestUtils {
|
|
8
|
-
static copyDecoratorMetadata(target, ...source) {
|
|
9
|
-
for (const parent of source) {
|
|
10
|
-
const metadataKeys = Reflect.getOwnMetadataKeys(parent);
|
|
11
|
-
for (const key of metadataKeys) {
|
|
12
|
-
if (typeof key === 'string' &&
|
|
13
|
-
key.startsWith('opra.') &&
|
|
14
|
-
!Reflect.hasOwnMetadata(key, target)) {
|
|
15
|
-
const metadata = Reflect.getMetadata(key, parent);
|
|
16
|
-
Reflect.defineMetadata(key, metadata, target);
|
|
17
|
-
continue;
|
|
18
|
-
}
|
|
19
|
-
if (key === GUARDS_METADATA ||
|
|
20
|
-
key === INTERCEPTORS_METADATA ||
|
|
21
|
-
key === EXCEPTION_FILTERS_METADATA) {
|
|
22
|
-
const m1 = Reflect.getMetadata(key, target) || [];
|
|
23
|
-
const metadata = [...m1];
|
|
24
|
-
const m2 = Reflect.getOwnMetadata(key, parent) || [];
|
|
25
|
-
m2.forEach((t) => {
|
|
26
|
-
if (!metadata.includes(t)) {
|
|
27
|
-
metadata.push(t);
|
|
28
|
-
}
|
|
29
|
-
});
|
|
30
|
-
Reflect.defineMetadata(key, metadata, target);
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
exports.OpraNestUtils = OpraNestUtils;
|
package/cjs/package.json
DELETED
|
@@ -1,120 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.RpcControllerFactory = void 0;
|
|
4
|
-
const tslib_1 = require("tslib");
|
|
5
|
-
const common_1 = require("@nestjs/common");
|
|
6
|
-
const core_1 = require("@nestjs/core");
|
|
7
|
-
const external_context_creator_js_1 = require("@nestjs/core/helpers/external-context-creator.js");
|
|
8
|
-
const injector_js_1 = require("@nestjs/core/injector/injector.js");
|
|
9
|
-
const index_js_1 = require("@nestjs/core/injector/internal-core-module/index.js");
|
|
10
|
-
const request_constants_js_1 = require("@nestjs/core/router/request/request-constants.js");
|
|
11
|
-
const constants_js_1 = require("@nestjs/microservices/constants.js");
|
|
12
|
-
const common_2 = require("@opra/common");
|
|
13
|
-
const opra_nest_utils_js_1 = require("./opra-nest-utils.js");
|
|
14
|
-
const rpc_params_factory_js_1 = require("./rpc-params.factory.js");
|
|
15
|
-
let RpcControllerFactory = class RpcControllerFactory {
|
|
16
|
-
constructor(modulesContainer, externalContextCreator) {
|
|
17
|
-
this.modulesContainer = modulesContainer;
|
|
18
|
-
this.externalContextCreator = externalContextCreator;
|
|
19
|
-
this._metadataKey = common_2.RPC_CONTROLLER_METADATA;
|
|
20
|
-
this.paramsFactory = new rpc_params_factory_js_1.RpcParamsFactory();
|
|
21
|
-
this.injector = new injector_js_1.Injector();
|
|
22
|
-
}
|
|
23
|
-
wrapControllers() {
|
|
24
|
-
const out = [];
|
|
25
|
-
for (const { module, wrapper } of this.exploreControllers()) {
|
|
26
|
-
const instance = wrapper.instance;
|
|
27
|
-
const sourceClass = instance.constructor;
|
|
28
|
-
const metadata = Reflect.getMetadata(this._metadataKey, sourceClass);
|
|
29
|
-
const isRequestScoped = !wrapper.isDependencyTreeStatic();
|
|
30
|
-
/** Create a new controller class */
|
|
31
|
-
const newClass = {
|
|
32
|
-
[sourceClass.name]: class extends sourceClass {
|
|
33
|
-
},
|
|
34
|
-
}[sourceClass.name];
|
|
35
|
-
/** Copy metadata keys from source class to new one */
|
|
36
|
-
opra_nest_utils_js_1.OpraNestUtils.copyDecoratorMetadata(newClass, sourceClass);
|
|
37
|
-
(0, common_1.Controller)()(newClass);
|
|
38
|
-
out.push(newClass);
|
|
39
|
-
if (metadata.operations) {
|
|
40
|
-
for (const operationName of Object.keys(metadata.operations)) {
|
|
41
|
-
// const orgFn: Function = sourceClass.prototype[operationName];
|
|
42
|
-
newClass.prototype[operationName] = this._createContextCallback(instance, wrapper, module, operationName, isRequestScoped, 'rpc');
|
|
43
|
-
Reflect.defineMetadata(constants_js_1.PARAM_ARGS_METADATA, [core_1.REQUEST], instance.constructor, operationName);
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
return out;
|
|
48
|
-
}
|
|
49
|
-
_createContextCallback(instance, wrapper, moduleRef, methodName, isRequestScoped, contextType, options) {
|
|
50
|
-
const paramsFactory = this.paramsFactory;
|
|
51
|
-
if (isRequestScoped) {
|
|
52
|
-
return async (opraContext) => {
|
|
53
|
-
const contextId = (0, core_1.createContextId)();
|
|
54
|
-
Object.defineProperty(opraContext, request_constants_js_1.REQUEST_CONTEXT_ID, {
|
|
55
|
-
value: contextId,
|
|
56
|
-
enumerable: false,
|
|
57
|
-
configurable: false,
|
|
58
|
-
writable: false,
|
|
59
|
-
});
|
|
60
|
-
this.registerContextProvider(opraContext, contextId);
|
|
61
|
-
const contextInstance = await this.injector.loadPerContext(instance, moduleRef, moduleRef.providers, contextId);
|
|
62
|
-
const contextCallback = this.externalContextCreator.create(contextInstance, contextInstance[methodName], methodName, constants_js_1.PARAM_ARGS_METADATA, paramsFactory, contextId, wrapper.id, options, opraContext.transport);
|
|
63
|
-
return contextCallback(opraContext);
|
|
64
|
-
};
|
|
65
|
-
}
|
|
66
|
-
return this.externalContextCreator.create(instance, instance[methodName], methodName, constants_js_1.PARAM_ARGS_METADATA, paramsFactory, undefined, undefined, options, contextType);
|
|
67
|
-
}
|
|
68
|
-
registerContextProvider(request, contextId) {
|
|
69
|
-
if (!this._coreModuleRef) {
|
|
70
|
-
const coreModuleArray = [...this.modulesContainer.entries()]
|
|
71
|
-
.filter(
|
|
72
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
73
|
-
([_, { metatype }]) => metatype && metatype.name === index_js_1.InternalCoreModule.name)
|
|
74
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
75
|
-
.map(([_, value]) => value);
|
|
76
|
-
this._coreModuleRef = coreModuleArray[0];
|
|
77
|
-
}
|
|
78
|
-
if (!this._coreModuleRef) {
|
|
79
|
-
return;
|
|
80
|
-
}
|
|
81
|
-
const wrapper = this._coreModuleRef.getProviderByKey(core_1.REQUEST);
|
|
82
|
-
wrapper.setInstanceByContextId(contextId, {
|
|
83
|
-
instance: request,
|
|
84
|
-
isResolved: true,
|
|
85
|
-
});
|
|
86
|
-
}
|
|
87
|
-
exploreControllers() {
|
|
88
|
-
const scannedModules = new Set();
|
|
89
|
-
const controllers = new Set();
|
|
90
|
-
const scanModule = (module) => {
|
|
91
|
-
if (scannedModules.has(module))
|
|
92
|
-
return;
|
|
93
|
-
scannedModules.add(module);
|
|
94
|
-
for (const mm of module.imports.values()) {
|
|
95
|
-
scanModule(mm);
|
|
96
|
-
}
|
|
97
|
-
for (const wrapper of module.controllers.values()) {
|
|
98
|
-
if (wrapper.instance &&
|
|
99
|
-
typeof wrapper.instance === 'object' &&
|
|
100
|
-
wrapper.instance.constructor &&
|
|
101
|
-
Reflect.getMetadata(this._metadataKey, wrapper.instance.constructor) &&
|
|
102
|
-
!controllers.has(wrapper)) {
|
|
103
|
-
controllers.add({ module, wrapper });
|
|
104
|
-
}
|
|
105
|
-
if (wrapper.host)
|
|
106
|
-
scanModule(wrapper.host);
|
|
107
|
-
}
|
|
108
|
-
};
|
|
109
|
-
for (const module of this.modulesContainer.values()) {
|
|
110
|
-
scanModule(module);
|
|
111
|
-
}
|
|
112
|
-
return Array.from(controllers);
|
|
113
|
-
}
|
|
114
|
-
};
|
|
115
|
-
exports.RpcControllerFactory = RpcControllerFactory;
|
|
116
|
-
exports.RpcControllerFactory = RpcControllerFactory = tslib_1.__decorate([
|
|
117
|
-
(0, common_1.Injectable)(),
|
|
118
|
-
tslib_1.__metadata("design:paramtypes", [core_1.ModulesContainer,
|
|
119
|
-
external_context_creator_js_1.ExternalContextCreator])
|
|
120
|
-
], RpcControllerFactory);
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.RpcParamsFactory = void 0;
|
|
4
|
-
class RpcParamsFactory {
|
|
5
|
-
exchangeKeyForValue(type, data, args) {
|
|
6
|
-
if (!args) {
|
|
7
|
-
return null;
|
|
8
|
-
}
|
|
9
|
-
args = Array.isArray(args) ? args : [];
|
|
10
|
-
return args[0];
|
|
11
|
-
}
|
|
12
|
-
}
|
|
13
|
-
exports.RpcParamsFactory = RpcParamsFactory;
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.WSControllerFactory = void 0;
|
|
4
|
-
const common_1 = require("@opra/common");
|
|
5
|
-
const rpc_controller_factory_js_1 = require("./rpc-controller.factory.js");
|
|
6
|
-
class WSControllerFactory extends rpc_controller_factory_js_1.RpcControllerFactory {
|
|
7
|
-
constructor() {
|
|
8
|
-
super(...arguments);
|
|
9
|
-
this._metadataKey = common_1.WS_CONTROLLER_METADATA;
|
|
10
|
-
}
|
|
11
|
-
}
|
|
12
|
-
exports.WSControllerFactory = WSControllerFactory;
|
package/esm/package.json
DELETED
package/types/index.d.cts
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import 'reflect-metadata';
|
|
2
|
-
import './augmentation/nestjs.augmentation.js';
|
|
3
|
-
export * from './constants.js';
|
|
4
|
-
export * from './decorators/public.decorator.js';
|
|
5
|
-
export * from './mq-controller.factory.js';
|
|
6
|
-
export * from './opra-nest-utils.js';
|
|
7
|
-
export * from './rpc-controller.factory.js';
|
|
8
|
-
export * from './rpc-params.factory.js';
|
|
9
|
-
export * from './ws-controller.factory.js';
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|