angular-three-cannon 2.0.0-beta.21 → 2.0.0-beta.227

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.
Files changed (47) hide show
  1. package/body/README.md +3 -0
  2. package/body/index.d.ts +2 -0
  3. package/body/lib/body.d.ts +57 -0
  4. package/body/lib/types.d.ts +38 -0
  5. package/body/lib/utils.d.ts +50 -0
  6. package/constraint/README.md +3 -0
  7. package/constraint/index.d.ts +1 -0
  8. package/constraint/lib/constraint.d.ts +26 -0
  9. package/debug/lib/debug.d.ts +15 -14
  10. package/esm2022/body/angular-three-cannon-body.mjs +5 -0
  11. package/esm2022/body/index.mjs +2 -0
  12. package/esm2022/body/lib/body.mjs +83 -0
  13. package/esm2022/body/lib/types.mjs +2 -0
  14. package/esm2022/body/lib/utils.mjs +205 -0
  15. package/esm2022/constraint/angular-three-cannon-constraint.mjs +5 -0
  16. package/esm2022/constraint/index.mjs +2 -0
  17. package/esm2022/constraint/lib/constraint.mjs +50 -0
  18. package/esm2022/debug/lib/debug.mjs +34 -46
  19. package/esm2022/lib/physics.mjs +70 -153
  20. package/fesm2022/angular-three-cannon-body.mjs +292 -0
  21. package/fesm2022/angular-three-cannon-body.mjs.map +1 -0
  22. package/fesm2022/angular-three-cannon-constraint.mjs +57 -0
  23. package/fesm2022/angular-three-cannon-constraint.mjs.map +1 -0
  24. package/fesm2022/angular-three-cannon-debug.mjs +33 -45
  25. package/fesm2022/angular-three-cannon-debug.mjs.map +1 -1
  26. package/fesm2022/angular-three-cannon.mjs +70 -153
  27. package/fesm2022/angular-three-cannon.mjs.map +1 -1
  28. package/lib/physics.d.ts +50 -43
  29. package/package.json +19 -13
  30. package/esm2022/services/angular-three-cannon-services.mjs +0 -5
  31. package/esm2022/services/index.mjs +0 -7
  32. package/esm2022/services/lib/body.mjs +0 -293
  33. package/esm2022/services/lib/constraints.mjs +0 -59
  34. package/esm2022/services/lib/contact-material.mjs +0 -20
  35. package/esm2022/services/lib/ray.mjs +0 -30
  36. package/esm2022/services/lib/raycast-vehicle.mjs +0 -68
  37. package/esm2022/services/lib/spring.mjs +0 -31
  38. package/fesm2022/angular-three-cannon-services.mjs +0 -490
  39. package/fesm2022/angular-three-cannon-services.mjs.map +0 -1
  40. package/services/README.md +0 -3
  41. package/services/index.d.ts +0 -6
  42. package/services/lib/body.d.ts +0 -60
  43. package/services/lib/constraints.d.ts +0 -31
  44. package/services/lib/contact-material.d.ts +0 -9
  45. package/services/lib/ray.d.ts +0 -12
  46. package/services/lib/raycast-vehicle.d.ts +0 -30
  47. package/services/lib/spring.d.ts +0 -19
package/body/README.md ADDED
@@ -0,0 +1,3 @@
1
+ # angular-three-cannon/body
2
+
3
+ Secondary entry point of `angular-three-cannon`. It can be used by importing from `angular-three-cannon/body`.
@@ -0,0 +1,2 @@
1
+ export * from './lib/body';
2
+ export type * from './lib/types';
@@ -0,0 +1,57 @@
1
+ import { Injector } from '@angular/core';
2
+ import type { BodyShapeType, BoxProps, CompoundBodyProps, ConvexPolyhedronArgs, ConvexPolyhedronProps, CylinderArgs, CylinderProps, HeightfieldArgs, HeightfieldProps, ParticleProps, PlaneProps, SphereArgs, SphereProps, TrimeshArgs, TrimeshProps, Triplet } from '@pmndrs/cannon-worker-api';
3
+ import { type NgtInjectedRef } from 'angular-three';
4
+ import { Object3D } from 'three';
5
+ import type { NgtcBodyPublicApi, NgtcGetByIndex, NgtcTransformArg } from './types';
6
+ interface NgtcBodyProps {
7
+ Plane: {
8
+ props: PlaneProps;
9
+ args: unknown[];
10
+ };
11
+ Box: {
12
+ props: BoxProps;
13
+ args: Triplet;
14
+ };
15
+ Trimesh: {
16
+ props: TrimeshProps;
17
+ args: TrimeshArgs;
18
+ };
19
+ Cylinder: {
20
+ props: CylinderProps;
21
+ args: CylinderArgs;
22
+ };
23
+ Heightfield: {
24
+ props: HeightfieldProps;
25
+ args: HeightfieldArgs;
26
+ };
27
+ ConvexPolyhedron: {
28
+ props: ConvexPolyhedronProps;
29
+ args: ConvexPolyhedronArgs<Triplet>;
30
+ };
31
+ Particle: {
32
+ props: ParticleProps;
33
+ args: unknown[];
34
+ };
35
+ Sphere: {
36
+ props: SphereProps;
37
+ args: SphereArgs;
38
+ };
39
+ Compound: {
40
+ props: CompoundBodyProps;
41
+ args: unknown[];
42
+ };
43
+ }
44
+ export interface NgtcBodyResult {
45
+ ref: NgtInjectedRef<Object3D>;
46
+ api: NgtcBodyPublicApi;
47
+ }
48
+ interface NgtcBodyOptions<TType extends BodyShapeType = BodyShapeType> {
49
+ getPropFn: NgtcGetByIndex<NgtcBodyProps[TType]['props']>;
50
+ transformArgs?: NgtcTransformArg<NgtcBodyProps[TType]['args']>;
51
+ }
52
+ export declare function injectBody<TType extends BodyShapeType>(type: TType, getPropFn: NgtcBodyOptions<TType>['getPropFn'], { injector, ref, transformArgs, }?: {
53
+ injector?: Injector;
54
+ ref?: NgtInjectedRef<Object3D>;
55
+ transformArgs?: NgtcBodyOptions<TType>['transformArgs'];
56
+ }): NgtcBodyResult;
57
+ export {};
@@ -0,0 +1,38 @@
1
+ import type { AtomicName, AtomicProps, BodyProps, Quad, Triplet, VectorName } from '@pmndrs/cannon-worker-api';
2
+ import type { Euler, Quaternion, Vector3 } from 'three';
3
+ export type NgtcAtomicApi<K extends AtomicName> = {
4
+ set: (value: AtomicProps[K]) => void;
5
+ subscribe: (callback: (value: AtomicProps[K]) => void) => () => void;
6
+ };
7
+ export type NgtcQuaternionApi = {
8
+ copy: ({ w, x, y, z }: Quaternion) => void;
9
+ set: (x: number, y: number, z: number, w: number) => void;
10
+ subscribe: (callback: (value: Quad) => void) => () => void;
11
+ };
12
+ export type NgtcVectorApi = {
13
+ copy: ({ x, y, z }: Vector3 | Euler) => void;
14
+ set: (x: number, y: number, z: number) => void;
15
+ subscribe: (callback: (value: Triplet) => void) => () => void;
16
+ };
17
+ export type NgtcWorkerApi = {
18
+ [K in AtomicName]: NgtcAtomicApi<K>;
19
+ } & {
20
+ [K in VectorName]: NgtcVectorApi;
21
+ } & {
22
+ applyForce: (force: Triplet, worldPoint: Triplet) => void;
23
+ applyImpulse: (impulse: Triplet, worldPoint: Triplet) => void;
24
+ applyLocalForce: (force: Triplet, localPoint: Triplet) => void;
25
+ applyLocalImpulse: (impulse: Triplet, localPoint: Triplet) => void;
26
+ applyTorque: (torque: Triplet) => void;
27
+ quaternion: NgtcQuaternionApi;
28
+ rotation: NgtcVectorApi;
29
+ scaleOverride: (scale: Triplet) => void;
30
+ sleep: () => void;
31
+ wakeUp: () => void;
32
+ remove: () => void;
33
+ };
34
+ export interface NgtcBodyPublicApi extends NgtcWorkerApi {
35
+ at: (index: number) => NgtcWorkerApi;
36
+ }
37
+ export type NgtcGetByIndex<T extends BodyProps> = (index: number) => T;
38
+ export type NgtcTransformArg<T extends unknown[]> = (args: T) => T;
@@ -0,0 +1,50 @@
1
+ import { type ElementRef, type Signal } from '@angular/core';
2
+ import type { BodyProps, CannonWorkerAPI, ConvexPolyhedronArgs, CylinderArgs, HeightfieldArgs, SphereArgs, TrimeshArgs, Triplet } from '@pmndrs/cannon-worker-api';
3
+ import type { NgtcCannonEvents, NgtcPhysicsApi } from 'angular-three-cannon';
4
+ import { type Object3D } from 'three';
5
+ import type { NgtcWorkerApi } from './types';
6
+ export declare function prepare(object: Object3D, { position, rotation, userData }: BodyProps): void;
7
+ export declare function setupCollision(events: NgtcCannonEvents, { onCollide, onCollideBegin, onCollideEnd }: Partial<BodyProps>, uuid: string): void;
8
+ export declare function makeApi(worker: Signal<CannonWorkerAPI>, bodyRef: ElementRef<Object3D>, { subscriptions, bodies, scaleOverrides }: NgtcPhysicsApi): {
9
+ at: (index: number) => NgtcWorkerApi;
10
+ allowSleep: import("./types").NgtcAtomicApi<"allowSleep">;
11
+ angularDamping: import("./types").NgtcAtomicApi<"angularDamping">;
12
+ collisionFilterGroup: import("./types").NgtcAtomicApi<"collisionFilterGroup">;
13
+ collisionFilterMask: import("./types").NgtcAtomicApi<"collisionFilterMask">;
14
+ collisionResponse: import("./types").NgtcAtomicApi<"collisionResponse">;
15
+ fixedRotation: import("./types").NgtcAtomicApi<"fixedRotation">;
16
+ isTrigger: import("./types").NgtcAtomicApi<"isTrigger">;
17
+ linearDamping: import("./types").NgtcAtomicApi<"linearDamping">;
18
+ mass: import("./types").NgtcAtomicApi<"mass">;
19
+ material: import("./types").NgtcAtomicApi<"material">;
20
+ sleepSpeedLimit: import("./types").NgtcAtomicApi<"sleepSpeedLimit">;
21
+ sleepTimeLimit: import("./types").NgtcAtomicApi<"sleepTimeLimit">;
22
+ userData: import("./types").NgtcAtomicApi<"userData">;
23
+ angularFactor: import("./types").NgtcVectorApi;
24
+ angularVelocity: import("./types").NgtcVectorApi;
25
+ linearFactor: import("./types").NgtcVectorApi;
26
+ position: import("./types").NgtcVectorApi;
27
+ velocity: import("./types").NgtcVectorApi;
28
+ applyForce: (force: Triplet, worldPoint: Triplet) => void;
29
+ applyImpulse: (impulse: Triplet, worldPoint: Triplet) => void;
30
+ applyLocalForce: (force: Triplet, localPoint: Triplet) => void;
31
+ applyLocalImpulse: (impulse: Triplet, localPoint: Triplet) => void;
32
+ applyTorque: (torque: Triplet) => void;
33
+ quaternion: import("./types").NgtcQuaternionApi;
34
+ rotation: import("./types").NgtcVectorApi;
35
+ scaleOverride: (scale: Triplet) => void;
36
+ sleep: () => void;
37
+ wakeUp: () => void;
38
+ remove: () => void;
39
+ };
40
+ export declare const defaultTransformArgs: {
41
+ Plane: (args: unknown[]) => never[];
42
+ Box: (args?: Triplet) => Triplet;
43
+ Trimesh: (args: TrimeshArgs) => TrimeshArgs;
44
+ Cylinder: (args?: CylinderArgs) => never[];
45
+ Heightfield: (args: HeightfieldArgs) => HeightfieldArgs;
46
+ ConvexPolyhedron: ([vertices, faces, normals, axes, boundingSphereRadius]?: ConvexPolyhedronArgs<Triplet>) => (number | number[][] | undefined)[];
47
+ Particle: (args: unknown[]) => never[];
48
+ Sphere: (args?: SphereArgs) => number[];
49
+ Compound: (args: unknown[]) => unknown[];
50
+ };
@@ -0,0 +1,3 @@
1
+ # angular-three-cannon/constraint
2
+
3
+ Secondary entry point of `angular-three-cannon`. It can be used by importing from `angular-three-cannon/constraint`.
@@ -0,0 +1 @@
1
+ export * from './lib/constraint';
@@ -0,0 +1,26 @@
1
+ import { Injector } from '@angular/core';
2
+ import type { ConstraintOptns, ConstraintTypes, HingeConstraintOpts } from '@pmndrs/cannon-worker-api';
3
+ import { type NgtInjectedRef } from 'angular-three';
4
+ import { Object3D } from 'three';
5
+ export interface NgtcConstraintOptions<TConstraintType extends 'Hinge' | ConstraintTypes, TOptions extends HingeConstraintOpts | ConstraintOptns = TConstraintType extends 'Hinge' ? HingeConstraintOpts : ConstraintOptns> {
6
+ injector?: Injector;
7
+ options?: TOptions;
8
+ }
9
+ export interface NgtcConstraintApi {
10
+ disable: () => void;
11
+ enable: () => void;
12
+ remove: () => void;
13
+ }
14
+ export interface NgtcHingeConstraintApi extends NgtcConstraintApi {
15
+ disableMotor: () => void;
16
+ enableMotor: () => void;
17
+ setMotorMaxForce: (value: number) => void;
18
+ setMotorSpeed: (value: number) => void;
19
+ }
20
+ export type NgtcConstraintORHingeApi<T extends 'Hinge' | ConstraintTypes> = T extends ConstraintTypes ? NgtcConstraintApi : NgtcHingeConstraintApi;
21
+ export interface NgtcConstraintResult<T extends 'Hinge' | ConstraintTypes, TObjectA extends Object3D = Object3D, TObjectB extends Object3D = Object3D> {
22
+ bodyA: NgtInjectedRef<TObjectA>;
23
+ bodyB: NgtInjectedRef<TObjectB>;
24
+ api: NgtcConstraintORHingeApi<T>;
25
+ }
26
+ export declare function injectConstraint<TType extends ConstraintTypes | 'Hinge', TBodyA extends Object3D = Object3D, TBodyB extends Object3D = Object3D>(type: TType, bodyA: TBodyA | NgtInjectedRef<TBodyA>, bodyB: TBodyB | NgtInjectedRef<TBodyB>, { injector, options }?: NgtcConstraintOptions<TType>): NgtcConstraintResult<TType, TBodyA, TBodyB>;
@@ -1,4 +1,3 @@
1
- import { type OnInit } from '@angular/core';
2
1
  import { type BodyProps, type BodyShapeType } from '@pmndrs/cannon-worker-api';
