angular-three-soba 1.10.0 → 1.11.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/abstractions/index.d.ts +1 -0
- package/abstractions/lib/edges/edges.d.ts +18 -0
- package/cameras/index.d.ts +1 -0
- package/cameras/lib/camera/camera-content.d.ts +1 -1
- package/cameras/lib/cube-camera/cube-camera.d.ts +27 -0
- package/esm2020/abstractions/index.mjs +2 -1
- package/esm2020/abstractions/lib/edges/edges.mjs +95 -0
- package/esm2020/cameras/index.mjs +2 -1
- package/esm2020/cameras/lib/camera/camera-content.mjs +1 -1
- package/esm2020/cameras/lib/cube-camera/cube-camera.mjs +130 -0
- package/esm2020/materials/index.mjs +3 -1
- package/esm2020/materials/lib/mesh-refraction-material/mesh-refraction-material.mjs +157 -0
- package/esm2020/materials/lib/mesh-transmission-material/mesh-transmission-material.mjs +240 -0
- package/esm2020/misc/lib/fbo/fbo.mjs +5 -4
- package/esm2020/shaders/index.mjs +5 -1
- package/esm2020/shaders/lib/caustics-material/caustics-material.mjs +128 -0
- package/esm2020/shaders/lib/caustics-projection-material/caustics-projection-material.mjs +33 -0
- package/esm2020/shaders/lib/discard-material/discard-material.mjs +3 -0
- package/esm2020/shaders/lib/mesh-transmission-material/mesh-transmission-material.mjs +268 -0
- package/esm2020/staging/index.mjs +2 -1
- package/esm2020/staging/lib/accumulative-shadows/progressive-light-map.mjs +2 -3
- package/esm2020/staging/lib/caustics/caustics.mjs +364 -0
- package/fesm2015/angular-three-soba-abstractions.mjs +91 -2
- package/fesm2015/angular-three-soba-abstractions.mjs.map +1 -1
- package/fesm2015/angular-three-soba-cameras.mjs +127 -4
- package/fesm2015/angular-three-soba-cameras.mjs.map +1 -1
- package/fesm2015/angular-three-soba-materials.mjs +389 -2
- package/fesm2015/angular-three-soba-materials.mjs.map +1 -1
- package/fesm2015/angular-three-soba-misc.mjs +4 -3
- package/fesm2015/angular-three-soba-misc.mjs.map +1 -1
- package/fesm2015/angular-three-soba-shaders.mjs +454 -31
- package/fesm2015/angular-three-soba-shaders.mjs.map +1 -1
- package/fesm2015/angular-three-soba-staging.mjs +363 -9
- package/fesm2015/angular-three-soba-staging.mjs.map +1 -1
- package/fesm2020/angular-three-soba-abstractions.mjs +91 -2
- package/fesm2020/angular-three-soba-abstractions.mjs.map +1 -1
- package/fesm2020/angular-three-soba-cameras.mjs +127 -4
- package/fesm2020/angular-three-soba-cameras.mjs.map +1 -1
- package/fesm2020/angular-three-soba-materials.mjs +387 -2
- package/fesm2020/angular-three-soba-materials.mjs.map +1 -1
- package/fesm2020/angular-three-soba-misc.mjs +4 -3
- package/fesm2020/angular-three-soba-misc.mjs.map +1 -1
- package/fesm2020/angular-three-soba-shaders.mjs +460 -34
- package/fesm2020/angular-three-soba-shaders.mjs.map +1 -1
- package/fesm2020/angular-three-soba-staging.mjs +362 -9
- package/fesm2020/angular-three-soba-staging.mjs.map +1 -1
- package/materials/index.d.ts +2 -0
- package/materials/lib/mesh-refraction-material/mesh-refraction-material.d.ts +28 -0
- package/materials/lib/mesh-transmission-material/mesh-transmission-material.d.ts +47 -0
- package/misc/lib/fbo/fbo.d.ts +8 -6
- package/package.json +2 -2
- package/plugin/package.json +1 -1
- package/shaders/index.d.ts +4 -0
- package/shaders/lib/caustics-material/caustics-material.d.ts +4 -0
- package/shaders/lib/caustics-projection-material/caustics-projection-material.d.ts +4 -0
- package/shaders/lib/discard-material/discard-material.d.ts +3 -0
- package/shaders/lib/mesh-transmission-material/mesh-transmission-material.d.ts +25 -0
- package/staging/index.d.ts +1 -0
- package/staging/lib/caustics/caustics.d.ts +48 -0
- package/staging/lib/environment/environment-cube.d.ts +1 -1
- package/staging/lib/environment/environment-ground.d.ts +1 -1
- package/staging/lib/environment/utils.d.ts +1 -1
package/materials/index.d.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
1
|
export * from './lib/mesh-distort-material/mesh-distort-material';
|
|
2
2
|
export * from './lib/mesh-reflector-material/mesh-reflector-material';
|
|
3
|
+
export * from './lib/mesh-refraction-material/mesh-refraction-material';
|
|
4
|
+
export * from './lib/mesh-transmission-material/mesh-transmission-material';
|
|
3
5
|
export * from './lib/mesh-wobble-material/mesh-wobble-material';
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { OnInit } from '@angular/core';
|
|
2
|
+
import { NgtRxStore } from 'angular-three';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
export declare class NgtsMeshRefractionMaterial extends NgtRxStore implements OnInit {
|
|
5
|
+
materialRef: import("angular-three").NgtInjectedRef<import("three").ShaderMaterial>;
|
|
6
|
+
/** Environment map */
|
|
7
|
+
set envMap(envMap: THREE.CubeTexture | THREE.Texture);
|
|
8
|
+
/** Number of ray-cast bounces, it can be expensive to have too many, 2 */
|
|
9
|
+
set bounces(bounces: number);
|
|
10
|
+
/** Refraction index, 2.4 */
|
|
11
|
+
set ior(ior: number);
|
|
12
|
+
/** Fresnel (strip light), 0 */
|
|
13
|
+
set fresnel(fresnel: number);
|
|
14
|
+
/** RGB shift intensity, can be expensive, 0 */
|
|
15
|
+
set aberrationStrength(aberrationStrength: number);
|
|
16
|
+
/** Color, white */
|
|
17
|
+
set color(color: THREE.ColorRepresentation);
|
|
18
|
+
/** If this is on it uses fewer ray casts for the RGB shift sacrificing physical accuracy, true */
|
|
19
|
+
set fastChroma(fastChroma: boolean);
|
|
20
|
+
readonly defines$: import("rxjs").Observable<any>;
|
|
21
|
+
private readonly store;
|
|
22
|
+
initialize(): void;
|
|
23
|
+
constructor();
|
|
24
|
+
ngOnInit(): void;
|
|
25
|
+
private setupGeometry;
|
|
26
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<NgtsMeshRefractionMaterial, never>;
|
|
27
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<NgtsMeshRefractionMaterial, "ngts-mesh-refraction-material", never, { "materialRef": "materialRef"; "envMap": "envMap"; "bounces": "bounces"; "ior": "ior"; "fresnel": "fresnel"; "aberrationStrength": "aberrationStrength"; "color": "color"; "fastChroma": "fastChroma"; }, {}, never, ["*"], true, never>;
|
|
28
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { NgtRxStore } from 'angular-three';
|
|
2
|
+
import { MeshTransmissionMaterial } from 'angular-three-soba/shaders';
|
|
3
|
+
import * as THREE from 'three';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
export declare class NgtsMeshTranmissionMaterial extends NgtRxStore {
|
|
6
|
+
materialRef: import("angular-three").NgtInjectedRef<MeshTransmissionMaterial & {
|
|
7
|
+
time: number;
|
|
8
|
+
buffer?: THREE.Texture | undefined;
|
|
9
|
+
}>;
|
|
10
|
+
/** transmissionSampler, you can use the threejs transmission sampler texture that is
|
|
11
|
+
* generated once for all transmissive materials. The upside is that it can be faster if you
|
|
12
|
+
* use multiple MeshPhysical and Transmission materials, the downside is that transmissive materials
|
|
13
|
+
* using this can't see other transparent or transmissive objects, default: false */
|
|
14
|
+
set transmissionSampler(transmissionSampler: boolean);
|
|
15
|
+
/** Render the backside of the material (more cost, better results), default: false */
|
|
16
|
+
set backside(backside: boolean);
|
|
17
|
+
/** Backside thickness (when backside is true), default: 0 */
|
|
18
|
+
set backsideThickness(backsideThickness: number);
|
|
19
|
+
/** Resolution of the local buffer, default: undefined (fullscreen) */
|
|
20
|
+
set resolution(resolution: number);
|
|
21
|
+
/** Resolution of the local buffer for backfaces, default: undefined (fullscreen) */
|
|
22
|
+
set backsideResolution(backsideResolution: number);
|
|
23
|
+
/** Refraction samples, default: 10 */
|
|
24
|
+
set samples(samples: number);
|
|
25
|
+
/** Buffer scene background (can be a texture, a cubetexture or a color), default: null */
|
|
26
|
+
set background(background: THREE.Texture | THREE.Color);
|
|
27
|
+
set transmission(transmission: number);
|
|
28
|
+
set thickness(thickness: number);
|
|
29
|
+
set roughness(roughness: number);
|
|
30
|
+
set chromaticAberration(chromaticAberration: number);
|
|
31
|
+
set anisotropy(anisotropy: number);
|
|
32
|
+
set distortion(distortion: number);
|
|
33
|
+
set distortionScale(distortionScale: number);
|
|
34
|
+
set temporalDistortion(temporalDistortion: number);
|
|
35
|
+
/** The scene rendered into a texture (use it to share a texture between materials), default: null */
|
|
36
|
+
set buffer(buffer: THREE.Texture);
|
|
37
|
+
/** Internals */
|
|
38
|
+
set time(time: number);
|
|
39
|
+
readonly discardMaterial: THREE.ShaderMaterial;
|
|
40
|
+
readonly fboBackRef: import("angular-three").NgtInjectedRef<THREE.WebGLRenderTarget>;
|
|
41
|
+
readonly fboMainRef: import("angular-three").NgtInjectedRef<THREE.WebGLRenderTarget>;
|
|
42
|
+
initialize(): void;
|
|
43
|
+
constructor();
|
|
44
|
+
ngOnInit(): void;
|
|
45
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<NgtsMeshTranmissionMaterial, never>;
|
|
46
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<NgtsMeshTranmissionMaterial, "ngts-mesh-transmission-material", never, { "materialRef": "materialRef"; "transmissionSampler": "transmissionSampler"; "backside": "backside"; "backsideThickness": "backsideThickness"; "resolution": "resolution"; "backsideResolution": "backsideResolution"; "samples": "samples"; "background": "background"; "transmission": "transmission"; "thickness": "thickness"; "roughness": "roughness"; "chromaticAberration": "chromaticAberration"; "anisotropy": "anisotropy"; "distortion": "distortion"; "distortionScale": "distortionScale"; "temporalDistortion": "temporalDistortion"; "buffer": "buffer"; "time": "time"; }, {}, never, never, true, never>;
|
|
47
|
+
}
|
package/misc/lib/fbo/fbo.d.ts
CHANGED
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
import { Observable } from 'rxjs';
|
|
2
2
|
import * as THREE from 'three';
|
|
3
|
-
interface FBOSettings
|
|
4
|
-
|
|
3
|
+
interface FBOSettings extends THREE.WebGLRenderTargetOptions {
|
|
4
|
+
/** Defines the count of MSAA samples. Can only be used with WebGL 2. Default: 0 */
|
|
5
5
|
samples?: number;
|
|
6
|
+
/** If set, the scene depth will be rendered into buffer.depthTexture. Default: false */
|
|
7
|
+
depth?: boolean;
|
|
6
8
|
}
|
|
7
|
-
export interface NgtsFBOParams
|
|
8
|
-
width?: number | FBOSettings
|
|
9
|
+
export interface NgtsFBOParams {
|
|
10
|
+
width?: number | FBOSettings;
|
|
9
11
|
height?: number;
|
|
10
|
-
settings?: FBOSettings
|
|
12
|
+
settings?: FBOSettings;
|
|
11
13
|
}
|
|
12
|
-
export declare function injectNgtsFBO
|
|
14
|
+
export declare function injectNgtsFBO(paramsFactory: (defaultParams: Partial<NgtsFBOParams>) => NgtsFBOParams | Observable<NgtsFBOParams>): import("angular-three").NgtInjectedRef<THREE.WebGLRenderTarget>;
|
|
13
15
|
export {};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "angular-three-soba",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.11.0",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public"
|
|
6
6
|
},
|
|
@@ -115,9 +115,9 @@
|
|
|
115
115
|
"three-mesh-bvh": "^0.5.0",
|
|
116
116
|
"three-stdlib": "^2.0.0",
|
|
117
117
|
"troika-three-text": "^0.47.0",
|
|
118
|
+
"rxjs": "~7.8.0",
|
|
118
119
|
"@storybook/addons": "6.5.16",
|
|
119
120
|
"@storybook/theming": "6.5.16",
|
|
120
|
-
"rxjs": "~7.8.0",
|
|
121
121
|
"@rx-angular/state": "^1.7.0"
|
|
122
122
|
},
|
|
123
123
|
"dependencies": {
|
package/plugin/package.json
CHANGED
package/shaders/index.d.ts
CHANGED
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
export * from './lib/blur-pass/blur-pass';
|
|
2
|
+
export * from './lib/caustics-material/caustics-material';
|
|
3
|
+
export * from './lib/caustics-projection-material/caustics-projection-material';
|
|
2
4
|
export * from './lib/convolution-material/convolution-material';
|
|
5
|
+
export * from './lib/discard-material/discard-material';
|
|
3
6
|
export * from './lib/mesh-distort-material/mesh-distort-material';
|
|
4
7
|
export * from './lib/mesh-reflector-material/mesh-reflector-material';
|
|
5
8
|
export * from './lib/mesh-refraction-material/mesh-refraction-material';
|
|
9
|
+
export * from './lib/mesh-transmission-material/mesh-transmission-material';
|
|
6
10
|
export * from './lib/mesh-wobble-material/mesh-wobble-material';
|
|
7
11
|
export * from './lib/shader-material/shader-material';
|
|
8
12
|
export * from './lib/spot-light-material/spot-light-material';
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import * as THREE from 'three';
|
|
2
|
+
interface Uniform<T> {
|
|
3
|
+
value: T;
|
|
4
|
+
}
|
|
5
|
+
export declare class MeshTransmissionMaterial extends THREE.MeshPhysicalMaterial {
|
|
6
|
+
uniforms: {
|
|
7
|
+
chromaticAberration: Uniform<number>;
|
|
8
|
+
transmission: Uniform<number>;
|
|
9
|
+
transmissionMap: Uniform<THREE.Texture | null>;
|
|
10
|
+
_transmission: Uniform<number>;
|
|
11
|
+
thickness: Uniform<number>;
|
|
12
|
+
roughness: Uniform<number>;
|
|
13
|
+
thicknessMap: Uniform<THREE.Texture | null>;
|
|
14
|
+
attenuationDistance: Uniform<number>;
|
|
15
|
+
attenuationColor: Uniform<THREE.Color>;
|
|
16
|
+
anisotropy: Uniform<number>;
|
|
17
|
+
time: Uniform<number>;
|
|
18
|
+
distortion: Uniform<number>;
|
|
19
|
+
distortionScale: Uniform<number>;
|
|
20
|
+
temporalDistortion: Uniform<number>;
|
|
21
|
+
buffer: Uniform<THREE.Texture | null>;
|
|
22
|
+
};
|
|
23
|
+
constructor(samples?: number, transmissionSampler?: boolean);
|
|
24
|
+
}
|
|
25
|
+
export {};
|
package/staging/index.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ export { NgtsAccumulativeShadows } from './lib/accumulative-shadows/accumulative
|
|
|
2
2
|
export { NgtsRandomizedLights } from './lib/accumulative-shadows/randomized-lights';
|
|
3
3
|
export * from './lib/bounds/bounds';
|
|
4
4
|
export * from './lib/camera-shake/camera-shake';
|
|
5
|
+
export * from './lib/caustics/caustics';
|
|
5
6
|
export * from './lib/center/center';
|
|
6
7
|
export * from './lib/cloud/cloud';
|
|
7
8
|
export * from './lib/contact-shadows/contact-shadows';
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { ElementRef, OnInit } from '@angular/core';
|
|
2
|
+
import { NgtRxStore } from 'angular-three';
|
|
3
|
+
import * as THREE from 'three';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
export declare class NgtsCaustics extends NgtRxStore implements OnInit {
|
|
6
|
+
readonly CustomBlending: THREE.Blending;
|
|
7
|
+
readonly OneFactor: THREE.BlendingDstFactor;
|
|
8
|
+
readonly SrcAlphaFactor: THREE.BlendingDstFactor;
|
|
9
|
+
readonly Math: Math;
|
|
10
|
+
readonly planeRef: import("angular-three").NgtInjectedRef<THREE.Mesh<THREE.BufferGeometry, THREE.Material | THREE.Material[]>>;
|
|
11
|
+
readonly sceneRef: import("angular-three").NgtInjectedRef<THREE.Scene>;
|
|
12
|
+
readonly cameraRef: import("angular-three").NgtInjectedRef<THREE.OrthographicCamera>;
|
|
13
|
+
causticsRef: import("angular-three").NgtInjectedRef<THREE.Group>;
|
|
14
|
+
/** How many frames it will render, set it to Infinity for runtime, default: 1 */
|
|
15
|
+
set frames(frames: number);
|
|
16
|
+
/** Enables visual cues to help you stage your scene, default: false */
|
|
17
|
+
set debug(debug: boolean);
|
|
18
|
+
/** Will display caustics only and skip the models, default: false */
|
|
19
|
+
set causticsOnly(causticsOnly: boolean);
|
|
20
|
+
/** Will include back faces and enable the backsideIOR prop, default: false */
|
|
21
|
+
set backside(backside: boolean);
|
|
22
|
+
/** The IOR refraction index, default: 1.1 */
|
|
23
|
+
set ior(ior: number);
|
|
24
|
+
/** The IOR refraction index for back faces (only available when backside is enabled), default: 1.1 */
|
|
25
|
+
set backsideIOR(backsideIOR: number);
|
|
26
|
+
/** The texel size, default: 0.3125 */
|
|
27
|
+
set worldRadius(worldRadius: number);
|
|
28
|
+
/** Intensity of the prjected caustics, default: 0.05 */
|
|
29
|
+
set intensity(intensity: number);
|
|
30
|
+
/** Caustics color, default: white */
|
|
31
|
+
set color(color: THREE.ColorRepresentation);
|
|
32
|
+
/** Buffer resolution, default: 2048 */
|
|
33
|
+
set resolution(resolution: number);
|
|
34
|
+
/** Camera position, it will point towards the contents bounds center, default: [5, 5, 5] */
|
|
35
|
+
set lightSource(lightSource: [x: number, y: number, z: number] | ElementRef<THREE.Object3D>);
|
|
36
|
+
readonly normalTargetFbo: import("angular-three").NgtInjectedRef<THREE.WebGLRenderTarget>;
|
|
37
|
+
readonly normalTargetBFbo: import("angular-three").NgtInjectedRef<THREE.WebGLRenderTarget>;
|
|
38
|
+
readonly causticsTargetFbo: import("angular-three").NgtInjectedRef<THREE.WebGLRenderTarget>;
|
|
39
|
+
readonly causticsTargetBFbo: import("angular-three").NgtInjectedRef<THREE.WebGLRenderTarget>;
|
|
40
|
+
private readonly store;
|
|
41
|
+
private readonly cdr;
|
|
42
|
+
initialize(): void;
|
|
43
|
+
ngOnInit(): void;
|
|
44
|
+
private updateWorldMatrix;
|
|
45
|
+
private setBeforeRender;
|
|
46
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<NgtsCaustics, never>;
|
|
47
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<NgtsCaustics, "ngts-caustics", never, { "causticsRef": "causticsRef"; "frames": "frames"; "debug": "debug"; "causticsOnly": "causticsOnly"; "backside": "backside"; "ior": "ior"; "backsideIOR": "backsideIOR"; "worldRadius": "worldRadius"; "intensity": "intensity"; "color": "color"; "resolution": "resolution"; "lightSource": "lightSource"; }, {}, never, ["*"], true, never>;
|
|
48
|
+
}
|
|
@@ -2,7 +2,7 @@ import { OnInit } from '@angular/core';
|
|
|
2
2
|
import { NgtsEnvironmentInputs } from './environment-inputs';
|
|
3
3
|
import * as i0 from "@angular/core";
|
|
4
4
|
export declare class NgtsEnvironmentCube extends NgtsEnvironmentInputs implements OnInit {
|
|
5
|
-
readonly textureRef: import("angular-three").NgtInjectedRef<import("three").
|
|
5
|
+
readonly textureRef: import("angular-three").NgtInjectedRef<import("three").Texture | import("three").CubeTexture>;
|
|
6
6
|
initialize(): void;
|
|
7
7
|
ngOnInit(): void;
|
|
8
8
|
private setEnvProps;
|
|
@@ -2,7 +2,7 @@ import { OnInit } from '@angular/core';
|
|
|
2
2
|
import { NgtsEnvironmentInputs } from './environment-inputs';
|
|
3
3
|
import * as i0 from "@angular/core";
|
|
4
4
|
export declare class NgtsEnvironmentGround extends NgtsEnvironmentInputs implements OnInit {
|
|
5
|
-
readonly defaultTexture: import("angular-three").NgtInjectedRef<import("three").
|
|
5
|
+
readonly defaultTexture: import("angular-three").NgtInjectedRef<import("three").Texture | import("three").CubeTexture>;
|
|
6
6
|
ngOnInit(): void;
|
|
7
7
|
static ɵfac: i0.ɵɵFactoryDeclaration<NgtsEnvironmentGround, never>;
|
|
8
8
|
static ɵcmp: i0.ɵɵComponentDeclaration<NgtsEnvironmentGround, "ngts-environment-ground", never, {}, {}, never, never, true, never>;
|
|
@@ -4,5 +4,5 @@ import { CubeTexture, Texture } from 'three';
|
|
|
4
4
|
import { NgtsEnvironmentInputs } from './environment-inputs';
|
|
5
5
|
export declare function setEnvProps(background: boolean | 'only', scene: THREE.Scene | ElementRef<THREE.Scene> | undefined, defaultScene: THREE.Scene, texture: THREE.Texture, blur?: number): () => void;
|
|
6
6
|
type NgtsInjectEnvironmentParams = Partial<Pick<NgtsEnvironmentInputs, 'files' | 'path' | 'preset' | 'extensions' | 'encoding'>>;
|
|
7
|
-
export declare function injectNgtsEnvironment(paramsFactory: (defaultParams: NgtsInjectEnvironmentParams) => NgtsInjectEnvironmentParams | Observable<NgtsInjectEnvironmentParams>): import("angular-three").NgtInjectedRef<
|
|
7
|
+
export declare function injectNgtsEnvironment(paramsFactory: (defaultParams: NgtsInjectEnvironmentParams) => NgtsInjectEnvironmentParams | Observable<NgtsInjectEnvironmentParams>): import("angular-three").NgtInjectedRef<Texture | CubeTexture>;
|
|
8
8
|
export {};
|