angular-three-cannon 2.0.0-beta.2 → 2.0.0-beta.20

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 (52) hide show
  1. package/debug/index.d.ts +1 -1
  2. package/debug/lib/debug.d.ts +43 -0
  3. package/esm2022/debug/index.mjs +2 -2
  4. package/esm2022/debug/lib/debug.mjs +97 -0
  5. package/esm2022/index.mjs +2 -2
  6. package/esm2022/lib/physics.mjs +293 -0
  7. package/esm2022/services/index.mjs +7 -7
  8. package/esm2022/services/lib/body.mjs +293 -0
  9. package/esm2022/services/lib/constraints.mjs +59 -0
  10. package/esm2022/services/lib/contact-material.mjs +20 -0
  11. package/esm2022/services/lib/ray.mjs +30 -0
  12. package/esm2022/services/lib/raycast-vehicle.mjs +68 -0
  13. package/esm2022/services/lib/spring.mjs +31 -0
  14. package/fesm2022/angular-three-cannon-debug.mjs +35 -36
  15. package/fesm2022/angular-three-cannon-debug.mjs.map +1 -1
  16. package/fesm2022/angular-three-cannon-services.mjs +106 -110
  17. package/fesm2022/angular-three-cannon-services.mjs.map +1 -1
  18. package/fesm2022/angular-three-cannon.mjs +210 -213
  19. package/fesm2022/angular-three-cannon.mjs.map +1 -1
  20. package/index.d.ts +1 -1
  21. package/lib/physics.d.ts +79 -0
  22. package/package.json +4 -8
  23. package/services/index.d.ts +6 -6
  24. package/services/{body.d.ts → lib/body.d.ts} +3 -3
  25. package/services/{constraint.d.ts → lib/constraints.d.ts} +12 -12
  26. package/services/{contact-material.d.ts → lib/contact-material.d.ts} +3 -3
  27. package/services/{ray.d.ts → lib/ray.d.ts} +5 -5
  28. package/services/{raycast-vehicle.d.ts → lib/raycast-vehicle.d.ts} +11 -11
  29. package/services/{spring.d.ts → lib/spring.d.ts} +8 -8
  30. package/debug/debug.d.ts +0 -26
  31. package/esm2022/debug/debug.mjs +0 -99
  32. package/esm2022/physics.mjs +0 -297
  33. package/esm2022/services/body.mjs +0 -289
  34. package/esm2022/services/constraint.mjs +0 -59
  35. package/esm2022/services/contact-material.mjs +0 -20
  36. package/esm2022/services/ray.mjs +0 -30
  37. package/esm2022/services/raycast-vehicle.mjs +0 -72
  38. package/esm2022/services/spring.mjs +0 -34
  39. package/physics.d.ts +0 -97
  40. package/plugin/README.md +0 -11
  41. package/plugin/generators.json +0 -19
  42. package/plugin/package.json +0 -9
  43. package/plugin/src/generators/init/compat.d.ts +0 -2
  44. package/plugin/src/generators/init/compat.js +0 -6
  45. package/plugin/src/generators/init/compat.js.map +0 -1
  46. package/plugin/src/generators/init/init.d.ts +0 -5
  47. package/plugin/src/generators/init/init.js +0 -24
  48. package/plugin/src/generators/init/init.js.map +0 -1
  49. package/plugin/src/generators/init/schema.json +0 -7
  50. package/plugin/src/index.d.ts +0 -1
  51. package/plugin/src/index.js +0 -6
  52. package/plugin/src/index.js.map +0 -1