3
2
  import CannonDebugger from 'cannon-es-debugger';
4
3
  import * as THREE from 'three';
@@ -10,34 +9,36 @@ export declare const injectNgtcDebugApi: {
10
9
  };
11
10
  (injectOptions: import("@angular/core").InjectOptions & {
12
11
  optional?: false | undefined;
12
+ } & {
13
+ injector?: import("@angular/core").Injector | undefined;
13
14
  }): {
14
15
  add: (uuid: string, props: BodyProps, type: BodyShapeType) => void;
15
16
  remove: (id: string) => void;
16
17
  };
17
- (injectOptions: import("@angular/core").InjectOptions): {
18
+ (injectOptions: import("@angular/core").InjectOptions & {
19
+ injector?: import("@angular/core").Injector | undefined;
20
+ }): {
18
21
  add: (uuid: string, props: BodyProps, type: BodyShapeType) => void;
19
22
  remove: (id: string) => void;
20
23
  } | null;
21
- }, provideNgtcDebugApi: (value?: {
22
- add: (uuid: string, props: BodyProps, type: BodyShapeType) => void;
23
- remove: (id: string) => void;
24
- } | undefined) => import("@angular/core").Provider;
25
- export declare class NgtcDebug implements OnInit {
26
- color: string;
27
- scale: number;
28
- impl: typeof CannonDebugger;
29
- disabled: boolean;
24
+ }, provideNgtcDebugApi: () => import("@angular/core").Provider;
25
+ export declare class NgtcDebug {
26
+ color: import("@angular/core").InputSignal<string>;
27
+ scale: import("@angular/core").InputSignal<number>;
28
+ impl: import("@angular/core").InputSignal<typeof CannonDebugger>;
29
+ debug: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
30
+ protected scene: THREE.Scene;
30
31
  private bodies;
31
32
  private bodyMap;
33
+ private store;
34
+ private defaultScene;
32
35
  private physicsApi;
33
- scene: THREE.Scene;
34
36
  private cannonDebugger;
35
37
  api: {
36
38
  add: (uuid: string, props: BodyProps, type: BodyShapeType) => void;
37
39
  remove: (id: string) => void;
38
40
  };
39
41
  constructor();
40
- ngOnInit(): void;
41
42
  static ɵfac: i0.ɵɵFactoryDeclaration<NgtcDebug, never>;
42
- static ɵcmp: i0.ɵɵComponentDeclaration<NgtcDebug, "ngtc-debug", never, { "color": { "alias": "color"; "required": false; }; "scale": { "alias": "scale"; "required": false; }; "impl": { "alias": "impl"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; }, {}, never, ["*"], true, never>;
43
+ static ɵdir: i0.ɵɵDirectiveDeclaration<NgtcDebug, "ngtc-physics[debug]", never, { "color": { "alias": "color"; "required": false; "isSignal": true; }; "scale": { "alias": "scale"; "required": false; "isSignal": true; }; "impl": { "alias": "impl"; "required": false; "isSignal": true; }; "debug": { "alias": "debug"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
43
44
  }
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './index';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci10aHJlZS1jYW5ub24tYm9keS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvY2Fubm9uL2JvZHkvc3JjL2FuZ3VsYXItdGhyZWUtY2Fubm9uLWJvZHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLFNBQVMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9pbmRleCc7XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export * from './lib/body';
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2Nhbm5vbi9ib2R5L3NyYy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLFlBQVksQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vbGliL2JvZHknO1xuZXhwb3J0IHR5cGUgKiBmcm9tICcuL2xpYi90eXBlcyc7XG4iXX0=
@@ -0,0 +1,83 @@
1
+ import { afterNextRender, effect, inject, Injector } from '@angular/core';
2
+ import { injectNgtRef } from 'angular-three';
3
+ import { injectNgtcPhysicsApi } from 'angular-three-cannon';
4
+ import { injectNgtcDebugApi } from 'angular-three-cannon/debug';
5
+ import { assertInjector } from 'ngxtension/assert-injector';
6
+ import { DynamicDrawUsage, InstancedMesh, Object3D } from 'three';
7
+ import { defaultTransformArgs, makeApi, prepare, setupCollision } from './utils';
8
+ export function injectBody(type, getPropFn, { injector, ref, transformArgs, } = {}) {
9
+ return assertInjector(injectBody, injector, () => {
10
+ const assertedInjector = inject(Injector);
11
+ const physicsApi = injectNgtcPhysicsApi();
12
+ const debugApi = injectNgtcDebugApi({ optional: true });
13
+ const [{ add: addToDebug, remove: removeFromDebug }, physics, worker] = [
14
+ debugApi || {},
15
+ physicsApi.get(),
16
+ physicsApi.select('worker'),
17
+ ];
18
+ const transform = transformArgs ?? defaultTransformArgs[type];
19
+ const bodyResult = { ref: ref ?? injectNgtRef() };
20
+ afterNextRender(() => {
21
+ Object.assign(bodyResult, { api: makeApi(worker, bodyResult.ref, physics) });
22
+ effect((onCleanup) => {
23
+ const currentWorker = worker();
24
+ if (!currentWorker)
25
+ return;
26
+ if (!bodyResult.ref.nativeElement) {
27
+ bodyResult.ref.nativeElement = new Object3D();
28
+ return;
29
+ }
30
+ const object = bodyResult.ref.nativeElement;
31
+ const [uuid, props] = (() => {
32
+ let uuids = [];
33
+ let temp;
34
+ if (object instanceof InstancedMesh) {
35
+ object.instanceMatrix.setUsage(DynamicDrawUsage);
36
+ uuids = new Array(object.count).fill(0).map((_, i) => `${object.uuid}/${i}`);
37
+ temp = new Object3D();
38
+ }
39
+ else {
40
+ uuids = [object.uuid];
41
+ }
42
+ return [
43
+ uuids,
44
+ uuids.map((id, index) => {
45
+ const props = getPropFn(index);
46
+ if (temp) {
47
+ prepare(temp, props);
48
+ object.setMatrixAt(index, temp.matrix);
49
+ object.instanceMatrix.needsUpdate = true;
50
+ }
51
+ else {
52
+ prepare(object, props);
53
+ }
54
+ physics.refs[id] = object;
55
+ addToDebug?.(id, props, type);
56
+ setupCollision(physics.events, props, id);
57
+ // @ts-expect-error - if args is undefined, there's default
58
+ return { ...props, args: transform(props.args) };
59
+ }),
60
+ ];
61
+ })();
62
+ // Register on mount, unregister on unmount
63
+ currentWorker.addBodies({
64
+ props: props.map(({ onCollide, onCollideBegin, onCollideEnd, ...serializableProps }) => {
65
+ return { onCollide: Boolean(onCollide), ...serializableProps };
66
+ }),
67
+ type,
68
+ uuid,
69
+ });
70
+ onCleanup(() => {
71
+ uuid.forEach((id) => {
72
+ delete physics.refs[id];
73
+ removeFromDebug?.(id);
74
+ delete physics.events[id];
75
+ });
76
+ currentWorker.removeBodies({ uuid: uuid });
77
+ });
78
+ }, { injector: assertedInjector });
79
+ });
80
+ return bodyResult;
81
+ });
82
+ }
83
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9keS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY2Fubm9uL2JvZHkvc3JjL2xpYi9ib2R5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFtQjFFLE9BQU8sRUFBRSxZQUFZLEVBQXVCLE1BQU0sZUFBZSxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzVELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUVsRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxTQUFTLENBQUM7QUF3QmpGLE1BQU0sVUFBVSxVQUFVLENBQ3pCLElBQVcsRUFDWCxTQUE4QyxFQUM5QyxFQUNDLFFBQVEsRUFDUixHQUFHLEVBQ0gsYUFBYSxNQUtWLEVBQUU7SUFFTixPQUFPLGNBQWMsQ0FBQyxVQUFVLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRTtRQUNoRCxNQUFNLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUUxQyxNQUFNLFVBQVUsR0FBRyxvQkFBb0IsRUFBRSxDQUFDO1FBQzFDLE1BQU0sUUFBUSxHQUFHLGtCQUFrQixDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFFeEQsTUFBTSxDQUFDLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsZUFBZSxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxHQUFH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QUM7cUJBQ08sQ0FBQztnQkFDWixDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUVMLDJDQUEyQztnQkFDM0MsYUFBYSxDQUFDLFNBQVMsQ0FBQztvQkFDdkIsS0FBSyxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxjQUFjLEVBQUUsWUFBWSxFQUFFLEdBQUcsaUJBQWlCLEVBQUUsRUFBRSxFQUFFO3dCQUN0RixPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRSxHQUFHLGlCQUFpQixFQUFFLENBQUM7b0JBQ2hFLENBQUMsQ0FBQztvQkFDRixJQUFJO29CQUNKLElBQUk7aUJBQ0osQ0FBQyxDQUFDO2dCQUVILFNBQVMsQ0FBQyxHQUFHLEVBQUU7b0JBQ2QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFO3dCQUNuQixPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7d0JBQ3hCLGVBQWUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO3dCQUN0QixPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBQzNCLENBQUMsQ0FBQyxDQUFDO29CQUNILGFBQWEsQ0FBQyxZQUFZLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFDNUMsQ0FBQyxDQUFDLENBQUM7WUFDSixDQUFDLEVBQ0QsRUFBRSxRQUFRLEVBQUUsZ0JBQWdCLEVBQUUsQ0FDOUIsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxVQUFVLENBQUM7SUFDbkIsQ0FBQyxDQUFDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYWZ0ZXJOZXh0UmVuZGVyLCBlZmZlY3QsIGluamVjdCwgSW5qZWN0b3IgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB0eXBlIHtcblx0Qm9keVNoYXBlVHlwZSxcblx0Qm94UHJvcHMsXG5cdENvbXBvdW5kQm9keVByb3BzLFxuXHRDb252ZXhQb2x5aGVkcm9uQXJncyxcblx0Q29udmV4UG9seWhlZHJvblByb3BzLFxuXHRDeWxpbmRlckFyZ3MsXG5cdEN5bGluZGVyUHJvcHMsXG5cdEhlaWdodGZpZWxkQXJncyxcblx0SGVpZ2h0ZmllbGRQcm9wcyxcblx0UGFydGljbGVQcm9wcyxcblx0UGxhbmVQcm9wcyxcblx0U3BoZXJlQXJncyxcblx0U3BoZXJlUHJvcHMsXG5cdFRyaW1lc2hBcmdzLFxuXHRUcmltZXNoUHJvcHMsXG5cdFRyaXBsZXQsXG59IGZyb20gJ0BwbW5kcnMvY2Fubm9uLXdvcmtlci1hcGknO1xuaW1wb3J0IHsgaW5qZWN0Tmd0UmVmLCB0eXBlIE5ndEluamVjdGVkUmVmIH0gZnJvbSAnYW5ndWxhci10aHJlZSc7XG5pbXBvcnQgeyBpbmplY3ROZ3RjUGh5c2ljc0FwaSB9IGZyb20gJ2FuZ3VsYXItdGhyZWUtY2Fubm9uJztcbmltcG9ydCB7IGluamVjdE5ndGNEZWJ1Z0FwaSB9IGZyb20gJ2FuZ3VsYXItdGhyZWUtY2Fubm9uL2RlYnVnJztcbmltcG9ydCB7IGFzc2VydEluamVjdG9yIH0gZnJvbSAnbmd4dGVuc2lvbi9hc3NlcnQtaW5qZWN0b3InO1xuaW1wb3J0IHsgRHluYW1pY0RyYXdVc2FnZSwgSW5zdGFuY2VkTWVzaCwgT2JqZWN0M0QgfSBmcm9tICd0aHJlZSc7XG5pbXBvcnQgdHlwZSB7IE5ndGNCb2R5UHVibGljQXBpLCBOZ3RjR2V0QnlJbmRleCwgTmd0Y1RyYW5zZm9ybUFyZyB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgZGVmYXVsdFRyYW5zZm9ybUFyZ3MsIG1ha2VBcGksIHByZXBhcmUsIHNldHVwQ29sbGlzaW9uIH0gZnJvbSAnLi91dGlscyc7XG5cbmludGVyZmFjZSBOZ3RjQm9keVByb3BzIHtcblx0UGxhbmU6IHsgcHJvcHM6IFBsYW5lUHJvcHM7IGFyZ3M6IHVua25vd25bXSB9O1xuXHRCb3g6IHsgcHJvcHM6IEJveFByb3BzOyBhcmdzOiBUcmlwbGV0IH07XG5cdFRyaW1lc2g6IHsgcHJvcHM6IFRyaW1lc2hQcm9wczsgYXJnczogVHJpbWVzaEFyZ3MgfTtcblx0Q3lsaW5kZXI6IHsgcHJvcHM6IEN5bGluZGVyUHJvcHM7IGFyZ3M6IEN5bGluZGVyQXJncyB9O1xuXHRIZWlnaHRmaWVsZDogeyBwcm9wczogSGVpZ2h0ZmllbGRQcm9wczsgYXJnczogSGVpZ2h0ZmllbGRBcmdzIH07XG5cdENvbnZleFBvbHloZWRyb246IHsgcHJvcHM6IENvbnZleFBvbHloZWRyb25Qcm9wczsgYXJnczogQ29udmV4UG9seWhlZHJvbkFyZ3M8VHJpcGxldD4gfTtcblx0UGFydGljbGU6IHsgcHJvcHM6IFBhcnRpY2xlUHJvcHM7IGFyZ3M6IHVua25vd25bXSB9O1xuXHRTcGhlcmU6IHsgcHJvcHM6IFNwaGVyZVByb3BzOyBhcmdzOiBTcGhlcmVBcmdzIH07XG5cdENvbXBvdW5kOiB7IHByb3BzOiBDb21wb3VuZEJvZHlQcm9wczsgYXJnczogdW5rbm93bltdIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmd0Y0JvZHlSZXN1bHQge1xuXHRyZWY6IE5ndEluamVjdGVkUmVmPE9iamVjdDNEPjtcblx0YXBpOiBOZ3RjQm9keVB1YmxpY0FwaTtcbn1cblxuaW50ZXJmYWNlIE5ndGNCb2R5T3B0aW9uczxUVHlwZSBleHRlbmRzIEJvZHlTaGFwZVR5cGUgPSBCb2R5U2hhcGVUeXBlPiB7XG5cdGdldFByb3BGbjogTmd0Y0dldEJ5SW5kZXg8Tmd0Y0JvZHlQcm9wc1tUVHlwZV1bJ3Byb3BzJ10+O1xuXHR0cmFuc2Zvcm1BcmdzPzogTmd0Y1RyYW5zZm9ybUFyZzxOZ3RjQm9keVByb3BzW1RUeXBlXVsnYXJncyddPjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluamVjdEJvZHk8VFR5cGUgZXh0ZW5kcyBCb2R5U2hhcGVUeXBlPihcblx0dHlwZTogVFR5cGUsXG5cdGdldFByb3BGbjogTmd0Y0JvZHlPcHRpb25zPFRUeXBlPlsnZ2V0UHJvcEZuJ10sXG5cdHtcblx0XHRpbmplY3Rvcixcblx0XHRyZWYsXG5cdFx0dHJhbnNmb3JtQXJncyxcblx0fToge1xuXHRcdGluamVjdG9yPzogSW5qZWN0b3I7XG5cdFx0cmVmPzogTmd0SW5qZWN0ZWRSZWY8T2JqZWN0M0Q+O1xuXHRcdHRyYW5zZm9ybUFyZ3M/OiBOZ3RjQm9keU9wdGlvbnM8VFR5cGU+Wyd0cmFuc2Zvcm1BcmdzJ107XG5cdH0gPSB7fSxcbik6IE5ndGNCb2R5UmVzdWx0IHtcblx0cmV0dXJuIGFzc2VydEluamVjdG9yKGluamVjdEJvZHksIGluamVjdG9yLCAoKSA9PiB7XG5cdFx0Y29uc3QgYXNzZXJ0ZWRJbmplY3RvciA9IGluamVjdChJbmplY3Rvcik7XG5cblx0XHRjb25zdCBwaHlzaWNzQXBpID0gaW5qZWN0Tmd0Y1BoeXNpY3NBcGkoKTtcblx0XHRjb25zdCBkZWJ1Z0FwaSA9IGluamVjdE5ndGNEZWJ1Z0FwaSh7IG9wdGlvbmFsOiB0cnVlIH0pO1xuXG5cdFx0Y29uc3QgW3sgYWRkOiBhZGRUb0RlYnVnLCByZW1vdmU6IHJlbW92ZUZyb21EZWJ1ZyB9LCBwaHlzaWNzLCB3b3JrZXJdID0gW1xuXHRcdFx0ZGVidWdBcGkgfHwge30sXG5cdFx0XHRwaHlzaWNzQXBpLmdldCgpLFxuXHRcdFx0cGh5c2ljc0FwaS5zZWxlY3QoJ3dvcmtlcicpLFxuXHRcdF07XG5cdFx0Y29uc3QgdHJhbnNmb3JtID0gdHJhbnNmb3JtQXJncyA/PyBkZWZhdWx0VHJhbnNmb3JtQXJnc1t0eXBlXTtcblxuXHRcdGNvbnN0IGJvZHlSZXN1bHQgPSB7IHJlZjogcmVmID8/IGluamVjdE5ndFJlZigpIH0gYXMgTmd0Y0JvZHlSZXN1bHQ7XG5cblx0XHRhZnRlck5leHRSZW5kZXIoKCkgPT4ge1xuXHRcdFx0T2JqZWN0LmFzc2lnbihib2R5UmVzdWx0LCB7IGFwaTogbWFrZUFwaSh3b3JrZXIsIGJvZHlSZXN1bHQucmVmLCBwaHlzaWNzKSB9KTtcblxuXHRcdFx0ZWZmZWN0KFxuXHRcdFx0XHQob25DbGVhbnVwKSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgY3VycmVudFdvcmtlciA9IHdvcmtlcigpO1xuXHRcdFx0XHRcdGlmICghY3VycmVudFdvcmtlcikgcmV0dXJuO1xuXG5cdFx0XHRcdFx0aWYgKCFib2R5UmVzdWx0LnJlZi5uYXRpdmVFbGVtZW50KSB7XG5cdFx0XHRcdFx0XHRib2R5UmVzdWx0LnJlZi5uYXRpdmVFbGVtZW50ID0gbmV3IE9iamVjdDNEKCk7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Y29uc3Qgb2JqZWN0ID0gYm9keVJlc3VsdC5yZWYubmF0aXZlRWxlbWVudDtcblxuXHRcdFx0XHRcdGNvbnN0IFt1dWlkLCBwcm9wc10gPSAoKCkgPT4ge1xuXHRcdFx0XHRcdFx0bGV0IHV1aWRzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdFx0XHRcdFx0bGV0IHRlbXA6IE9iamVjdDNEO1xuXG5cdFx0XHRcdFx0XHRpZiAob2JqZWN0IGluc3RhbmNlb2YgSW5zdGFuY2VkTWVzaCkge1xuXHRcdFx0XHRcdFx0XHRvYmplY3QuaW5zdGFuY2VNYXRyaXguc2V0VXNhZ2UoRHluYW1pY0RyYXdVc2FnZSk7XG5cdFx0XHRcdFx0XHRcdHV1aWRzID0gbmV3IEFycmF5KG9iamVjdC5jb3VudCkuZmlsbCgwKS5tYXAoKF8sIGkpID0+IGAke29iamVjdC51dWlkfS8ke2l9YCk7XG5cdFx0XHRcdFx0XHRcdHRlbXAgPSBuZXcgT2JqZWN0M0QoKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHV1aWRzID0gW29iamVjdC51dWlkXTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0cmV0dXJuIFtcblx0XHRcdFx0XHRcdFx0dXVpZHMsXG5cdFx0XHRcdFx0XHRcdHV1aWRzLm1hcCgoaWQsIGluZGV4KSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgcHJvcHMgPSBnZXRQcm9wRm4oaW5kZXgpO1xuXHRcdFx0XHRcdFx0XHRcdGlmICh0ZW1wKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRwcmVwYXJlKHRlbXAsIHByb3BzKTtcblx0XHRcdFx0XHRcdFx0XHRcdChvYmplY3QgYXMgSW5zdGFuY2VkTWVzaCkuc2V0TWF0cml4QXQoaW5kZXgsIHRlbXAubWF0cml4KTtcblx0XHRcdFx0XHRcdFx0XHRcdChvYmplY3QgYXMgSW5zdGFuY2VkTWVzaCkuaW5zdGFuY2VNYXRyaXgubmVlZHNVcGRhdGUgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRwcmVwYXJlKG9iamVjdCwgcHJvcHMpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRwaHlzaWNzLnJlZnNbaWRdID0gb2JqZWN0O1xuXHRcdFx0XHRcdFx0XHRcdGFkZFRvRGVidWc/LihpZCwgcHJvcHMsIHR5cGUpO1xuXHRcdFx0XHRcdFx0XHRcdHNldHVwQ29sbGlzaW9uKHBoeXNpY3MuZXZlbnRzLCBwcm9wcywgaWQpO1xuXHRcdFx0XHRcdFx0XHRcdC8vIEB0cy1leHBlY3QtZXJyb3IgLSBpZiBhcmdzIGlzIHVuZGVmaW5lZCwgdGhlcmUncyBkZWZhdWx0XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHsgLi4ucHJvcHMsIGFyZ3M6IHRyYW5zZm9ybShwcm9wcy5hcmdzKSB9O1xuXHRcdFx0XHRcdFx0XHR9KSxcblx0XHRcdFx0XHRcdF0gYXMgY29uc3Q7XG5cdFx0XHRcdFx0fSkoKTtcblxuXHRcdFx0XHRcdC8vIFJlZ2lzdGVyIG9uIG1vdW50LCB1bnJlZ2lzdGVyIG9uIHVubW91bnRcblx0XHRcdFx0XHRjdXJyZW50V29ya2VyLmFkZEJvZGllcyh7XG5cdFx0XHRcdFx0XHRwcm9wczogcHJvcHMubWFwKCh7IG9uQ29sbGlkZSwgb25Db2xsaWRlQmVnaW4sIG9uQ29sbGlkZUVuZCwgLi4uc2VyaWFsaXphYmxlUHJvcHMgfSkgPT4ge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4geyBvbkNvbGxpZGU6IEJvb2xlYW4ob25Db2xsaWRlKSwgLi4uc2VyaWFsaXphYmxlUHJvcHMgfTtcblx0XHRcdFx0XHRcdH0pLFxuXHRcdFx0XHRcdFx0dHlwZSxcblx0XHRcdFx0XHRcdHV1aWQsXG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHRvbkNsZWFudXAoKCkgPT4ge1xuXHRcdFx0XHRcdFx0dXVpZC5mb3JFYWNoKChpZCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRkZWxldGUgcGh5c2ljcy5yZWZzW2lkXTtcblx0XHRcdFx0XHRcdFx0cmVtb3ZlRnJvbURlYnVnPy4oaWQpO1xuXHRcdFx0XHRcdFx0XHRkZWxldGUgcGh5c2ljcy5ldmVudHNbaWRdO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRjdXJyZW50V29ya2VyLnJlbW92ZUJvZGllcyh7IHV1aWQ6IHV1aWQgfSk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHsgaW5qZWN0b3I6IGFzc2VydGVkSW5qZWN0b3IgfSxcblx0XHRcdCk7XG5cdFx0fSk7XG5cblx0XHRyZXR1cm4gYm9keVJlc3VsdDtcblx0fSk7XG59XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2Nhbm5vbi9ib2R5L3NyYy9saWIvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQXRvbWljTmFtZSwgQXRvbWljUHJvcHMsIEJvZHlQcm9wcywgUXVhZCwgVHJpcGxldCwgVmVjdG9yTmFtZSB9IGZyb20gJ0BwbW5kcnMvY2Fubm9uLXdvcmtlci1hcGknO1xuaW1wb3J0IHR5cGUgeyBFdWxlciwgUXVhdGVybmlvbiwgVmVjdG9yMyB9IGZyb20gJ3RocmVlJztcblxuZXhwb3J0IHR5cGUgTmd0Y0F0b21pY0FwaTxLIGV4dGVuZHMgQXRvbWljTmFtZT4gPSB7XG5cdHNldDogKHZhbHVlOiBBdG9taWNQcm9wc1tLXSkgPT4gdm9pZDtcblx0c3Vic2NyaWJlOiAoY2FsbGJhY2s6ICh2YWx1ZTogQXRvbWljUHJvcHNbS10pID0+IHZvaWQpID0+ICgpID0+IHZvaWQ7XG59O1xuZXhwb3J0IHR5cGUgTmd0Y1F1YXRlcm5pb25BcGkgPSB7XG5cdGNvcHk6ICh7IHcsIHgsIHksIHogfTogUXVhdGVybmlvbikgPT4gdm9pZDtcblx0c2V0OiAoeDogbnVtYmVyLCB5OiBudW1iZXIsIHo6IG51bWJlciwgdzogbnVtYmVyKSA9PiB2b2lkO1xuXHRzdWJzY3JpYmU6IChjYWxsYmFjazogKHZhbHVlOiBRdWFkKSA9PiB2b2lkKSA9PiAoKSA9PiB2b2lkO1xufTtcbmV4cG9ydCB0eXBlIE5ndGNWZWN0b3JBcGkgPSB7XG5cdGNvcHk6ICh7IHgsIHksIHogfTogVmVjdG9yMyB8IEV1bGVyKSA9PiB2b2lkO1xuXHRzZXQ6ICh4OiBudW1iZXIsIHk6IG51bWJlciwgejogbnVtYmVyKSA9PiB2b2lkO1xuXHRzdWJzY3JpYmU6IChjYWxsYmFjazogKHZhbHVlOiBUcmlwbGV0KSA9PiB2b2lkKSA9PiAoKSA9PiB2b2lkO1xufTtcbmV4cG9ydCB0eXBlIE5ndGNXb3JrZXJBcGkgPSB7XG5cdFtLIGluIEF0b21pY05hbWVdOiBOZ3RjQXRvbWljQXBpPEs+O1xufSAmIHtcblx0W0sgaW4gVmVjdG9yTmFtZV06IE5ndGNWZWN0b3JBcGk7XG59ICYge1xuXHRhcHBseUZvcmNlOiAoZm9yY2U6IFRyaXBsZXQsIHdvcmxkUG9pbnQ6IFRyaXBsZXQpID0+IHZvaWQ7XG5cdGFwcGx5SW1wdWxzZTogKGltcHVsc2U6IFRyaXBsZXQsIHdvcmxkUG9pbnQ6IFRyaXBsZXQpID0+IHZvaWQ7XG5cdGFwcGx5TG9jYWxGb3JjZTogKGZvcmNlOiBUcmlwbGV0LCBsb2NhbFBvaW50OiBUcmlwbGV0KSA9PiB2b2lkO1xuXHRhcHBseUxvY2FsSW1wdWxzZTogKGltcHVsc2U6IFRyaXBsZXQsIGxvY2FsUG9pbnQ6IFRyaXBsZXQpID0+IHZvaWQ7XG5cdGFwcGx5VG9ycXVlOiAodG9ycXVlOiBUcmlwbGV0KSA9PiB2b2lkO1xuXHRxdWF0ZXJuaW9uOiBOZ3RjUXVhdGVybmlvbkFwaTtcblx0cm90YXRpb246IE5ndGNWZWN0b3JBcGk7XG5cdHNjYWxlT3ZlcnJpZGU6IChzY2FsZTogVHJpcGxldCkgPT4gdm9pZDtcblx0c2xlZXA6ICgpID0+IHZvaWQ7XG5cdHdha2VVcDogKCkgPT4gdm9pZDtcblx0cmVtb3ZlOiAoKSA9PiB2b2lkO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBOZ3RjQm9keVB1YmxpY0FwaSBleHRlbmRzIE5ndGNXb3JrZXJBcGkge1xuXHRhdDogKGluZGV4OiBudW1iZXIpID0+IE5ndGNXb3JrZXJBcGk7XG59XG5cbmV4cG9ydCB0eXBlIE5ndGNHZXRCeUluZGV4PFQgZXh0ZW5kcyBCb2R5UHJvcHM+ID0gKGluZGV4OiBudW1iZXIpID0+IFQ7XG5leHBvcnQgdHlwZSBOZ3RjVHJhbnNmb3JtQXJnPFQgZXh0ZW5kcyB1bmtub3duW10+ID0gKGFyZ3M6IFQpID0+IFQ7XG4iXX0=
@@ -0,0 +1,205 @@
1
+ import {} from '@angular/core';
2
+ import { Euler, Quaternion, Vector3 } from 'three';
3
+ function capitalize(str) {
4
+ return (str.charAt(0).toUpperCase() + str.slice(1));
5
+ }
6
+ function getUUID(ref, index) {
7
+ const suffix = index === undefined ? '' : `/${index}`;
8
+ if (typeof ref === 'function')
9
+ return null;
10
+ return ref && ref.nativeElement && `${ref.nativeElement.uuid}${suffix}`;
11
+ }
12
+ const e = new Euler();
13
+ const q = new Quaternion();
14
+ function quaternionToRotation(callback) {
15
+ return (v) => callback(e.setFromQuaternion(q.fromArray(v)).toArray());
16
+ }
17
+ let incrementingId = 0;
18
+ function createSubscribe(ref, worker, subscriptions, type, index, target = 'bodies') {
19
+ return (callback) => {
20
+ const id = incrementingId++;
21
+ subscriptions[id] = { [type]: callback };
22
+ const uuid = getUUID(ref, index);
23
+ uuid && worker.subscribe({ props: { id, target, type }, uuid });
24
+ return () => {
25
+ delete subscriptions[id];
26
+ worker.unsubscribe({ props: id });
27
+ };
28
+ };
29
+ }
30
+ function makeTriplet(v) {
31
+ return v instanceof Vector3 ? [v.x, v.y, v.z] : v;
32
+ }
33
+ export function prepare(object, { position = [0, 0, 0], rotation = [0, 0, 0], userData = {} }) {
34
+ object.userData = userData;
35
+ object.position.set(...position);
36
+ object.rotation.set(...rotation);
37
+ object.updateMatrix();
38
+ }
39
+ export function setupCollision(events, { onCollide, onCollideBegin, onCollideEnd }, uuid) {
40
+ events[uuid] = {
41
+ collide: onCollide,
42
+ collideBegin: onCollideBegin,
43
+ collideEnd: onCollideEnd,
44
+ };
45
+ }
46
+ export function makeApi(worker, bodyRef, { subscriptions, bodies, scaleOverrides }) {
47
+ const makeAtomic = (type, index) => {
48
+ const op = `set${capitalize(type)}`;
49
+ return {
50
+ set: (value) => {
51
+ const uuid = getUUID(bodyRef, index);
52
+ uuid &&
53
+ worker()[op]({
54
+ props: value,
55
+ uuid,
56
+ });
57
+ },
58
+ subscribe: createSubscribe(bodyRef, worker(), subscriptions, type, index),
59
+ };
60
+ };
61
+ const makeQuaternion = (index) => {
62
+ const type = 'quaternion';
63
+ return {
64
+ copy: ({ w, x, y, z }) => {
65
+ const uuid = getUUID(bodyRef, index);
66
+ uuid && bodies[uuid] != null && worker().setQuaternion({ props: [x, y, z, w], uuid });
67
+ },
68
+ set: (x, y, z, w) => {
69
+ const uuid = getUUID(bodyRef, index);
70
+ uuid && bodies[uuid] != null && worker().setQuaternion({ props: [x, y, z, w], uuid });
71
+ },
72
+ subscribe: createSubscribe(bodyRef, worker(), subscriptions, type, index),
73
+ };
74
+ };
75
+ const makeRotation = (index) => {
76
+ return {
77
+ copy: ({ x, y, z }) => {
78
+ const uuid = getUUID(bodyRef, index);
79
+ uuid && bodies[uuid] != null && worker().setRotation({ props: [x, y, z], uuid });
80
+ },
81
+ set: (x, y, z) => {
82
+ const uuid = getUUID(bodyRef, index);
83
+ uuid && bodies[uuid] != null && worker().setRotation({ props: [x, y, z], uuid });
84
+ },
85
+ subscribe: (callback) => {
86
+ const id = incrementingId++;
87
+ const target = 'bodies';
88
+ const type = 'quaternion';
89
+ const uuid = getUUID(bodyRef, index);
90
+ subscriptions[id] = { [type]: quaternionToRotation(callback) };
91
+ uuid && bodies[uuid] != null && worker().subscribe({ props: { id, target, type }, uuid });
92
+ return () => {
93
+ delete subscriptions[id];
94
+ worker().unsubscribe({ props: id });
95
+ };
96
+ },
97
+ };
98
+ };
99
+ const makeVec = (type, index) => {
100
+ const op = `set${capitalize(type)}`;
101
+ return {
102
+ copy: ({ x, y, z }) => {
103
+ const uuid = getUUID(bodyRef, index);
104
+ uuid && bodies[uuid] != null && worker()[op]({ props: [x, y, z], uuid });
105
+ },
106
+ set: (x, y, z) => {
107
+ const uuid = getUUID(bodyRef, index);
108
+ uuid && bodies[uuid] != null && worker()[op]({ props: [x, y, z], uuid });
109
+ },
110
+ subscribe: createSubscribe(bodyRef, worker(), subscriptions, type, index),
111
+ };
112
+ };
113
+ const makeRemove = (index) => {
114
+ const uuid = getUUID(bodyRef, index);
115
+ return () => {
116
+ if (uuid)
117
+ worker().removeBodies({ uuid: [uuid] });
118
+ };
119
+ };
120
+ function makeApi(index) {
121
+ return {
122
+ allowSleep: makeAtomic('allowSleep', index),
123
+ angularDamping: makeAtomic('angularDamping', index),
124
+ angularFactor: makeVec('angularFactor', index),
125
+ angularVelocity: makeVec('angularVelocity', index),
126
+ applyForce(force, worldPoint) {
127
+ const uuid = getUUID(bodyRef, index);
128
+ uuid && bodies[uuid] != null && worker().applyForce({ props: [force, worldPoint], uuid });
129
+ },
130
+ applyImpulse(impulse, worldPoint) {
131
+ const uuid = getUUID(bodyRef, index);
132
+ uuid && bodies[uuid] != null && worker().applyImpulse({ props: [impulse, worldPoint], uuid });
133
+ },
134
+ applyLocalForce(force, localPoint) {
135
+ const uuid = getUUID(bodyRef, index);
136
+ uuid && bodies[uuid] != null && worker().applyLocalForce({ props: [force, localPoint], uuid });
137
+ },
138
+ applyLocalImpulse(impulse, localPoint) {
139
+ const uuid = getUUID(bodyRef, index);
140
+ uuid && bodies[uuid] != null && worker().applyLocalImpulse({ props: [impulse, localPoint], uuid });
141
+ },
142
+ applyTorque(torque) {
143
+ const uuid = getUUID(bodyRef, index);
144
+ uuid && bodies[uuid] != null && worker().applyTorque({ props: [torque], uuid });
145
+ },
146
+ collisionFilterGroup: makeAtomic('collisionFilterGroup', index),
147
+ collisionFilterMask: makeAtomic('collisionFilterMask', index),
148
+ collisionResponse: makeAtomic('collisionResponse', index),
149
+ fixedRotation: makeAtomic('fixedRotation', index),
150
+ isTrigger: makeAtomic('isTrigger', index),
151
+ linearDamping: makeAtomic('linearDamping', index),
152
+ linearFactor: makeVec('linearFactor', index),
153
+ mass: makeAtomic('mass', index),
154
+ material: makeAtomic('material', index),
155
+ position: makeVec('position', index),
156
+ quaternion: makeQuaternion(index),
157
+ rotation: makeRotation(index),
158
+ scaleOverride(scale) {
159
+ const uuid = getUUID(bodyRef, index);
160
+ if (uuid)
161
+ scaleOverrides[uuid] = new Vector3(...scale);
162
+ },
163
+ sleep() {
164
+ const uuid = getUUID(bodyRef, index);
165
+ uuid && bodies[uuid] != null && worker().sleep({ uuid });
166
+ },
167
+ sleepSpeedLimit: makeAtomic('sleepSpeedLimit', index),
168
+ sleepTimeLimit: makeAtomic('sleepTimeLimit', index),
169
+ userData: makeAtomic('userData', index),
170
+ velocity: makeVec('velocity', index),
171
+ remove: makeRemove(index),
172
+ wakeUp() {
173
+ const uuid = getUUID(bodyRef, index);
174
+ uuid && bodies[uuid] != null && worker().wakeUp({ uuid });
175
+ },
176
+ };
177
+ }
178
+ const cache = {};
179
+ return {
180
+ ...makeApi(undefined),
181
+ at: (index) => cache[index] || (cache[index] = makeApi(index)),
182
+ };
183
+ }
184
+ export const defaultTransformArgs = {
185
+ Plane: (args) => [],
186
+ Box: (args = [1, 1, 1]) => args,
187
+ Trimesh: (args) => args,
188
+ Cylinder: (args = []) => [],
189
+ Heightfield: (args) => args,
190
+ ConvexPolyhedron: ([vertices, faces, normals, axes, boundingSphereRadius] = []) => [
191
+ vertices && vertices.map(makeTriplet),
192
+ faces,
193
+ normals && normals.map(makeTriplet),
194
+ axes && axes.map(makeTriplet),
195
+ boundingSphereRadius,
196
+ ],
197
+ Particle: (args) => [],
198
+ Sphere: (args = [1]) => {
199
+ if (!Array.isArray(args))
200
+ throw new Error('Sphere body args must be an array');
201
+ return [args[0]];
202
+ },
203
+ Compound: (args) => args,
204
+ };
205
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2Nhbm5vbi9ib2R5L3NyYy9saWIvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFnQyxNQUFNLGVBQWUsQ0FBQztBQW9CN0QsT0FBTyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFpQixNQUFNLE9BQU8sQ0FBQztBQUdsRSxTQUFTLFVBQVUsQ0FBbUIsR0FBTTtJQUMzQyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFrQixDQUFDO0FBQ3RFLENBQUM7QUFFRCxTQUFTLE9BQU8sQ0FBQyxHQUF5QixFQUFFLEtBQWM7SUFDekQsTUFBTSxNQUFNLEdBQUcsS0FBSyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssRUFBRSxDQUFDO0lBQ3RELElBQUksT0FBTyxHQUFHLEtBQUssVUFBVTtRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQzNDLE9BQU8sR0FBRyxJQUFJLEdBQUcsQ0FBQyxhQUFhLElBQUksR0FBRyxHQUFHLENBQUMsYUFBYSxDQUFDLElBQUksR0FBRyxNQUFNLEVBQUUsQ0FBQztBQUN6RSxDQUFDO0FBRUQsTUFBTSxDQUFDLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztBQUN0QixNQUFNLENBQUMsR0FBRyxJQUFJLFVBQVUsRUFBRSxDQUFDO0FBRTNCLFNBQVMsb0JBQW9CLENBQUMsUUFBOEI7SUFDM0QsT0FBTyxDQUFDLENBQU8sRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFhLENBQUMsQ0FBQztBQUN4RixD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QUUsQ0FBQyxJQUFJO0lBQzVDLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsb0JBQW9CLElBQW1DLEVBQUUsRUFBRSxFQUFFLENBQUM7UUFDakgsUUFBUSxJQUFJLFFBQVEsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDO1FBQ3JDLEtBQUs7UUFDTCxPQUFPLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUM7UUFDbkMsSUFBSSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDO1FBQzdCLG9CQUFvQjtLQUNwQjtJQUNELFFBQVEsRUFBRSxDQUFDLElBQWUsRUFBRSxFQUFFLENBQUMsRUFBRTtJQUNqQyxNQUFNLEVBQUUsQ0FBQyxPQUFtQixDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7UUFDbEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO1FBQy9FLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsQixDQUFDO0lBQ0QsUUFBUSxFQUFFLENBQUMsSUFBZSxFQUFFLEVBQUUsQ0FBQyxJQUFJO0NBQ25DLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0eXBlIEVsZW1lbnRSZWYsIHR5cGUgU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgdHlwZSB7XG5cdEF0b21pY05hbWUsXG5cdEJvZHlQcm9wcyxcblx0Q2Fubm9uV29ya2VyQVBJLFxuXHRDb252ZXhQb2x5aGVkcm9uQXJncyxcblx0Q3lsaW5kZXJBcmdzLFxuXHRIZWlnaHRmaWVsZEFyZ3MsXG5cdFByb3BWYWx1ZSxcblx0UXVhZCxcblx0U2V0T3BOYW1lLFxuXHRTcGhlcmVBcmdzLFxuXHRTdWJzY3JpcHRpb25OYW1lLFxuXHRTdWJzY3JpcHRpb25UYXJnZXQsXG5cdFN1YnNjcmlwdGlvbnMsXG5cdFRyaW1lc2hBcmdzLFxuXHRUcmlwbGV0LFxuXHRWZWN0b3JOYW1lLFxufSBmcm9tICdAcG1uZHJzL2Nhbm5vbi13b3JrZXItYXBpJztcbmltcG9ydCB0eXBlIHsgTmd0Y0Nhbm5vbkV2ZW50cywgTmd0Y1BoeXNpY3NBcGkgfSBmcm9tICdhbmd1bGFyLXRocmVlLWNhbm5vbic7XG5pbXBvcnQgeyBFdWxlciwgUXVhdGVybmlvbiwgVmVjdG9yMywgdHlwZSBPYmplY3QzRCB9IGZyb20gJ3RocmVlJztcbmltcG9ydCB0eXBlIHsgTmd0Y1dvcmtlckFwaSB9IGZyb20gJy4vdHlwZXMnO1xuXG5mdW5jdGlvbiBjYXBpdGFsaXplPFQgZXh0ZW5kcyBzdHJpbmc+KHN0cjogVCk6IENhcGl0YWxpemU8VD4ge1xuXHRyZXR1cm4gKHN0ci5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0ci5zbGljZSgxKSkgYXMgQ2FwaXRhbGl6ZTxUPjtcbn1cblxuZnVuY3Rpb24gZ2V0VVVJRChyZWY6IEVsZW1lbnRSZWY8T2JqZWN0M0Q+LCBpbmRleD86IG51bWJlcik6IHN0cmluZyB8IG51bGwge1xuXHRjb25zdCBzdWZmaXggPSBpbmRleCA9PT0gdW5kZWZpbmVkID8gJycgOiBgLyR7aW5kZXh9YDtcblx0aWYgKHR5cGVvZiByZWYgPT09ICdmdW5jdGlvbicpIHJldHVybiBudWxsO1xuXHRyZXR1cm4gcmVmICYmIHJlZi5uYXRpdmVFbGVtZW50ICYmIGAke3JlZi5uYXRpdmVFbGVtZW50LnV1aWR9JHtzdWZmaXh9YDtcbn1cblxuY29uc3QgZSA9IG5ldyBFdWxlcigpO1xuY29uc3QgcSA9IG5ldyBRdWF0ZXJuaW9uKCk7XG5cbmZ1bmN0aW9uIHF1YXRlcm5pb25Ub1JvdGF0aW9uKGNhbGxiYWNrOiAodjogVHJpcGxldCkgPT4gdm9pZCkge1xuXHRyZXR1cm4gKHY6IFF1YWQpID0+IGNhbGxiYWNrKGUuc2V0RnJvbVF1YXRlcm5pb24ocS5mcm9tQXJyYXkodikpLnRvQXJyYXkoKSBhcyBUcmlwbGV0KTtcbn1cblxubGV0IGluY3JlbWVudGluZ0lkID0gMDtcbmZ1bmN0aW9uIGNyZWF0ZVN1YnNjcmliZTxUIGV4dGVuZHMgU3Vic2NyaXB0aW9uTmFtZT4oXG5cdHJlZjogRWxlbWVudFJlZjxPYmplY3QzRD4sXG5cdHdvcmtlcjogQ2Fubm9uV29ya2VyQVBJLFxuXHRzdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb25zLFxuXHR0eXBlOiBULFxuXHRpbmRleD86IG51bWJlcixcblx0dGFyZ2V0OiBTdWJzY3JpcHRpb25UYXJnZXQgPSAnYm9kaWVzJyxcbikge1xuXHRyZXR1cm4gKGNhbGxiYWNrOiAodmFsdWU6IFByb3BWYWx1ZTxUPikgPT4gdm9pZCkgPT4ge1xuXHRcdGNvbnN0IGlkID0gaW5jcmVtZW50aW5nSWQrKztcblx0XHRzdWJzY3JpcHRpb25zW2lkXSA9IHsgW3R5cGVdOiBjYWxsYmFjayB9O1xuXHRcdGNvbnN0IHV1aWQgPSBnZXRVVUlEKHJlZiwgaW5kZXgpO1xuXHRcdHV1aWQgJiYgd29ya2VyLnN1YnNjcmliZSh7IHByb3BzOiB7IGlkLCB0YXJnZXQsIHR5cGUgfSwgdXVpZCB9KTtcblx0XHRyZXR1cm4gKCkgPT4ge1xuXHRcdFx0ZGVsZXRlIHN1YnNjcmlwdGlvbnNbaWRdO1xuXHRcdFx0d29ya2VyLnVuc3Vic2NyaWJlKHsgcHJvcHM6IGlkIH0pO1xuXHRcdH07XG5cdH07XG59XG5cbmZ1bmN0aW9uIG1ha2VUcmlwbGV0KHY6IFZlY3RvcjMgfCBUcmlwbGV0KTogVHJpcGxldCB7XG5cdHJldHVybiB2IGluc3RhbmNlb2YgVmVjdG9yMyA/IFt2LngsIHYueSwgdi56XSA6IHY7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmVwYXJlKG9iamVjdDogT2JqZWN0M0QsIHsgcG9zaXRpb24gPSBbMCwgMCwgMF0sIHJvdGF0aW9uID0gWzAsIDAsIDBdLCB1c2VyRGF0YSA9IHt9IH06IEJvZHlQcm9wcykge1xuXHRvYmplY3QudXNlckRhdGEgPSB1c2VyRGF0YTtcblx0b2JqZWN0LnBvc2l0aW9uLnNldCguLi5wb3NpdGlvbik7XG5cdG9iamVjdC5yb3RhdGlvbi5zZXQoLi4ucm90YXRpb24pO1xuXHRvYmplY3QudXBkYXRlTWF0cml4KCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXR1cENvbGxpc2lvbihcblx0ZXZlbnRzOiBOZ3RjQ2Fubm9uRXZlbnRzLFxuXHR7IG9uQ29sbGlkZSwgb25Db2xsaWRlQmVnaW4sIG9uQ29sbGlkZUVuZCB9OiBQYXJ0aWFsPEJvZHlQcm9wcz4sXG5cdHV1aWQ6IHN0cmluZyxcbikge1xuXHRldmVudHNbdXVpZF0gPSB7XG5cdFx0Y29sbGlkZTogb25Db2xsaWRlLFxuXHRcdGNvbGxpZGVCZWdpbjogb25Db2xsaWRlQmVnaW4sXG5cdFx0Y29sbGlkZUVuZDogb25Db2xsaWRlRW5kLFxuXHR9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWFrZUFwaShcblx0d29ya2VyOiBTaWduYWw8Q2Fubm9uV29ya2VyQVBJPixcblx0Ym9keVJlZjogRWxlbWVudFJlZjxPYmplY3QzRD4sXG5cdHsgc3Vic2NyaXB0aW9ucywgYm9kaWVzLCBzY2FsZU92ZXJyaWRlcyB9OiBOZ3RjUGh5c2ljc0FwaSxcbikge1xuXHRjb25zdCBtYWtlQXRvbWljID0gPFQgZXh0ZW5kcyBBdG9taWNOYW1lPih0eXBlOiBULCBpbmRleD86IG51bWJlcikgPT4ge1xuXHRcdGNvbnN0IG9wOiBTZXRPcE5hbWU8VD4gPSBgc2V0JHtjYXBpdGFsaXplKHR5cGUpfWA7XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0c2V0OiAodmFsdWU6IFByb3BWYWx1ZTxUPikgPT4ge1xuXHRcdFx0XHRjb25zdCB1dWlkID0gZ2V0VVVJRChib2R5UmVmLCBpbmRleCk7XG5cdFx0XHRcdHV1aWQgJiZcblx0XHRcdFx0XHR3b3JrZXIoKVtvcF0oe1xuXHRcdFx0XHRcdFx0cHJvcHM6IHZhbHVlLFxuXHRcdFx0XHRcdFx0dXVpZCxcblx0XHRcdFx0XHR9IGFzIG5ldmVyKTtcblx0XHRcdH0sXG5cdFx0XHRzdWJzY3JpYmU6IGNyZWF0ZVN1YnNjcmliZShib2R5UmVmLCB3b3JrZXIoKSwgc3Vic2NyaXB0aW9ucywgdHlwZSwgaW5kZXgpLFxuXHRcdH07XG5cdH07XG5cblx0Y29uc3QgbWFrZVF1YXRlcm5pb24gPSAoaW5kZXg/OiBudW1iZXIpID0+IHtcblx0XHRjb25zdCB0eXBlID0gJ3F1YXRlcm5pb24nO1xuXHRcdHJldHVybiB7XG5cdFx0XHRjb3B5OiAoeyB3LCB4LCB5LCB6IH06IFF1YXRlcm5pb24pID0+IHtcblx0XHRcdFx0Y29uc3QgdXVpZCA9IGdldFVVSUQoYm9keVJlZiwgaW5kZXgpO1xuXHRcdFx0XHR1dWlkICYmIGJvZGllc1t1dWlkXSAhPSBudWxsICYmIHdvcmtlcigpLnNldFF1YXRlcm5pb24oeyBwcm9wczogW3gsIHksIHosIHddLCB1dWlkIH0pO1xuXHRcdFx0fSxcblx0XHRcdHNldDogKHg6IG51bWJlciwgeTogbnVtYmVyLCB6OiBudW1iZXIsIHc6IG51bWJlcikgPT4ge1xuXHRcdFx0XHRjb25zdCB1dWlkID0gZ2V0VVVJRChib2R5UmVmLCBpbmRleCk7XG5cdFx0XHRcdHV1aWQgJiYgYm9kaWVzW3V1aWRdICE9IG51bGwgJiYgd29ya2VyKCkuc2V0UXVhdGVybmlvbih7IHByb3BzOiBbeCwgeSwgeiwgd10sIHV1aWQgfSk7XG5cdFx0XHR9LFxuXHRcdFx0c3Vic2NyaWJlOiBjcmVhdGVTdWJzY3JpYmUoYm9keVJlZiwgd29ya2VyKCksIHN1YnNjcmlwdGlvbnMsIHR5cGUsIGluZGV4KSxcblx0XHR9O1xuXHR9O1xuXG5cdGNvbnN0IG1ha2VSb3RhdGlvbiA9IChpbmRleD86IG51bWJlcikgPT4ge1xuXHRcdHJldHVybiB7XG5cdFx0XHRjb3B5OiAoeyB4LCB5LCB6IH06IFZlY3RvcjMgfCBFdWxlcikgPT4ge1xuXHRcdFx0XHRjb25zdCB1dWlkID0gZ2V0VVVJRChib2R5UmVmLCBpbmRleCk7XG5cdFx0XHRcdHV1aWQgJiYgYm9kaWVzW3V1aWRdICE9IG51bGwgJiYgd29ya2VyKCkuc2V0Um90YXRpb24oeyBwcm9wczogW3gsIHksIHpdLCB1dWlkIH0pO1xuXHRcdFx0fSxcblx0XHRcdHNldDogKHg6IG51bWJlciwgeTogbnVtYmVyLCB6OiBudW1iZXIpID0+IHtcblx0XHRcdFx0Y29uc3QgdXVpZCA9IGdldFVVSUQoYm9keVJlZiwgaW5kZXgpO1xuXHRcdFx0XHR1dWlkICYmIGJvZGllc1t1dWlkXSAhPSBudWxsICYmIHdvcmtlcigpLnNldFJvdGF0aW9uKHsgcHJvcHM6IFt4LCB5LCB6XSwgdXVpZCB9KTtcblx0XHRcdH0sXG5cdFx0XHRzdWJzY3JpYmU6IChjYWxsYmFjazogKHZhbHVlOiBUcmlwbGV0KSA9PiB2b2lkKSA9PiB7XG5cdFx0XHRcdGNvbnN0IGlkID0gaW5jcmVtZW50aW5nSWQrKztcblx0XHRcdFx0Y29uc3QgdGFyZ2V0ID0gJ2JvZGllcyc7XG5cdFx0XHRcdGNvbnN0IHR5cGUgPSAncXVhdGVybmlvbic7XG5cdFx0XHRcdGNvbnN0IHV1aWQgPSBnZXRVVUlEKGJvZHlSZWYsIGluZGV4KTtcblxuXHRcdFx0XHRzdWJzY3JpcHRpb25zW2lkXSA9IHsgW3R5cGVdOiBxdWF0ZXJuaW9uVG9Sb3RhdGlvbihjYWxsYmFjaykgfTtcblx0XHRcdFx0dXVpZCAmJiBib2RpZXNbdXVpZF0gIT0gbnVsbCAmJiB3b3JrZXIoKS5zdWJzY3JpYmUoeyBwcm9wczogeyBpZCwgdGFyZ2V0LCB0eXBlIH0sIHV1aWQgfSk7XG5cdFx0XHRcdHJldHVybiAoKSA9PiB7XG5cdFx0XHRcdFx0ZGVsZXRlIHN1YnNjcmlwdGlvbnNbaWRdO1xuXHRcdFx0XHRcdHdvcmtlcigpLnVuc3Vic2NyaWJlKHsgcHJvcHM6IGlkIH0pO1xuXHRcdFx0XHR9O1xuXHRcdFx0fSxcblx0XHR9O1xuXHR9O1xuXG5cdGNvbnN0IG1ha2VWZWMgPSAodHlwZTogVmVjdG9yTmFtZSwgaW5kZXg/OiBudW1iZXIpID0+IHtcblx0XHRjb25zdCBvcDogU2V0T3BOYW1lPFZlY3Rvck5hbWU+ID0gYHNldCR7Y2FwaXRhbGl6ZSh0eXBlKX1gO1xuXHRcdHJldHVybiB7XG5cdFx0XHRjb3B5OiAoeyB4LCB5LCB6IH06IFZlY3RvcjMgfCBFdWxlcikgPT4ge1xuXHRcdFx0XHRjb25zdCB1dWlkID0gZ2V0VVVJRChib2R5UmVmLCBpbmRleCk7XG5cdFx0XHRcdHV1aWQgJiYgYm9kaWVzW3V1aWRdICE9IG51bGwgJiYgd29ya2VyKClbb3BdKHsgcHJvcHM6IFt4LCB5LCB6XSwgdXVpZCB9KTtcblx0XHRcdH0sXG5cdFx0XHRzZXQ6ICh4OiBudW1iZXIsIHk6IG51bWJlciwgejogbnVtYmVyKSA9PiB7XG5cdFx0XHRcdGNvbnN0IHV1aWQgPSBnZXRVVUlEKGJvZHlSZWYsIGluZGV4KTtcblx0XHRcdFx0dXVpZCAmJiBib2RpZXNbdXVpZF0gIT0gbnVsbCAmJiB3b3JrZXIoKVtvcF0oeyBwcm9wczogW3gsIHksIHpdLCB1dWlkIH0pO1xuXHRcdFx0fSxcblx0XHRcdHN1YnNjcmliZTogY3JlYXRlU3Vic2NyaWJlKGJvZHlSZWYsIHdvcmtlcigpLCBzdWJzY3JpcHRpb25zLCB0eXBlLCBpbmRleCksXG5cdFx0fTtcblx0fTtcblxuXHRjb25zdCBtYWtlUmVtb3ZlID0gKGluZGV4PzogbnVtYmVyKSA9PiB7XG5cdFx0Y29uc3QgdXVpZCA9IGdldFVVSUQoYm9keVJlZiwgaW5kZXgpO1xuXHRcdHJldHVybiAoKSA9PiB7XG5cdFx0XHRpZiAodXVpZCkgd29ya2VyKCkucmVtb3ZlQm9kaWVzKHsgdXVpZDogW3V1aWRdIH0pO1xuXHRcdH07XG5cdH07XG5cblx0ZnVuY3Rpb24gbWFrZUFwaShpbmRleD86IG51bWJlcik6IE5ndGNXb3JrZXJBcGkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRhbGxvd1NsZWVwOiBtYWtlQXRvbWljKCdhbGxvd1NsZWVwJywgaW5kZXgpLFxuXHRcdFx0YW5ndWxhckRhbXBpbmc6IG1ha2VBdG9taWMoJ2FuZ3VsYXJEYW1waW5nJywgaW5kZXgpLFxuXHRcdFx0YW5ndWxhckZhY3RvcjogbWFrZVZlYygnYW5ndWxhckZhY3RvcicsIGluZGV4KSxcblx0XHRcdGFuZ3VsYXJWZWxvY2l0eTogbWFrZVZlYygnYW5ndWxhclZlbG9jaXR5JywgaW5kZXgpLFxuXHRcdFx0YXBwbHlGb3JjZShmb3JjZTogVHJpcGxldCwgd29ybGRQb2ludDogVHJpcGxldCkge1xuXHRcdFx0XHRjb25zdCB1dWlkID0gZ2V0VVVJRChib2R5UmVmLCBpbmRleCk7XG5cdFx0XHRcdHV1aWQgJiYgYm9kaWVzW3V1aWRdICE9IG51bGwgJiYgd29ya2VyKCkuYXBwbHlGb3JjZSh7IHByb3BzOiBbZm9yY2UsIHdvcmxkUG9pbnRdLCB1dWlkIH0pO1xuXHRcdFx0fSxcblx0XHRcdGFwcGx5SW1wdWxzZShpbXB1bHNlOiBUcmlwbGV0LCB3b3JsZFBvaW50OiBUcmlwbGV0KSB7XG5cdFx0XHRcdGNvbnN0IHV1aWQgPSBnZXRVVUlEKGJvZHlSZWYsIGluZGV4KTtcblx0XHRcdFx0dXVpZCAmJiBib2RpZXNbdXVpZF0gIT0gbnVsbCAmJiB3b3JrZXIoKS5hcHBseUltcHVsc2UoeyBwcm9wczogW2ltcHVsc2UsIHdvcmxkUG9pbnRdLCB1dWlkIH0pO1xuXHRcdFx0fSxcblx0XHRcdGFwcGx5TG9jYWxGb3JjZShmb3JjZTogVHJpcGxldCwgbG9jYWxQb2ludDogVHJpcGxldCkge1xuXHRcdFx0XHRjb25zdCB1dWlkID0gZ2V0VVVJRChib2R5UmVmLCBpbmRleCk7XG5cdFx0XHRcdHV1aWQgJiYgYm9kaWVzW3V1aWRdICE9IG51bGwgJiYgd29ya2VyKCkuYXBwbHlMb2NhbEZvcmNlKHsgcHJvcHM6IFtmb3JjZSwgbG9jYWxQb2ludF0sIHV1aWQgfSk7XG5cdFx0XHR9LFxuXHRcdFx0YXBwbHlMb2NhbEltcHVsc2UoaW1wdWxzZTogVHJpcGxldCwgbG9jYWxQb2ludDogVHJpcGxldCkge1xuXHRcdFx0XHRjb25zdCB1dWlkID0gZ2V0VVVJRChib2R5UmVmLCBpbmRleCk7XG5cdFx0XHRcdHV1aWQgJiYgYm9kaWVzW3V1aWRdICE9IG51bGwgJiYgd29ya2VyKCkuYXBwbHlMb2NhbEltcHVsc2UoeyBwcm9wczogW2ltcHVsc2UsIGxvY2FsUG9pbnRdLCB1dWlkIH0pO1xuXHRcdFx0fSxcblx0XHRcdGFwcGx5VG9ycXVlKHRvcnF1ZTogVHJpcGxldCkge1xuXHRcdFx0XHRjb25zdCB1dWlkID0gZ2V0VVVJRChib2R5UmVmLCBpbmRleCk7XG5cdFx0XHRcdHV1aWQgJiYgYm9kaWVzW3V1aWRdICE9IG51bGwgJiYgd29ya2VyKCkuYXBwbHlUb3JxdWUoeyBwcm9wczogW3RvcnF1ZV0sIHV1aWQgfSk7XG5cdFx0XHR9LFxuXHRcdFx0Y29sbGlzaW9uRmlsdGVyR3JvdXA6IG1ha2VBdG9taWMoJ2NvbGxpc2lvbkZpbHRlckdyb3VwJywgaW5kZXgpLFxuXHRcdFx0Y29sbGlzaW9uRmlsdGVyTWFzazogbWFrZUF0b21pYygnY29sbGlzaW9uRmlsdGVyTWFzaycsIGluZGV4KSxcblx0XHRcdGNvbGxpc2lvblJlc3BvbnNlOiBtYWtlQXRvbWljKCdjb2xsaXNpb25SZXNwb25zZScsIGluZGV4KSxcblx0XHRcdGZpeGVkUm90YXRpb246IG1ha2VBdG9taWMoJ2ZpeGVkUm90YXRpb24nLCBpbmRleCksXG5cdFx0XHRpc1RyaWdnZXI6IG1ha2VBdG9taWMoJ2lzVHJpZ2dlcicsIGluZGV4KSxcblx0XHRcdGxpbmVhckRhbXBpbmc6IG1ha2VBdG9taWMoJ2xpbmVhckRhbXBpbmcnLCBpbmRleCksXG5cdFx0XHRsaW5lYXJGYWN0b3I6IG1ha2VWZWMoJ2xpbmVhckZhY3RvcicsIGluZGV4KSxcblx0XHRcdG1hc3M6IG1ha2VBdG9taWMoJ21hc3MnLCBpbmRleCksXG5cdFx0XHRtYXRlcmlhbDogbWFrZUF0b21pYygnbWF0ZXJpYWwnLCBpbmRleCksXG5cdFx0XHRwb3NpdGlvbjogbWFrZVZlYygncG9zaXRpb24nLCBpbmRleCksXG5cdFx0XHRxdWF0ZXJuaW9uOiBtYWtlUXVhdGVybmlvbihpbmRleCksXG5cdFx0XHRyb3RhdGlvbjogbWFrZVJvdGF0aW9uKGluZGV4KSxcblx0XHRcdHNjYWxlT3ZlcnJpZGUoc2NhbGUpIHtcblx0XHRcdFx0Y29uc3QgdXVpZCA9IGdldFVVSUQoYm9keVJlZiwgaW5kZXgpO1xuXHRcdFx0XHRpZiAodXVpZCkgc2NhbGVPdmVycmlkZXNbdXVpZF0gPSBuZXcgVmVjdG9yMyguLi5zY2FsZSk7XG5cdFx0XHR9LFxuXHRcdFx0c2xlZXAoKSB7XG5cdFx0XHRcdGNvbnN0IHV1aWQgPSBnZXRVVUlEKGJvZHlSZWYsIGluZGV4KTtcblx0XHRcdFx0dXVpZCAmJiBib2RpZXNbdXVpZF0gIT0gbnVsbCAmJiB3b3JrZXIoKS5zbGVlcCh7IHV1aWQgfSk7XG5cdFx0XHR9LFxuXHRcdFx0c2xlZXBTcGVlZExpbWl0OiBtYWtlQXRvbWljKCdzbGVlcFNwZWVkTGltaXQnLCBpbmRleCksXG5cdFx0XHRzbGVlcFRpbWVMaW1pdDogbWFrZUF0b21pYygnc2xlZXBUaW1lTGltaXQnLCBpbmRleCksXG5cdFx0XHR1c2VyRGF0YTogbWFrZUF0b21pYygndXNlckRhdGEnLCBpbmRleCksXG5cdFx0XHR2ZWxvY2l0eTogbWFrZVZlYygndmVsb2NpdHknLCBpbmRleCksXG5cdFx0XHRyZW1vdmU6IG1ha2VSZW1vdmUoaW5kZXgpLFxuXHRcdFx0d2FrZVVwKCkge1xuXHRcdFx0XHRjb25zdCB1dWlkID0gZ2V0VVVJRChib2R5UmVmLCBpbmRleCk7XG5cdFx0XHRcdHV1aWQgJiYgYm9kaWVzW3V1aWRdICE9IG51bGwgJiYgd29ya2VyKCkud2FrZVVwKHsgdXVpZCB9KTtcblx0XHRcdH0sXG5cdFx0fTtcblx0fVxuXG5cdGNvbnN0IGNhY2hlOiB7IFtpbmRleDogbnVtYmVyXTogTmd0Y1dvcmtlckFwaSB9ID0ge307XG5cdHJldHVybiB7XG5cdFx0Li4ubWFrZUFwaSh1bmRlZmluZWQpLFxuXHRcdGF0OiAoaW5kZXg6IG51bWJlcikgPT4gY2FjaGVbaW5kZXhdIHx8IChjYWNoZVtpbmRleF0gPSBtYWtlQXBpKGluZGV4KSksXG5cdH07XG59XG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0VHJhbnNmb3JtQXJncyA9IHtcblx0UGxhbmU6IChhcmdzOiB1bmtub3duW10pID0+IFtdLFxuXHRCb3g6IChhcmdzOiBUcmlwbGV0ID0gWzEsIDEsIDFdKSA9PiBhcmdzLFxuXHRUcmltZXNoOiAoYXJnczogVHJpbWVzaEFyZ3MpID0+IGFyZ3MsXG5cdEN5bGluZGVyOiAoYXJnczogQ3lsaW5kZXJBcmdzID0gW10pID0+IFtdLFxuXHRIZWlnaHRmaWVsZDogKGFyZ3M6IEhlaWdodGZpZWxkQXJncykgPT4gYXJncyxcblx0Q29udmV4UG9seWhlZHJvbjogKFt2ZXJ0aWNlcywgZmFjZXMsIG5vcm1hbHMsIGF4ZXMsIGJvdW5kaW5nU3BoZXJlUmFkaXVzXTogQ29udmV4UG9seWhlZHJvbkFyZ3M8VHJpcGxldD4gPSBbXSkgPT4gW1xuXHRcdHZlcnRpY2VzICYmIHZlcnRpY2VzLm1hcChtYWtlVHJpcGxldCksXG5cdFx0ZmFjZXMsXG5cdFx0bm9ybWFscyAmJiBub3JtYWxzLm1hcChtYWtlVHJpcGxldCksXG5cdFx0YXhlcyAmJiBheGVzLm1hcChtYWtlVHJpcGxldCksXG5cdFx0Ym91bmRpbmdTcGhlcmVSYWRpdXMsXG5cdF0sXG5cdFBhcnRpY2xlOiAoYXJnczogdW5rbm93bltdKSA9PiBbXSxcblx0U3BoZXJlOiAoYXJnczogU3BoZXJlQXJncyA9IFsxXSkgPT4ge1xuXHRcdGlmICghQXJyYXkuaXNBcnJheShhcmdzKSkgdGhyb3cgbmV3IEVycm9yKCdTcGhlcmUgYm9keSBhcmdzIG11c3QgYmUgYW4gYXJyYXknKTtcblx0XHRyZXR1cm4gW2FyZ3NbMF1dO1xuXHR9LFxuXHRDb21wb3VuZDogKGFyZ3M6IHVua25vd25bXSkgPT4gYXJncyxcbn07XG4iXX0=
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './index';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci10aHJlZS1jYW5ub24tY29uc3RyYWludC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvY2Fubm9uL2NvbnN0cmFpbnQvc3JjL2FuZ3VsYXItdGhyZWUtY2Fubm9uLWNvbnN0cmFpbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLFNBQVMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9pbmRleCc7XG4iXX0=