package/debug/index.d.ts CHANGED
@@ -1 +1 @@
1
- export * from './debug';
1
+ export * from './lib/debug';
@@ -0,0 +1,43 @@
1
+ import { type OnInit } from '@angular/core';
2
+ import { type BodyProps, type BodyShapeType } from '@pmndrs/cannon-worker-api';
3
+ import CannonDebugger from 'cannon-es-debugger';
4
+ import * as THREE from 'three';
5
+ import * as i0 from "@angular/core";
6
+ export declare const injectNgtcDebugApi: {
7
+ (): {
8
+ add: (uuid: string, props: BodyProps, type: BodyShapeType) => void;
9
+ remove: (id: string) => void;
10
+ };
11
+ (injectOptions: import("@angular/core").InjectOptions & {
12
+ optional?: false | undefined;
13
+ }): {
14
+ add: (uuid: string, props: BodyProps, type: BodyShapeType) => void;
15
+ remove: (id: string) => void;
16
+ };
17
+ (injectOptions: import("@angular/core").InjectOptions): {
18
+ add: (uuid: string, props: BodyProps, type: BodyShapeType) => void;
19
+ remove: (id: string) => void;
20
+ } | 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;
30
+ private bodies;
31
+ private bodyMap;
32
+ private physicsApi;
33
+ scene: THREE.Scene;
34
+ private cannonDebugger;
35
+ api: {
36
+ add: (uuid: string, props: BodyProps, type: BodyShapeType) => void;
37
+ remove: (id: string) => void;
38
+ };
39
+ constructor();
40
+ ngOnInit(): void;
41
+ 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
+ }
@@ -1,2 +1,2 @@
1
- export * from './debug';
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2Nhbm5vbi9kZWJ1Zy9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxTQUFTLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2RlYnVnJztcbiJdfQ==
1
+ export * from './lib/debug';
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2Nhbm5vbi9kZWJ1Zy9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxhQUFhLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2xpYi9kZWJ1Zyc7XG4iXX0=
@@ -0,0 +1,97 @@
1
+ import { Component, CUSTOM_ELEMENTS_SCHEMA, forwardRef, Input } from '@angular/core';
2
+ import { propsToBody } from '@pmndrs/cannon-worker-api';
3
+ import { createInjectionToken, injectBeforeRender, NgtArgs } from 'angular-three';
4
+ import { injectNgtcPhysicsApi } from 'angular-three-cannon';
5
+ import CannonDebugger from 'cannon-es-debugger';
6
+ import * as THREE from 'three';
7
+ import * as i0 from "@angular/core";
8
+ const q = new THREE.Quaternion();
9
+ const s = new THREE.Vector3(1, 1, 1);
10
+ const v = new THREE.Vector3();
11
+ const m = new THREE.Matrix4();
12
+ function getMatrix(o) {
13
+ if (o instanceof THREE.InstancedMesh) {
14
+ o.getMatrixAt(parseInt(o.uuid.split('/')[1]), m);
15
+ return m;
16
+ }
17
+ return o.matrix;
18
+ }
19
+ export const [injectNgtcDebugApi, provideNgtcDebugApi] = createInjectionToken((debug) => debug.api, {
20
+ isRoot: false,
21
+ deps: [forwardRef(() => NgtcDebug)],
22
+ });
23
+ export class NgtcDebug {
24
+ constructor() {
25
+ this.color = 'black';
26
+ this.scale = 1;
27
+ this.impl = CannonDebugger;
28
+ this.disabled = false;
29
+ this.bodies = [];
30
+ this.bodyMap = {};
31
+ this.physicsApi = injectNgtcPhysicsApi();
32
+ this.scene = new THREE.Scene();
33
+ this.api = {
34
+ add: (uuid, props, type) => {
35
+ const body = propsToBody({ uuid, props, type });
36
+ this.bodies.push(body);
37
+ this.bodyMap[uuid] = body;
38
+ },
39
+ remove: (id) => {
40
+ const debugBodyIndex = this.bodies.indexOf(this.bodyMap[id]);
41
+ if (debugBodyIndex > -1)
42
+ this.bodies.splice(debugBodyIndex, 1);
43
+ delete this.bodyMap[id];
44
+ },
45
+ };
46
+ injectBeforeRender(() => {
47
+ if (!this.cannonDebugger)
48
+ return;
49
+ const refs = this.physicsApi.get('refs');
50
+ for (const uuid in this.bodyMap) {
51
+ getMatrix(refs[uuid]).decompose(v, q, s);
52
+ this.bodyMap[uuid].position.copy(v);
53
+ this.bodyMap[uuid].quaternion.copy(q);
54
+ }
55
+ for (const child of this.scene.children) {
56
+ child.visible = !this.disabled;
57
+ }
58
+ if (!this.disabled) {
59
+ this.cannonDebugger.update();
60
+ }
61
+ });
62
+ }
63
+ ngOnInit() {
64
+ this.cannonDebugger = this.impl(this.scene, { bodies: this.bodies }, {
65
+ color: this.color,
66
+ scale: this.scale,
67
+ });
68
+ }
69
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.2", ngImport: i0, type: NgtcDebug, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
70
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.2", type: NgtcDebug, isStandalone: true, selector: "ngtc-debug", inputs: { color: "color", scale: "scale", impl: "impl", disabled: "disabled" }, providers: [provideNgtcDebugApi()], ngImport: i0, template: `
71
+ <ngt-primitive *args="[scene]" />
72
+ <ng-content />
73
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgtArgs, selector: "ng-template[args]", inputs: ["args"] }] }); }
74
+ }
75
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.2", ngImport: i0, type: NgtcDebug, decorators: [{
76
+ type: Component,
77
+ args: [{
78
+ selector: 'ngtc-debug',
79
+ standalone: true,
80
+ template: `
81
+ <ngt-primitive *args="[scene]" />
82
+ <ng-content />
83
+ `,
84
+ providers: [provideNgtcDebugApi()],
85
+ imports: [NgtArgs],
86
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
87
+ }]
88
+ }], ctorParameters: function () { return []; }, propDecorators: { color: [{
89
+ type: Input
90
+ }], scale: [{
91
+ type: Input
92
+ }], impl: [{
93
+ type: Input
94
+ }], disabled: [{
95
+ type: Input
96
+ }] } });
97
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVidWcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2Nhbm5vbi9kZWJ1Zy9zcmMvbGliL2RlYnVnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsc0JBQXNCLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBZSxNQUFNLGVBQWUsQ0FBQztBQUNsRyxPQUFPLEVBQUUsV0FBVyxFQUFzQyxNQUFNLDJCQUEyQixDQUFDO0FBQzVGLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxrQkFBa0IsRUFBRSxPQUFPLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbEYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFNUQsT0FBTyxjQUFjLE1BQU0sb0JBQW9CLENBQUM7QUFDaEQsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7O0FBRS9CLE1BQU0sQ0FBQyxHQUFHLElBQUksS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO0FBQ2pDLE1BQU0sQ0FBQyxHQUFHLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3JDLE1BQU0sQ0FBQyxHQUFHLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO0FBQzlCLE1BQU0sQ0FBQyxHQUFHLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO0FBRTlCLFNBQVMsU0FBUyxDQUFDLENBQWlCO0lBQ25DLElBQUksQ0FBQyxZQUFZLEtBQUssQ0FBQyxhQUFhLEVBQUU7UUFDckMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNqRCxPQUFPLENBQUMsQ0FBQztLQUNUO0lBQ0QsT0FBTyxDQUFDLENBQUMsTUFB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QUMsTUFBTSxFQUFXLEVBQUU7WUFDN0UsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO1lBQ2pCLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztTQUNqQixDQUFDLENBQUM7SUFDSixDQUFDOzhHQXBEVyxTQUFTO2tHQUFULFNBQVMseUlBSlYsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLDBCQUp4Qjs7O0VBR1QsNERBRVMsT0FBTzs7MkZBR0wsU0FBUztrQkFYckIsU0FBUzttQkFBQztvQkFDVixRQUFRLEVBQUUsWUFBWTtvQkFDdEIsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLFFBQVEsRUFBRTs7O0VBR1Q7b0JBQ0QsU0FBUyxFQUFFLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztvQkFDbEMsT0FBTyxFQUFFLENBQUMsT0FBTyxDQUFDO29CQUNsQixPQUFPLEVBQUUsQ0FBQyxzQkFBc0IsQ0FBQztpQkFDakM7MEVBRVMsS0FBSztzQkFBYixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgQ1VTVE9NX0VMRU1FTlRTX1NDSEVNQSwgZm9yd2FyZFJlZiwgSW5wdXQsIHR5cGUgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBwcm9wc1RvQm9keSwgdHlwZSBCb2R5UHJvcHMsIHR5cGUgQm9keVNoYXBlVHlwZSB9IGZyb20gJ0BwbW5kcnMvY2Fubm9uLXdvcmtlci1hcGknO1xuaW1wb3J0IHsgY3JlYXRlSW5qZWN0aW9uVG9rZW4sIGluamVjdEJlZm9yZVJlbmRlciwgTmd0QXJncyB9IGZyb20gJ2FuZ3VsYXItdGhyZWUnO1xuaW1wb3J0IHsgaW5qZWN0Tmd0Y1BoeXNpY3NBcGkgfSBmcm9tICdhbmd1bGFyLXRocmVlLWNhbm5vbic7XG5pbXBvcnQgdHlwZSB7IEJvZHksIFF1YXRlcm5pb24gYXMgQ1F1YXJ0ZXJuaW9uLCBWZWMzLCBXb3JsZCB9IGZyb20gJ2Nhbm5vbi1lcyc7XG5pbXBvcnQgQ2Fubm9uRGVidWdnZXIgZnJvbSAnY2Fubm9uLWVzLWRlYnVnZ2VyJztcbmltcG9ydCAqIGFzIFRIUkVFIGZyb20gJ3RocmVlJztcblxuY29uc3QgcSA9IG5ldyBUSFJFRS5RdWF0ZXJuaW9uKCk7XG5jb25zdCBzID0gbmV3IFRIUkVFLlZlY3RvcjMoMSwgMSwgMSk7XG5jb25zdCB2ID0gbmV3IFRIUkVFLlZlY3RvcjMoKTtcbmNvbnN0IG0gPSBuZXcgVEhSRUUuTWF0cml4NCgpO1xuXG5mdW5jdGlvbiBnZXRNYXRyaXgobzogVEhSRUUuT2JqZWN0M0QpOiBUSFJFRS5NYXRyaXg0IHtcblx0aWYgKG8gaW5zdGFuY2VvZiBUSFJFRS5JbnN0YW5jZWRNZXNoKSB7XG5cdFx0by5nZXRNYXRyaXhBdChwYXJzZUludChvLnV1aWQuc3BsaXQoJy8nKVsxXSksIG0pO1xuXHRcdHJldHVybiBtO1xuXHR9XG5cdHJldHVybiBvLm1hdHJpeDtcbn1cblxuZXhwb3J0IGNvbnN0IFtpbmplY3ROZ3RjRGVidWdBcGksIHByb3ZpZGVOZ3RjRGVidWdBcGldID0gY3JlYXRlSW5qZWN0aW9uVG9rZW4oKGRlYnVnOiBOZ3RjRGVidWcpID0+IGRlYnVnLmFwaSwge1xuXHRpc1Jvb3Q6IGZhbHNlLFxuXHRkZXBzOiBbZm9yd2FyZFJlZigoKSA9PiBOZ3RjRGVidWcpXSxcbn0pO1xuXG5AQ29tcG9uZW50KHtcblx0c2VsZWN0b3I6ICduZ3RjLWRlYnVnJyxcblx0c3RhbmRhbG9uZTogdHJ1ZSxcblx0dGVtcGxhdGU6IGBcblx0XHQ8bmd0LXByaW1pdGl2ZSAqYXJncz1cIltzY2VuZV1cIiAvPlxuXHRcdDxuZy1jb250ZW50IC8+XG5cdGAsXG5cdHByb3ZpZGVyczogW3Byb3ZpZGVOZ3RjRGVidWdBcGkoKV0sXG5cdGltcG9ydHM6IFtOZ3RBcmdzXSxcblx0c2NoZW1hczogW0NVU1RPTV9FTEVNRU5UU19TQ0hFTUFdLFxufSlcbmV4cG9ydCBjbGFzcyBOZ3RjRGVidWcgaW1wbGVtZW50cyBPbkluaXQge1xuXHRASW5wdXQoKSBjb2xvciA9ICdibGFjayc7XG5cdEBJbnB1dCgpIHNjYWxlID0gMTtcblx0QElucHV0KCkgaW1wbCA9IENhbm5vbkRlYnVnZ2VyO1xuXHRASW5wdXQoKSBkaXNhYmxlZCA9IGZhbHNlO1xuXG5cdHByaXZhdGUgYm9kaWVzOiBCb2R5W10gPSBbXTtcblx0cHJpdmF0ZSBib2R5TWFwOiBSZWNvcmQ8c3RyaW5nLCBCb2R5PiA9IHt9O1xuXG5cdHByaXZhdGUgcGh5c2ljc0FwaSA9IGluamVjdE5ndGNQaHlzaWNzQXBpKCk7XG5cblx0c2NlbmUgPSBuZXcgVEhSRUUuU2NlbmUoKTtcblx0cHJpdmF0ZSBjYW5ub25EZWJ1Z2dlciE6IFJldHVyblR5cGU8dHlwZW9mIENhbm5vbkRlYnVnZ2VyPjtcblxuXHRhcGkgPSB7XG5cdFx0YWRkOiAodXVpZDogc3RyaW5nLCBwcm9wczogQm9keVByb3BzLCB0eXBlOiBCb2R5U2hhcGVUeXBlKSA9PiB7XG5cdFx0XHRjb25zdCBib2R5ID0gcHJvcHNUb0JvZHkoeyB1dWlkLCBwcm9wcywgdHlwZSB9KTtcblx0XHRcdHRoaXMuYm9kaWVzLnB1c2goYm9keSk7XG5cdFx0XHR0aGlzLmJvZHlNYXBbdXVpZF0gPSBib2R5O1xuXHRcdH0sXG5cdFx0cmVtb3ZlOiAoaWQ6IHN0cmluZykgPT4ge1xuXHRcdFx0Y29uc3QgZGVidWdCb2R5SW5kZXggPSB0aGlzLmJvZGllcy5pbmRleE9mKHRoaXMuYm9keU1hcFtpZF0pO1xuXHRcdFx0aWYgKGRlYnVnQm9keUluZGV4ID4gLTEpIHRoaXMuYm9kaWVzLnNwbGljZShkZWJ1Z0JvZHlJbmRleCwgMSk7XG5cdFx0XHRkZWxldGUgdGhpcy5ib2R5TWFwW2lkXTtcblx0XHR9LFxuXHR9O1xuXG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdGluamVjdEJlZm9yZVJlbmRlcigoKSA9PiB7XG5cdFx0XHRpZiAoIXRoaXMuY2Fubm9uRGVidWdnZXIpIHJldHVybjtcblx0XHRcdGNvbnN0IHJlZnMgPSB0aGlzLnBoeXNpY3NBcGkuZ2V0KCdyZWZzJyk7XG5cdFx0XHRmb3IgKGNvbnN0IHV1aWQgaW4gdGhpcy5ib2R5TWFwKSB7XG5cdFx0XHRcdGdldE1hdHJpeChyZWZzW3V1aWRdKS5kZWNvbXBvc2UodiwgcSwgcyk7XG5cdFx0XHRcdHRoaXMuYm9keU1hcFt1dWlkXS5wb3NpdGlvbi5jb3B5KHYgYXMgdW5rbm93biBhcyBWZWMzKTtcblx0XHRcdFx0dGhpcy5ib2R5TWFwW3V1aWRdLnF1YXRlcm5pb24uY29weShxIGFzIHVua25vd24gYXMgQ1F1YXJ0ZXJuaW9uKTtcblx0XHRcdH1cblxuXHRcdFx0Zm9yIChjb25zdCBjaGlsZCBvZiB0aGlzLnNjZW5lLmNoaWxkcmVuKSB7XG5cdFx0XHRcdGNoaWxkLnZpc2libGUgPSAhdGhpcy5kaXNhYmxlZDtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCF0aGlzLmRpc2FibGVkKSB7XG5cdFx0XHRcdHRoaXMuY2Fubm9uRGVidWdnZXIudXBkYXRlKCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHRuZ09uSW5pdCgpIHtcblx0XHR0aGlzLmNhbm5vbkRlYnVnZ2VyID0gdGhpcy5pbXBsKHRoaXMuc2NlbmUsIHsgYm9kaWVzOiB0aGlzLmJvZGllcyB9IGFzIFdvcmxkLCB7XG5cdFx0XHRjb2xvcjogdGhpcy5jb2xvcixcblx0XHRcdHNjYWxlOiB0aGlzLnNjYWxlLFxuXHRcdH0pO1xuXHR9XG59XG4iXX0=
package/esm2022/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
- export * from './physics';
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJzL2Nhbm5vbi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxXQUFXLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL3BoeXNpY3MnO1xuIl19
1
+ export * from './lib/physics';
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJzL2Nhbm5vbi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxlQUFlLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2xpYi9waHlzaWNzJztcbiJdfQ==
@@ -0,0 +1,293 @@
1
+ import { Component, Injector, Input, NgZone, effect, forwardRef, inject, untracked } from '@angular/core';
2
+ import { CannonWorkerAPI, } from '@pmndrs/cannon-worker-api';
3
+ import { createInjectionToken, injectBeforeRender, injectNgtStore, signalStore } from 'angular-three';
4
+ import * as THREE from 'three';
5
+ import * as i0 from "@angular/core";
6
+ const v = new THREE.Vector3();
7
+ const s = new THREE.Vector3(1, 1, 1);
8
+ const q = new THREE.Quaternion();
9
+ const m = new THREE.Matrix4();
10
+ function apply(index, positions, quaternions, scale = s, object) {
11
+ if (index !== undefined) {
12
+ m.compose(v.fromArray(positions, index * 3), q.fromArray(quaternions, index * 4), scale);
13
+ if (object) {
14
+ object.matrixAutoUpdate = false;
15
+ object.matrix.copy(m);
16
+ }
17
+ return m;
18
+ }
19
+ return m.identity();
20
+ }
21
+ const unique = () => {
22
+ const values = [];
23
+ return (value) => (values.includes(value) ? false : !!values.push(value));
24
+ };
25
+ export const [injectNgtcPhysicsApi, provideNgtcPhysicsApi] = createInjectionToken((physics) => physics.api, { isRoot: false, deps: [forwardRef(() => NgtcPhysics)] });
26
+ export class NgtcPhysics {
27
+ constructor() {
28
+ this.inputs = signalStore({
29
+ allowSleep: false,
30
+ axisIndex: 0,
31
+ broadphase: 'Naive',
32
+ defaultContactMaterial: { contactEquationStiffness: 1e6 },
33
+ frictionGravity: null,
34
+ gravity: [0, -9.81, 0],
35
+ isPaused: false,
36
+ iterations: 5,
37
+ maxSubSteps: 10,
38
+ quatNormalizeFast: false,
39
+ quatNormalizeSkip: 0,
40
+ shouldInvalidate: true,
41
+ size: 1000,
42
+ solver: 'GS',
43
+ stepSize: 1 / 60,
44
+ tolerance: 0.001,
45
+ });
46
+ this.zone = inject(NgZone);
47
+ this.injector = inject(Injector);
48
+ this.store = injectNgtStore();
49
+ this.invalidate = this.store.select('invalidate');
50
+ this.api = signalStore({
51
+ bodies: {},
52
+ events: {},
53
+ refs: {},
54
+ scaleOverrides: {},
55
+ subscriptions: {},
56
+ worker: null,
57
+ });
58
+ this.worker = this.api.select('worker');
59
+ }
60
+ set _isPaused(isPaused) {
61
+ this.inputs.set({ isPaused });
62
+ }
63
+ set _maxSubSteps(maxSubSteps) {
64
+ this.inputs.set({ maxSubSteps });
65
+ }
66
+ set _shouldInvalidate(shouldInvalidate) {
67
+ this.inputs.set({ shouldInvalidate });
68
+ }
69
+ set _stepSize(stepSize) {
70
+ this.inputs.set({ stepSize });
71
+ }
72
+ set _size(size) {
73
+ this.inputs.set({ size });
74
+ }
75
+ set _allowSleep(allowSleep) {
76
+ this.inputs.set({ allowSleep });
77
+ }
78
+ set _axisIndex(axisIndex) {
79
+ this.inputs.set({ axisIndex });
80
+ }
81
+ set _broadphase(broadphase) {
82
+ this.inputs.set({ broadphase });
83
+ }
84
+ set _defaultContactMaterial(defaultContactMaterial) {
85
+ this.inputs.set({ defaultContactMaterial });
86
+ }
87
+ set _frictionGravity(frictionGravity) {
88
+ this.inputs.set({ frictionGravity });
89
+ }
90
+ set _gravity(gravity) {
91
+ this.inputs.set({ gravity });
92
+ }
93
+ set _iterations(iterations) {
94
+ this.inputs.set({ iterations });
95
+ }
96
+ set _quatNormalizeFast(quatNormalizeFast) {
97
+ this.inputs.set({ quatNormalizeFast });
98
+ }
99
+ set _quatNormalizeSkip(quatNormalizeSkip) {
100
+ this.inputs.set({ quatNormalizeSkip });
101
+ }
102
+ set _solver(solver) {
103
+ this.inputs.set({ solver });
104
+ }
105
+ set _tolerance(tolerance) {
106
+ this.inputs.set({ tolerance });
107
+ }
108
+ ngOnInit() {
109
+ this.zone.runOutsideAngular(() => {
110
+ this.api.set({ worker: new CannonWorkerAPI(this.inputs.state()) });
111
+ this.connectWorker();
112
+ this.updateWorkerState('axisIndex');
113
+ this.updateWorkerState('broadphase');
114
+ this.updateWorkerState('gravity');
115
+ this.updateWorkerState('iterations');
116
+ this.updateWorkerState('tolerance');
117
+ this.beforeRender();
118
+ });
119
+ }
120
+ connectWorker() {
121
+ effect((onCleanup) => {
122
+ const worker = this.worker();
123
+ if (!worker)
124
+ return;
125
+ worker.connect();
126
+ worker.init();
127
+ worker.on('collide', this.collideHandler.bind(this));
128
+ worker.on('collideBegin', this.collideBeginHandler.bind(this));
129
+ worker.on('collideEnd', this.collideEndHandler.bind(this));
130
+ worker.on('frame', this.frameHandler.bind(this));
131
+ worker.on('rayhit', this.rayhitHandler.bind(this));
132
+ onCleanup(() => {
133
+ worker.terminate();
134
+ worker.removeAllListeners();
135
+ });
136
+ }, { injector: this.injector });
137
+ }
138
+ updateWorkerState(key) {
139
+ const compute = this.inputs.select(key);
140
+ effect(() => {
141
+ const [worker, value] = [untracked(this.worker), compute()];
142
+ // @ts-expect-error
143
+ worker[key] = value;
144
+ }, { injector: this.injector });
145
+ }
146
+ collideHandler({ body, contact: { bi, bj, ...contactRest }, target, ...rest }) {
147
+ const { events, refs } = this.api.get();
148
+ const cb = events[target]?.collide;
149
+ if (cb) {
150
+ cb({
151
+ body: refs[body],
152
+ contact: { bi: refs[bi], bj: refs[bj], ...contactRest },
153
+ target: refs[target],
154
+ ...rest,
155
+ });
156
+ }
157
+ }
158
+ collideBeginHandler({ bodyA, bodyB }) {
159
+ const { events, refs } = this.api.get();
160
+ const cbA = events[bodyA]?.collideBegin;
161
+ if (cbA)
162
+ cbA({ body: refs[bodyB], op: 'event', target: refs[bodyA], type: 'collideBegin' });
163
+ const cbB = events[bodyB]?.collideBegin;
164
+ if (cbB)
165
+ cbB({ body: refs[bodyA], op: 'event', target: refs[bodyB], type: 'collideBegin' });
166
+ }
167
+ collideEndHandler({ bodyA, bodyB }) {
168
+ const { events, refs } = this.api.get();
169
+ const cbA = events[bodyA]?.collideEnd;
170
+ if (cbA)
171
+ cbA({ body: refs[bodyB], op: 'event', target: refs[bodyA], type: 'collideEnd' });
172
+ const cbB = events[bodyB]?.collideEnd;
173
+ if (cbB)
174
+ cbB({ body: refs[bodyA], op: 'event', target: refs[bodyB], type: 'collideEnd' });
175
+ }
176
+ frameHandler({ active, bodies: uuids = [], observations, positions, quaternions, }) {
177
+ const [{ shouldInvalidate }, { bodies, subscriptions, refs, scaleOverrides }, invalidate] = [
178
+ this.inputs.get(),
179
+ this.api.get(),
180
+ this.invalidate(),
181
+ ];
182
+ for (let i = 0; i < uuids.length; i++) {
183
+ bodies[uuids[i]] = i;
184
+ }
185
+ observations.forEach(([id, value, type]) => {
186
+ const subscription = subscriptions[id] || {};
187
+ const cb = subscription[type];
188
+ // HELP: We clearly know the type of the callback, but typescript can't deal with it
189
+ cb && cb(value);
190
+ });
191
+ if (!active)
192
+ return;
193
+ for (const ref of Object.values(refs).filter(unique())) {
194
+ if (ref instanceof THREE.InstancedMesh) {
195
+ for (let i = 0; i < ref.count; i++) {
196
+ const uuid = `${ref.uuid}/${i}`;
197
+ const index = bodies[uuid];
198
+ if (index !== undefined) {
199
+ ref.setMatrixAt(i, apply(index, positions, quaternions, scaleOverrides[uuid]));
200
+ ref.instanceMatrix.needsUpdate = true;
201
+ }
202
+ }
203
+ }
204
+ else {
205
+ const scale = scaleOverrides[ref.uuid] || ref.scale;
206
+ apply(bodies[ref.uuid], positions, quaternions, scale, ref);
207
+ }
208
+ }
209
+ if (shouldInvalidate)
210
+ invalidate();
211
+ }
212
+ rayhitHandler({ body, ray: { uuid, ...rayRest }, ...rest }) {
213
+ const { events, refs } = this.api.get();
214
+ const cb = events[uuid]?.rayhit;
215
+ if (cb)
216
+ cb({ body: body ? refs[body] : null, ray: { uuid, ...rayRest }, ...rest });
217
+ }
218
+ beforeRender() {
219
+ let timeSinceLastCalled = 0;
220
+ injectBeforeRender(({ delta }) => {
221
+ const [{ isPaused, maxSubSteps, stepSize }, worker] = [this.inputs.get(), this.worker()];
222
+ if (isPaused || !worker)
223
+ return;
224
+ timeSinceLastCalled += delta;
225
+ worker.step({ maxSubSteps, stepSize: stepSize, timeSinceLastCalled });
226
+ timeSinceLastCalled = 0;
227
+ }, { injector: this.injector });
228
+ }
229
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.2", ngImport: i0, type: NgtcPhysics, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
230
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.2", type: NgtcPhysics, isStandalone: true, selector: "ngtc-physics", inputs: { _isPaused: ["isPaused", "_isPaused"], _maxSubSteps: ["maxSubSteps", "_maxSubSteps"], _shouldInvalidate: ["shouldInvalidate", "_shouldInvalidate"], _stepSize: ["stepSize", "_stepSize"], _size: ["size", "_size"], _allowSleep: ["allowSleep", "_allowSleep"], _axisIndex: ["axisIndex", "_axisIndex"], _broadphase: ["broadphase", "_broadphase"], _defaultContactMaterial: ["defaultContactMaterial", "_defaultContactMaterial"], _frictionGravity: ["frictionGravity", "_frictionGravity"], _gravity: ["gravity", "_gravity"], _iterations: ["iterations", "_iterations"], _quatNormalizeFast: ["quatNormalizeFast", "_quatNormalizeFast"], _quatNormalizeSkip: ["quatNormalizeSkip", "_quatNormalizeSkip"], _solver: ["solver", "_solver"], _tolerance: ["tolerance", "_tolerance"] }, providers: [provideNgtcPhysicsApi()], ngImport: i0, template: `
231
+ <ng-content />
232
+ `, isInline: true }); }
233
+ }
234
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.2", ngImport: i0, type: NgtcPhysics, decorators: [{
235
+ type: Component,
236
+ args: [{
237
+ selector: 'ngtc-physics',
238
+ standalone: true,
239
+ template: `
240
+ <ng-content />
241
+ `,
242
+ providers: [provideNgtcPhysicsApi()],
243
+ }]
244
+ }], propDecorators: { _isPaused: [{
245
+ type: Input,
246
+ args: [{ alias: 'isPaused' }]
247
+ }], _maxSubSteps: [{
248
+ type: Input,
249
+ args: [{ alias: 'maxSubSteps' }]
250
+ }], _shouldInvalidate: [{
251
+ type: Input,
252
+ args: [{ alias: 'shouldInvalidate' }]
253
+ }], _stepSize: [{
254
+ type: Input,
255
+ args: [{ alias: 'stepSize' }]
256
+ }], _size: [{
257
+ type: Input,
258
+ args: [{ alias: 'size' }]
259
+ }], _allowSleep: [{
260
+ type: Input,
261
+ args: [{ alias: 'allowSleep' }]
262
+ }], _axisIndex: [{
263
+ type: Input,
264
+ args: [{ alias: 'axisIndex' }]
265
+ }], _broadphase: [{
266
+ type: Input,
267
+ args: [{ alias: 'broadphase' }]
268
+ }], _defaultContactMaterial: [{
269
+ type: Input,
270
+ args: [{ alias: 'defaultContactMaterial' }]
271
+ }], _frictionGravity: [{
272
+ type: Input,
273
+ args: [{ alias: 'frictionGravity' }]
274
+ }], _gravity: [{
275
+ type: Input,
276
+ args: [{ alias: 'gravity' }]
277
+ }], _iterations: [{
278
+ type: Input,
279
+ args: [{ alias: 'iterations' }]
280
+ }], _quatNormalizeFast: [{
281
+ type: Input,
282
+ args: [{ alias: 'quatNormalizeFast' }]
283
+ }], _quatNormalizeSkip: [{
284
+ type: Input,
285
+ args: [{ alias: 'quatNormalizeSkip' }]
286
+ }], _solver: [{
287
+ type: Input,
288
+ args: [{ alias: 'solver' }]
289
+ }], _tolerance: [{
290
+ type: Input,
291
+ args: [{ alias: 'tolerance' }]
292
+ }] } });
293
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGh5c2ljcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvY2Fubm9uL3NyYy9saWIvcGh5c2ljcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBZSxNQUFNLGVBQWUsQ0FBQztBQUN2SCxPQUFPLEVBQ04sZUFBZSxHQWlCZixNQUFNLDJCQUEyQixDQUFDO0FBQ25DLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxrQkFBa0IsRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3RHLE9BQU8sS0FBSyxLQUFLLE1BQU0sT0FBTyxDQUFDOztBQUUvQixNQUFNLENBQUMsR0FBRyxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztBQUM5QixNQUFNLENBQUMsR0FBRyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNyQyxNQUFNLENBQUMsR0FBRyxJQUFJLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztBQUNqQyxNQUFNLENBQUMsR0FBRyxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztBQUU5QixTQUFTLEtBQUssQ0FBQyxLQUFhLEVBQUUsU0FBdUIsRUFBRSxXQUF5QixFQUFFLEtBQUssR0FBRyxDQUFDLEVBQUUsTUFBdUI7SUFDbkgsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFO1FBQ3hCLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsS0FBSyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLEtBQUssR0FBRyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN6RixJ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LCBlZmZlY3QsIGZvcndhcmRSZWYsIGluamVjdCwgdW50cmFja2VkLCB0eXBlIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcblx0Q2Fubm9uV29ya2VyQVBJLFxuXHR0eXBlIEJyb2FkcGhhc2UsXG5cdHR5cGUgQ2Fubm9uV29ya2VyUHJvcHMsXG5cdHR5cGUgQ29sbGlkZUJlZ2luRXZlbnQsXG5cdHR5cGUgQ29sbGlkZUVuZEV2ZW50LFxuXHR0eXBlIENvbGxpZGVFdmVudCxcblx0dHlwZSBDb250YWN0TWF0ZXJpYWxPcHRpb25zLFxuXHR0eXBlIFJheWhpdEV2ZW50LFxuXHR0eXBlIFJlZnMsXG5cdHR5cGUgU29sdmVyLFxuXHR0eXBlIFN1YnNjcmlwdGlvbnMsXG5cdHR5cGUgVHJpcGxldCxcblx0dHlwZSBXb3JrZXJDb2xsaWRlQmVnaW5FdmVudCxcblx0dHlwZSBXb3JrZXJDb2xsaWRlRW5kRXZlbnQsXG5cdHR5cGUgV29ya2VyQ29sbGlkZUV2ZW50LFxuXHR0eXBlIFdvcmtlckZyYW1lTWVzc2FnZSxcblx0dHlwZSBXb3JrZXJSYXloaXRFdmVudCxcbn0gZnJvbSAnQHBtbmRycy9jYW5ub24td29ya2VyLWFwaSc7XG5pbXBvcnQgeyBjcmVhdGVJbmplY3Rpb25Ub2tlbiwgaW5qZWN0QmVmb3JlUmVuZGVyLCBpbmplY3ROZ3RTdG9yZSwgc2lnbmFsU3RvcmUgfSBmcm9tICdhbmd1bGFyLXRocmVlJztcbmltcG9ydCAqIGFzIFRIUkVFIGZyb20gJ3RocmVlJztcblxuY29uc3QgdiA9IG5ldyBUSFJFRS5WZWN0b3IzKCk7XG5jb25zdCBzID0gbmV3IFRIUkVFLlZlY3RvcjMoMSwgMSwgMSk7XG5jb25zdCBxID0gbmV3IFRIUkVFLlF1YXRlcm5pb24oKTtcbmNvbnN0IG0gPSBuZXcgVEhSRUUuTWF0cml4NCgpO1xuXG5mdW5jdGlvbiBhcHBseShpbmRleDogbnVtYmVyLCBwb3NpdGlvbnM6IEZsb2F0MzJBcnJheSwgcXVhdGVybmlvbnM6IEZsb2F0MzJBcnJheSwgc2NhbGUgPSBzLCBvYmplY3Q/OiBUSFJFRS5PYmplY3QzRCkge1xuXHRpZiAoaW5kZXggIT09IHVuZGVmaW5lZCkge1xuXHRcdG0uY29tcG9zZSh2LmZyb21BcnJheShwb3NpdGlvbnMsIGluZGV4ICogMyksIHEuZnJvbUFycmF5KHF1YXRlcm5pb25zLCBpbmRleCAqIDQpLCBzY2FsZSk7XG5cdFx0aWYgKG9iamVjdCkge1xuXHRcdFx0b2JqZWN0Lm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTtcblx0XHRcdG9iamVjdC5tYXRyaXguY29weShtKTtcblx0XHR9XG5cdFx0cmV0dXJuIG07XG5cdH1cblx0cmV0dXJuIG0uaWRlbnRpdHkoKTtcbn1cblxuY29uc3QgdW5pcXVlID0gKCkgPT4ge1xuXHRjb25zdCB2YWx1ZXM6IHVua25vd25bXSA9IFtdO1xuXHRyZXR1cm4gKHZhbHVlOiB1bmtub3duKSA9PiAodmFsdWVzLmluY2x1ZGVzKHZhbHVlKSA/IGZhbHNlIDogISF2YWx1ZXMucHVzaCh2YWx1ZSkpO1xufTtcblxuZXhwb3J0IHR5cGUgTmd0Y1BoeXNpY3NTdGF0ZSA9IENhbm5vbldvcmtlclByb3BzICYge1xuXHRpc1BhdXNlZD86IGJvb2xlYW47XG5cdG1heFN1YlN0ZXBzPzogbnVtYmVyO1xuXHRzaG91bGRJbnZhbGlkYXRlPzogYm9vbGVhbjtcblx0c3RlcFNpemU/OiBudW1iZXI7XG59O1xuXG50eXBlIE5ndGNDYW5ub25FdmVudCA9IENvbGxpZGVCZWdpbkV2ZW50IHwgQ29sbGlkZUVuZEV2ZW50IHwgQ29sbGlkZUV2ZW50IHwgUmF5aGl0RXZlbnQ7XG50eXBlIE5ndGNDYWxsYmFja0J5VHlwZTxUIGV4dGVuZHMgeyB0eXBlOiBzdHJpbmcgfT4gPSB7XG5cdFtLIGluIFRbJ3R5cGUnXV0/OiBUIGV4dGVuZHMgeyB0eXBlOiBLIH0gPyAoZTogVCkgPT4gdm9pZCA6IG5ldmVyO1xufTtcblxuZXhwb3J0IHR5cGUgTmd0Y0Nhbm5vbkV2ZW50cyA9IHsgW3V1aWQ6IHN0cmluZ106IFBhcnRpYWw8Tmd0Y0NhbGxiYWNrQnlUeXBlPE5ndGNDYW5ub25FdmVudD4+IH07XG5cbmV4cG9ydCB0eXBlIFNjYWxlT3ZlcnJpZGVzID0geyBbdXVpZDogc3RyaW5nXTogVEhSRUUuVmVjdG9yMyB9O1xuXG5leHBvcnQgdHlwZSBOZ3RjUGh5c2ljc0FwaSA9IHtcblx0Ym9kaWVzOiB7IFt1dWlkOiBzdHJpbmddOiBudW1iZXIgfTtcblx0ZXZlbnRzOiBOZ3RjQ2Fubm9uRXZlbnRzO1xuXHRyZWZzOiBSZWZzO1xuXHRzY2FsZU92ZXJyaWRlczogU2NhbGVPdmVycmlkZXM7XG5cdHN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbnM7XG5cdHdvcmtlcjogQ2Fubm9uV29ya2VyQVBJO1xufTtcblxuZXhwb3J0IGNvbnN0IFtpbmplY3ROZ3RjUGh5c2ljc0FwaSwgcHJvdmlkZU5ndGNQaHlzaWNzQXBpXSA9IGNyZWF0ZUluamVjdGlvblRva2VuKFxuXHQocGh5c2ljczogTmd0Y1BoeXNpY3MpID0+IHBoeXNpY3MuYXBpLFxuXHR7IGlzUm9vdDogZmFsc2UsIGRlcHM6IFtmb3J3YXJkUmVmKCgpID0+IE5ndGNQaHlzaWNzKV0gfSxcbik7XG5cbkBDb21wb25lbnQoe1xuXHRzZWxlY3RvcjogJ25ndGMtcGh5c2ljcycsXG5cdHN0YW5kYWxvbmU6IHRydWUsXG5cdHRlbXBsYXRlOiBgXG5cdFx0PG5nLWNvbnRlbnQgLz5cblx0YCxcblx0cHJvdmlkZXJzOiBbcHJvdmlkZU5ndGNQaHlzaWNzQXBpKCldLFxufSlcbmV4cG9ydCBjbGFzcyBOZ3RjUGh5c2ljcyBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cdHByaXZhdGUgaW5wdXRzID0gc2lnbmFsU3RvcmU8Tmd0Y1BoeXNpY3NTdGF0ZT4oe1xuXHRcdGFsbG93U2xlZXA6IGZhbHNlLFxuXHRcdGF4aXNJbmRleDogMCxcblx0XHRicm9hZHBoYXNlOiAnTmFpdmUnLFxuXHRcdGRlZmF1bHRDb250YWN0TWF0ZXJpYWw6IHsgY29udGFjdEVxdWF0aW9uU3RpZmZuZXNzOiAxZTYgfSxcblx0XHRmcmljdGlvbkdyYXZpdHk6IG51bGwsXG5cdFx0Z3Jhdml0eTogWzAsIC05LjgxLCAwXSxcblx0XHRpc1BhdXNlZDogZmFsc2UsXG5cdFx0aXRlcmF0aW9uczogNSxcblx0XHRtYXhTdWJTdGVwczogMTAsXG5cdFx0cXVhdE5vcm1hbGl6ZUZhc3Q6IGZhbHNlLFxuXHRcdHF1YXROb3JtYWxpemVTa2lwOiAwLFxuXHRcdHNob3VsZEludmFsaWRhdGU6IHRydWUsXG5cdFx0c2l6ZTogMTAwMCxcblx0XHRzb2x2ZXI6ICdHUycsXG5cdFx0c3RlcFNpemU6IDEgLyA2MCxcblx0XHR0b2xlcmFuY2U6IDAuMDAxLFxuXHR9KTtcblxuXHRASW5wdXQoeyBhbGlhczogJ2lzUGF1c2VkJyB9KSBzZXQgX2lzUGF1c2VkKGlzUGF1c2VkOiBib29sZWFuKSB7XG5cdFx0dGhpcy5pbnB1dHMuc2V0KHsgaXNQYXVzZWQgfSk7XG5cdH1cblxuXHRASW5wdXQoeyBhbGlhczogJ21heFN1YlN0ZXBzJyB9KSBzZXQgX21heFN1YlN0ZXBzKG1heFN1YlN0ZXBzOiBudW1iZXIpIHtcblx0XHR0aGlzLmlucHV0cy5zZXQoeyBtYXhTdWJTdGVwcyB9KTtcblx0fVxuXG5cdEBJbnB1dCh7IGFsaWFzOiAnc2hvdWxkSW52YWxpZGF0ZScgfSkgc2V0IF9zaG91bGRJbnZhbGlkYXRlKHNob3VsZEludmFsaWRhdGU6IGJvb2xlYW4pIHtcblx0XHR0aGlzLmlucHV0cy5zZXQoeyBzaG91bGRJbnZhbGlkYXRlIH0pO1xuXHR9XG5cblx0QElucHV0KHsgYWxpYXM6ICdzdGVwU2l6ZScgfSkgc2V0IF9zdGVwU2l6ZShzdGVwU2l6ZTogbnVtYmVyKSB7XG5cdFx0dGhpcy5pbnB1dHMuc2V0KHsgc3RlcFNpemUgfSk7XG5cdH1cblxuXHRASW5wdXQoeyBhbGlhczogJ3NpemUnIH0pIHNldCBfc2l6ZShzaXplOiBudW1iZXIpIHtcblx0XHR0aGlzLmlucHV0cy5zZXQoeyBzaXplIH0pO1xuXHR9XG5cblx0QElucHV0KHsgYWxpYXM6ICdhbGxvd1NsZWVwJyB9KSBzZXQgX2FsbG93U2xlZXAoYWxsb3dTbGVlcDogYm9vbGVhbikge1xuXHRcdHRoaXMuaW5wdXRzLnNldCh7IGFsbG93U2xlZXAgfSk7XG5cdH1cblxuXHRASW5wdXQoeyBhbGlhczogJ2F4aXNJbmRleCcgfSkgc2V0IF9heGlzSW5kZXgoYXhpc0luZGV4OiAwIHwgMSB8IDIpIHtcblx0XHR0aGlzLmlucHV0cy5zZXQoeyBheGlzSW5kZXggfSk7XG5cdH1cblxuXHRASW5wdXQoeyBhbGlhczogJ2Jyb2FkcGhhc2UnIH0pIHNldCBfYnJvYWRwaGFzZShicm9hZHBoYXNlOiBCcm9hZHBoYXNlKSB7XG5cdFx0dGhpcy5pbnB1dHMuc2V0KHsgYnJvYWRwaGFzZSB9KTtcblx0fVxuXG5cdEBJbnB1dCh7IGFsaWFzOiAnZGVmYXVsdENvbnRhY3RNYXRlcmlhbCcgfSkgc2V0IF9kZWZhdWx0Q29udGFjdE1hdGVyaWFsKFxuXHRcdGRlZmF1bHRDb250YWN0TWF0ZXJpYWw6IENvbnRhY3RNYXRlcmlhbE9wdGlvbnMsXG5cdCkge1xuXHRcdHRoaXMuaW5wdXRzLnNldCh7IGRlZmF1bHRDb250YWN0TWF0ZXJpYWwgfSk7XG5cdH1cblxuXHRASW5wdXQoeyBhbGlhczogJ2ZyaWN0aW9uR3Jhdml0eScgfSkgc2V0IF9mcmljdGlvbkdyYXZpdHkoZnJpY3Rpb25HcmF2aXR5OiBUcmlwbGV0IHwgbnVsbCkge1xuXHRcdHRoaXMuaW5wdXRzLnNldCh7IGZyaWN0aW9uR3Jhdml0eSB9KTtcblx0fVxuXG5cdEBJbnB1dCh7IGFsaWFzOiAnZ3Jhdml0eScgfSkgc2V0IF9ncmF2aXR5KGdyYXZpdHk6IFRyaXBsZXQpIHtcblx0XHR0aGlzLmlucHV0cy5zZXQoeyBncmF2aXR5IH0pO1xuXHR9XG5cblx0QElucHV0KHsgYWxpYXM6ICdpdGVyYXRpb25zJyB9KSBzZXQgX2l0ZXJhdGlvbnMoaXRlcmF0aW9uczogbnVtYmVyKSB7XG5cdFx0dGhpcy5pbnB1dHMuc2V0KHsgaXRlcmF0aW9ucyB9KTtcblx0fVxuXG5cdEBJbnB1dCh7IGFsaWFzOiAncXVhdE5vcm1hbGl6ZUZhc3QnIH0pIHNldCBfcXVhdE5vcm1hbGl6ZUZhc3QocXVhdE5vcm1hbGl6ZUZhc3Q6IGJvb2xlYW4pIHtcblx0XHR0aGlzLmlucHV0cy5zZXQoeyBxdWF0Tm9ybWFsaXplRmFzdCB9KTtcblx0fVxuXG5cdEBJbnB1dCh7IGFsaWFzOiAncXVhdE5vcm1hbGl6ZVNraXAnIH0pIHNldCBfcXVhdE5vcm1hbGl6ZVNraXAocXVhdE5vcm1hbGl6ZVNraXA6IG51bWJlcikge1xuXHRcdHRoaXMuaW5wdXRzLnNldCh7IHF1YXROb3JtYWxpemVTa2lwIH0pO1xuXHR9XG5cblx0QElucHV0KHsgYWxpYXM6ICdzb2x2ZXInIH0pIHNldCBfc29sdmVyKHNvbHZlcjogU29sdmVyKSB7XG5cdFx0dGhpcy5pbnB1dHMuc2V0KHsgc29sdmVyIH0pO1xuXHR9XG5cblx0QElucHV0KHsgYWxpYXM6ICd0b2xlcmFuY2UnIH0pIHNldCBfdG9sZXJhbmNlKHRvbGVyYW5jZTogbnVtYmVyKSB7XG5cdFx0dGhpcy5pbnB1dHMuc2V0KHsgdG9sZXJhbmNlIH0pO1xuXHR9XG5cblx0cHJpdmF0ZSB6b25lID0gaW5qZWN0KE5nWm9uZSk7XG5cdHByaXZhdGUgaW5qZWN0b3IgPSBpbmplY3QoSW5qZWN0b3IpO1xuXG5cdHByaXZhdGUgc3RvcmUgPSBpbmplY3ROZ3RTdG9yZSgpO1xuXHRwcml2YXRlIGludmFsaWRhdGUgPSB0aGlzLnN0b3JlLnNlbGVjdCgnaW52YWxpZGF0ZScpO1xuXG5cdGFwaSA9IHNpZ25hbFN0b3JlPE5ndGNQaHlzaWNzQXBpPih7XG5cdFx0Ym9kaWVzOiB7fSxcblx0XHRldmVudHM6IHt9LFxuXHRcdHJlZnM6IHt9LFxuXHRcdHNjYWxlT3ZlcnJpZGVzOiB7fSxcblx0XHRzdWJzY3JpcHRpb25zOiB7fSxcblx0XHR3b3JrZXI6IG51bGwhLFxuXHR9KTtcblxuXHRwcml2YXRlIHdvcmtlciA9IHRoaXMuYXBpLnNlbGVjdCgnd29ya2VyJyk7XG5cblx0bmdPbkluaXQoKSB7XG5cdFx0dGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcblx0XHRcdHRoaXMuYXBpLnNldCh7IHdvcmtlcjogbmV3IENhbm5vbldvcmtlckFQSSh0aGlzLmlucHV0cy5zdGF0ZSgpKSB9KTtcblx0XHRcdHRoaXMuY29ubmVjdFdvcmtlcigpO1xuXHRcdFx0dGhpcy51cGRhdGVXb3JrZXJTdGF0ZSgnYXhpc0luZGV4Jyk7XG5cdFx0XHR0aGlzLnVwZGF0ZVdvcmtlclN0YXRlKCdicm9hZHBoYXNlJyk7XG5cdFx0XHR0aGlzLnVwZGF0ZVdvcmtlclN0YXRlKCdncmF2aXR5Jyk7XG5cdFx0XHR0aGlzLnVwZGF0ZVdvcmtlclN0YXRlKCdpdGVyYXRpb25zJyk7XG5cdFx0XHR0aGlzLnVwZGF0ZVdvcmtlclN0YXRlKCd0b2xlcmFuY2UnKTtcblx0XHRcdHRoaXMuYmVmb3JlUmVuZGVyKCk7XG5cdFx0fSk7XG5cdH1cblxuXHRwcml2YXRlIGNvbm5lY3RXb3JrZXIoKSB7XG5cdFx0ZWZmZWN0KFxuXHRcdFx0KG9uQ2xlYW51cCkgPT4ge1xuXHRcdFx0XHRjb25zdCB3b3JrZXIgPSB0aGlzLndvcmtlcigpO1xuXHRcdFx0XHRpZiAoIXdvcmtlcikgcmV0dXJuO1xuXG5cdFx0XHRcdHdvcmtlci5jb25uZWN0KCk7XG5cdFx0XHRcdHdvcmtlci5pbml0KCk7XG5cblx0XHRcdFx0KHdvcmtlciBhcyBhbnkpLm9uKCdjb2xsaWRlJywgdGhpcy5jb2xsaWRlSGFuZGxlci5iaW5kKHRoaXMpKTtcblx0XHRcdFx0KHdvcmtlciBhcyBhbnkpLm9uKCdjb2xsaWRlQmVnaW4nLCB0aGlzLmNvbGxpZGVCZWdpbkhhbmRsZXIuYmluZCh0aGlzKSk7XG5cdFx0XHRcdCh3b3JrZXIgYXMgYW55KS5vbignY29sbGlkZUVuZCcsIHRoaXMuY29sbGlkZUVuZEhhbmRsZXIuYmluZCh0aGlzKSk7XG5cdFx0XHRcdCh3b3JrZXIgYXMgYW55KS5vbignZnJhbWUnLCB0aGlzLmZyYW1lSGFuZGxlci5iaW5kKHRoaXMpKTtcblx0XHRcdFx0KHdvcmtlciBhcyBhbnkpLm9uKCdyYXloaXQnLCB0aGlzLnJheWhpdEhhbmRsZXIuYmluZCh0aGlzKSk7XG5cblx0XHRcdFx0b25DbGVhbnVwKCgpID0+IHtcblx0XHRcdFx0XHR3b3JrZXIudGVybWluYXRlKCk7XG5cdFx0XHRcdFx0KHdvcmtlciBhcyBhbnkpLnJlbW92ZUFsbExpc3RlbmVycygpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0sXG5cdFx0XHR7IGluamVjdG9yOiB0aGlzLmluamVjdG9yIH0sXG5cdFx0KTtcblx0fVxuXG5cdHByaXZhdGUgdXBkYXRlV29ya2VyU3RhdGUoa2V5OiBrZXlvZiBOZ3RjUGh5c2ljc1N0YXRlKSB7XG5cdFx0Y29uc3QgY29tcHV0ZSA9IHRoaXMuaW5wdXRzLnNlbGVjdChrZXkpO1xuXHRcdGVmZmVjdChcblx0XHRcdCgpID0+IHtcblx0XHRcdFx0Y29uc3QgW3dvcmtlciwgdmFsdWVdID0gW3VudHJhY2tlZCh0aGlzLndvcmtlciksIGNvbXB1dGUoKV07XG5cdFx0XHRcdC8vIEB0cy1leHBlY3QtZXJyb3Jcblx0XHRcdFx0d29ya2VyW2tleV0gPSB2YWx1ZTtcblx0XHRcdH0sXG5cdFx0XHR7IGluamVjdG9yOiB0aGlzLmluamVjdG9yIH0sXG5cdFx0KTtcblx0fVxuXG5cdHByaXZhdGUgY29sbGlkZUhhbmRsZXIoeyBib2R5LCBjb250YWN0OiB7IGJpLCBiaiwgLi4uY29udGFjdFJlc3QgfSwgdGFyZ2V0LCAuLi5yZXN0IH06IFdvcmtlckNvbGxpZGVFdmVudFsnZGF0YSddKSB7XG5cdFx0Y29uc3QgeyBldmVudHMsIHJlZnMgfSA9IHRoaXMuYXBpLmdldCgpO1xuXHRcdGNvbnN0IGNiID0gZXZlbnRzW3RhcmdldF0/LmNvbGxpZGU7XG5cblx0XHRpZiAoY2IpIHtcblx0XHRcdGNiKHtcblx0XHRcdFx0Ym9keTogcmVmc1tib2R5XSxcblx0XHRcdFx0Y29udGFjdDogeyBiaTogcmVmc1tiaV0sIGJqOiByZWZzW2JqXSwgLi4uY29udGFjdFJlc3QgfSxcblx0XHRcdFx0dGFyZ2V0OiByZWZzW3RhcmdldF0sXG5cdFx0XHRcdC4uLnJlc3QsXG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGNvbGxpZGVCZWdpbkhhbmRsZXIoeyBib2R5QSwgYm9keUIgfTogV29ya2VyQ29sbGlkZUJlZ2luRXZlbnRbJ2RhdGEnXSkge1xuXHRcdGNvbnN0IHsgZXZlbnRzLCByZWZzIH0gPSB0aGlzLmFwaS5nZXQoKTtcblx0XHRjb25zdCBjYkEgPSBldmVudHNbYm9keUFdPy5jb2xsaWRlQmVnaW47XG5cdFx0aWYgKGNiQSkgY2JBKHsgYm9keTogcmVmc1tib2R5Ql0sIG9wOiAnZXZlbnQnLCB0YXJnZXQ6IHJlZnNbYm9keUFdLCB0eXBlOiAnY29sbGlkZUJlZ2luJyB9KTtcblx0XHRjb25zdCBjYkIgPSBldmVudHNbYm9keUJdPy5jb2xsaWRlQmVnaW47XG5cdFx0aWYgKGNiQikgY2JCKHsgYm9keTogcmVmc1tib2R5QV0sIG9wOiAnZXZlbnQnLCB0YXJnZXQ6IHJlZnNbYm9keUJdLCB0eXBlOiAnY29sbGlkZUJlZ2luJyB9KTtcblx0fVxuXG5cdHByaXZhdGUgY29sbGlkZUVuZEhhbmRsZXIoeyBib2R5QSwgYm9keUIgfTogV29ya2VyQ29sbGlkZUVuZEV2ZW50WydkYXRhJ10pIHtcblx0XHRjb25zdCB7IGV2ZW50cywgcmVmcyB9ID0gdGhpcy5hcGkuZ2V0KCk7XG5cdFx0Y29uc3QgY2JBID0gZXZlbnRzW2JvZHlBXT8uY29sbGlkZUVuZDtcblx0XHRpZiAoY2JBKSBjYkEoeyBib2R5OiByZWZzW2JvZHlCXSwgb3A6ICdldmVudCcsIHRhcmdldDogcmVmc1tib2R5QV0sIHR5cGU6ICdjb2xsaWRlRW5kJyB9KTtcblx0XHRjb25zdCBjYkIgPSBldmVudHNbYm9keUJdPy5jb2xsaWRlRW5kO1xuXHRcdGlmIChjYkIpIGNiQih7IGJvZHk6IHJlZnNbYm9keUFdLCBvcDogJ2V2ZW50JywgdGFyZ2V0OiByZWZzW2JvZHlCXSwgdHlwZTogJ2NvbGxpZGVFbmQnIH0pO1xuXHR9XG5cblx0cHJpdmF0ZSBmcmFtZUhhbmRsZXIoe1xuXHRcdGFjdGl2ZSxcblx0XHRib2RpZXM6IHV1aWRzID0gW10sXG5cdFx0b2JzZXJ2YXRpb25zLFxuXHRcdHBvc2l0aW9ucyxcblx0XHRxdWF0ZXJuaW9ucyxcblx0fTogV29ya2VyRnJhbWVNZXNzYWdlWydkYXRhJ10pIHtcblx0XHRjb25zdCBbeyBzaG91bGRJbnZhbGlkYXRlIH0sIHsgYm9kaWVzLCBzdWJzY3JpcHRpb25zLCByZWZzLCBzY2FsZU92ZXJyaWRlcyB9LCBpbnZhbGlkYXRlXSA9IFtcblx0XHRcdHRoaXMuaW5wdXRzLmdldCgpLFxuXHRcdFx0dGhpcy5hcGkuZ2V0KCksXG5cdFx0XHR0aGlzLmludmFsaWRhdGUoKSxcblx0XHRdO1xuXG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB1dWlkcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0Ym9kaWVzW3V1aWRzW2ldXSA9IGk7XG5cdFx0fVxuXG5cdFx0b2JzZXJ2YXRpb25zLmZvckVhY2goKFtpZCwgdmFsdWUsIHR5cGVdKSA9PiB7XG5cdFx0XHRjb25zdCBzdWJzY3JpcHRpb24gPSBzdWJzY3JpcHRpb25zW2lkXSB8fCB7fTtcblx0XHRcdGNvbnN0IGNiID0gc3Vic2NyaXB0aW9uW3R5cGVdO1xuXHRcdFx0Ly8gSEVMUDogV2UgY2xlYXJseSBrbm93IHRoZSB0eXBlIG9mIHRoZSBjYWxsYmFjaywgYnV0IHR5cGVzY3JpcHQgY2FuJ3QgZGVhbCB3aXRoIGl0XG5cdFx0XHRjYiAmJiBjYih2YWx1ZSBhcyBuZXZlcik7XG5cdFx0fSk7XG5cblx0XHRpZiAoIWFjdGl2ZSkgcmV0dXJuO1xuXG5cdFx0Zm9yIChjb25zdCByZWYgb2YgT2JqZWN0LnZhbHVlcyhyZWZzKS5maWx0ZXIodW5pcXVlKCkpKSB7XG5cdFx0XHRpZiAocmVmIGluc3RhbmNlb2YgVEhSRUUuSW5zdGFuY2VkTWVzaCkge1xuXHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHJlZi5jb3VudDsgaSsrKSB7XG5cdFx0XHRcdFx0Y29uc3QgdXVpZCA9IGAke3JlZi51dWlkfS8ke2l9YDtcblx0XHRcdFx0XHRjb25zdCBpbmRleCA9IGJvZGllc1t1dWlkXTtcblx0XHRcdFx0XHRpZiAoaW5kZXggIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0cmVmLnNldE1hdHJpeEF0KGksIGFwcGx5KGluZGV4LCBwb3NpdGlvbnMsIHF1YXRlcm5pb25zLCBzY2FsZU92ZXJyaWRlc1t1dWlkXSkpO1xuXHRcdFx0XHRcdFx0cmVmLmluc3RhbmNlTWF0cml4Lm5lZWRzVXBkYXRlID0gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IHNjYWxlID0gc2NhbGVPdmVycmlkZXNbcmVmLnV1aWRdIHx8IHJlZi5zY2FsZTtcblx0XHRcdFx0YXBwbHkoYm9kaWVzW3JlZi51dWlkXSwgcG9zaXRpb25zLCBxdWF0ZXJuaW9ucywgc2NhbGUsIHJlZik7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChzaG91bGRJbnZhbGlkYXRlKSBpbnZhbGlkYXRlKCk7XG5cdH1cblxuXHRwcml2YXRlIHJheWhpdEhhbmRsZXIoeyBib2R5LCByYXk6IHsgdXVpZCwgLi4ucmF5UmVzdCB9LCAuLi5yZXN0IH06IFdvcmtlclJheWhpdEV2ZW50WydkYXRhJ10pIHtcblx0XHRjb25zdCB7IGV2ZW50cywgcmVmcyB9ID0gdGhpcy5hcGkuZ2V0KCk7XG5cdFx0Y29uc3QgY2IgPSBldmVudHNbdXVpZF0/LnJheWhpdDtcblx0XHRpZiAoY2IpIGNiKHsgYm9keTogYm9keSA/IHJlZnNbYm9keV0gOiBudWxsLCByYXk6IHsgdXVpZCwgLi4ucmF5UmVzdCB9LCAuLi5yZXN0IH0pO1xuXHR9XG5cblx0cHJpdmF0ZSBiZWZvcmVSZW5kZXIoKSB7XG5cdFx0bGV0IHRpbWVTaW5jZUxhc3RDYWxsZWQgPSAwO1xuXHRcdGluamVjdEJlZm9yZVJlbmRlcihcblx0XHRcdCh7IGRlbHRhIH0pID0+IHtcblx0XHRcdFx0Y29uc3QgW3sgaXNQYXVzZWQsIG1heFN1YlN0ZXBzLCBzdGVwU2l6ZSB9LCB3b3JrZXJdID0gW3RoaXMuaW5wdXRzLmdldCgpLCB0aGlzLndvcmtlcigpXTtcblx0XHRcdFx0aWYgKGlzUGF1c2VkIHx8ICF3b3JrZXIpIHJldHVybjtcblx0XHRcdFx0dGltZVNpbmNlTGFzdENhbGxlZCArPSBkZWx0YTtcblx0XHRcdFx0d29ya2VyLnN0ZXAoeyBtYXhTdWJTdGVwcywgc3RlcFNpemU6IHN0ZXBTaXplISwgdGltZVNpbmNlTGFzdENhbGxlZCB9KTtcblx0XHRcdFx0dGltZVNpbmNlTGFzdENhbGxlZCA9IDA7XG5cdFx0XHR9LFxuXHRcdFx0eyBpbmplY3RvcjogdGhpcy5pbmplY3RvciB9LFxuXHRcdCk7XG5cdH1cbn1cbiJdfQ==
@@ -1,7 +1,7 @@
1
- export * from './body';
2
- export * from './constraint';
3
- export * from './contact-material';
4
- export * from './ray';
5
- export * from './raycast-vehicle';
6
- export * from './spring';
7
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2Nhbm5vbi9zZXJ2aWNlcy9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxRQUFRLENBQUM7QUFDdkIsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyxjQUFjLE9BQU8sQ0FBQztBQUN0QixjQUFjLG1CQUFtQixDQUFDO0FBQ2xDLGNBQWMsVUFBVSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9ib2R5JztcbmV4cG9ydCAqIGZyb20gJy4vY29uc3RyYWludCc7XG5leHBvcnQgKiBmcm9tICcuL2NvbnRhY3QtbWF0ZXJpYWwnO1xuZXhwb3J0ICogZnJvbSAnLi9yYXknO1xuZXhwb3J0ICogZnJvbSAnLi9yYXljYXN0LXZlaGljbGUnO1xuZXhwb3J0ICogZnJvbSAnLi9zcHJpbmcnO1xuIl19
1
+ export * from './lib/body';
2
+ export * from './lib/constraints';
3
+ export * from './lib/contact-material';
4
+ export * from './lib/ray';
5
+ export * from './lib/raycast-vehicle';
6
+ export * from './lib/spring';
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2Nhbm5vbi9zZXJ2aWNlcy9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxZQUFZLENBQUM7QUFDM0IsY0FBYyxtQkFBbUIsQ0FBQztBQUNsQyxjQUFjLHdCQUF3QixDQUFDO0FBQ3ZDLGNBQWMsV0FBVyxDQUFDO0FBQzFCLGNBQWMsdUJBQXVCLENBQUM7QUFDdEMsY0FBYyxjQUFjLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2xpYi9ib2R5JztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbnN0cmFpbnRzJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbnRhY3QtbWF0ZXJpYWwnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvcmF5JztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3JheWNhc3QtdmVoaWNsZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9zcHJpbmcnO1xuIl19