angular-three-soba 2.0.0-beta.2 → 2.0.0-beta.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/abstractions/billboard/billboard.d.ts +11 -7
- package/abstractions/detailed/detailed.d.ts +26 -0
- package/abstractions/edges/edges.d.ts +24 -12
- package/abstractions/grid/grid.d.ts +50 -0
- package/abstractions/index.d.ts +2 -7
- package/abstractions/text/text.d.ts +10 -5
- package/abstractions/text-3d/text-3d.d.ts +51 -41
- package/cameras/camera/camera-content.d.ts +1 -1
- package/cameras/camera/camera.d.ts +16 -13
- package/cameras/cube-camera/cube-camera.d.ts +50 -23
- package/cameras/index.d.ts +0 -1
- package/cameras/orthographic-camera/orthographic-camera.d.ts +29 -18
- package/cameras/perspective-camera/perspective-camera.d.ts +10 -1
- package/controls/orbit-controls/orbit-controls.d.ts +31 -12
- package/esm2022/abstractions/billboard/billboard.mjs +36 -33
- package/esm2022/abstractions/detailed/detailed.mjs +64 -0
- package/esm2022/abstractions/edges/edges.mjs +58 -63
- package/esm2022/abstractions/grid/grid.mjs +180 -0
- package/esm2022/abstractions/index.mjs +3 -8
- package/esm2022/abstractions/text/text.mjs +123 -124
- package/esm2022/abstractions/text-3d/text-3d.mjs +120 -115
- package/esm2022/cameras/camera/camera-content.mjs +6 -6
- package/esm2022/cameras/camera/camera.mjs +48 -42
- package/esm2022/cameras/cube-camera/cube-camera.mjs +129 -99
- package/esm2022/cameras/index.mjs +1 -2
- package/esm2022/cameras/orthographic-camera/orthographic-camera.mjs +78 -75
- package/esm2022/cameras/perspective-camera/perspective-camera.mjs +25 -26
- package/esm2022/controls/orbit-controls/orbit-controls.mjs +105 -85
- package/esm2022/gizmos/angular-three-soba-gizmos.mjs +5 -0
- package/esm2022/gizmos/gizmo-helper/gizmo-helper.mjs +197 -0
- package/esm2022/gizmos/gizmo-helper/gizmo-viewcube/constants.mjs +31 -0
- package/esm2022/gizmos/gizmo-helper/gizmo-viewcube/gizmo-viewcube-edge.mjs +93 -0
- package/esm2022/gizmos/gizmo-helper/gizmo-viewcube/gizmo-viewcube-face.mjs +150 -0
- package/esm2022/gizmos/gizmo-helper/gizmo-viewcube/gizmo-viewcube-input.mjs +66 -0
- package/esm2022/gizmos/gizmo-helper/gizmo-viewcube/gizmo-viewcube.mjs +71 -0
- package/esm2022/gizmos/gizmo-helper/gizmo-viewport/gizmo-viewport-axis.mjs +195 -0
- package/esm2022/gizmos/gizmo-helper/gizmo-viewport/gizmo-viewport.mjs +272 -0
- package/esm2022/gizmos/index.mjs +4 -0
- package/esm2022/loaders/gltf-loader/gltf-loader.mjs +3 -6
- package/esm2022/loaders/loader/loader.mjs +92 -87
- package/esm2022/loaders/progress/progress.mjs +29 -29
- package/esm2022/loaders/texture-loader/texture-loader.mjs +4 -4
- package/esm2022/materials/index.mjs +2 -1
- package/esm2022/materials/mesh-distort-material/mesh-distort-material.mjs +60 -51
- package/esm2022/materials/mesh-reflector-material/mesh-reflector-material.mjs +239 -255
- package/esm2022/materials/mesh-refraction-material/mesh-refraction-material.mjs +102 -99
- package/esm2022/materials/mesh-transmission-material/mesh-transmission-material.mjs +167 -146
- package/esm2022/materials/mesh-wobble-material/mesh-wobble-material.mjs +44 -42
- package/esm2022/materials/point-material/point-material.mjs +50 -0
- package/esm2022/misc/animations/animations.mjs +36 -32
- package/esm2022/misc/bake-shadows/bake-shadows.mjs +13 -13
- package/esm2022/misc/caustics/caustics.mjs +387 -0
- package/esm2022/misc/decal/decal.mjs +187 -0
- package/esm2022/misc/depth-buffer/depth-buffer.mjs +33 -35
- package/esm2022/misc/example/example.mjs +160 -0
- package/esm2022/misc/fbo/fbo.mjs +35 -35
- package/esm2022/misc/html/html-wrapper.mjs +478 -0
- package/esm2022/misc/html/html.mjs +304 -0
- package/esm2022/misc/index.mjs +10 -1
- package/esm2022/misc/sampler/sampler.mjs +142 -0
- package/esm2022/misc/shadow/shadow.mjs +111 -0
- package/esm2022/misc/stats-gl/stats-gl.mjs +61 -0
- package/esm2022/misc/trail/trail.mjs +209 -0
- package/esm2022/misc/trail-texture/inject-trail-texture.mjs +17 -0
- package/esm2022/misc/trail-texture/trail-texture.mjs +106 -0
- package/esm2022/modifiers/angular-three-soba-modifiers.mjs +5 -0
- package/esm2022/modifiers/curve-modifier/curve-modifier.mjs +64 -0
- package/esm2022/modifiers/index.mjs +2 -0
- package/esm2022/performances/adaptive-dpr/adaptive-dpr.mjs +44 -0
- package/esm2022/performances/adaptive-events/adaptive-events.mjs +27 -0
- package/esm2022/performances/angular-three-soba-performances.mjs +5 -0
- package/esm2022/performances/index.mjs +8 -0
- package/esm2022/performances/instances/instances.mjs +220 -0
- package/esm2022/performances/instances/position-mesh.mjs +52 -0
- package/esm2022/performances/points/points-input.mjs +64 -0
- package/esm2022/performances/points/points.mjs +326 -0
- package/esm2022/performances/points/position-point.mjs +54 -0
- package/esm2022/performances/segments/segment-object.mjs +9 -0
- package/esm2022/performances/segments/segments.mjs +182 -0
- package/esm2022/shaders/blur-pass/blur-pass.mjs +2 -2
- package/esm2022/shaders/caustics/caustics-material.mjs +130 -0
- package/esm2022/shaders/caustics/caustics-projection-material.mjs +31 -0
- package/esm2022/shaders/convolution-material/convolution-material.mjs +1 -1
- package/esm2022/shaders/discard-material/discard-material.mjs +1 -1
- package/esm2022/shaders/grid-material/grid-material.mjs +77 -0
- package/esm2022/shaders/index.mjs +6 -3
- package/esm2022/shaders/mesh-distort-material/mesh-distort-material.mjs +42 -41
- package/esm2022/shaders/mesh-reflector-material/mesh-reflector-material.mjs +2 -2
- package/esm2022/shaders/mesh-refraction-material/mesh-refraction-material.mjs +2 -2
- package/esm2022/shaders/mesh-transmission-material/mesh-transmission-material.mjs +4 -4
- package/esm2022/shaders/mesh-wobble-material/mesh-wobble-material.mjs +1 -1
- package/esm2022/shaders/shader-material/shader-material.mjs +1 -1
- package/esm2022/shaders/soft-shadow-material/soft-shadow-material.mjs +17 -25
- package/esm2022/shaders/sparkles-material/sparkles-material.mjs +32 -46
- package/esm2022/shaders/spot-light-material/spot-light-material.mjs +7 -7
- package/esm2022/shaders/star-field-material/star-field-material.mjs +3 -2
- package/esm2022/shaders/wireframe-material/wireframe-material.mjs +247 -0
- package/esm2022/staging/accumulative-shadows/accumulative-shadows.mjs +160 -176
- package/esm2022/staging/accumulative-shadows/progressive-light-map.mjs +1 -1
- package/esm2022/staging/accumulative-shadows/randomized-lights.mjs +126 -128
- package/esm2022/staging/backdrop/backdrop.mjs +77 -0
- package/esm2022/staging/bb-anchor/bb-anchor.mjs +69 -0
- package/esm2022/staging/bounds/bounds.mjs +144 -143
- package/esm2022/staging/camera-shake/camera-shake.mjs +86 -80
- package/esm2022/staging/center/center.mjs +129 -112
- package/esm2022/staging/cloud/cloud.mjs +118 -124
- package/esm2022/staging/contact-shadows/contact-shadows.mjs +131 -134
- package/esm2022/staging/environment/assets.mjs +12 -12
- package/esm2022/staging/environment/environment-cube.mjs +28 -30
- package/esm2022/staging/environment/environment-ground.mjs +17 -19
- package/esm2022/staging/environment/environment-input.mjs +98 -85
- package/esm2022/staging/environment/environment-map.mjs +33 -33
- package/esm2022/staging/environment/environment-portal.mjs +75 -97
- package/esm2022/staging/environment/environment.mjs +34 -51
- package/esm2022/staging/environment/utils.mjs +37 -15
- package/esm2022/staging/float/float.mjs +70 -58
- package/esm2022/staging/index.mjs +7 -3
- package/esm2022/staging/matcap-texture/matcap-texture.mjs +64 -0
- package/esm2022/staging/normal-texture/normal-texture.mjs +53 -0
- package/esm2022/staging/sky/sky.mjs +85 -80
- package/esm2022/staging/sparkles/sparkles.mjs +108 -105
- package/esm2022/staging/spot-light/shadow-mesh-input.mjs +63 -0
- package/esm2022/staging/spot-light/shadow-mesh.mjs +266 -0
- package/esm2022/staging/spot-light/spot-light-input.mjs +67 -58
- package/esm2022/staging/spot-light/spot-light.mjs +51 -64
- package/esm2022/staging/spot-light/volumetric-mesh.mjs +67 -70
- package/esm2022/staging/stage/stage.mjs +305 -290
- package/esm2022/staging/stars/stars.mjs +101 -102
- package/esm2022/staging/wireframe/wireframe-input.mjs +191 -0
- package/esm2022/staging/wireframe/wireframe.mjs +228 -0
- package/esm2022/utils/angular-three-soba-utils.mjs +5 -0
- package/esm2022/utils/content/content.mjs +15 -0
- package/esm2022/utils/index.mjs +2 -0
- package/fesm2022/angular-three-soba-abstractions.mjs +514 -1947
- package/fesm2022/angular-three-soba-abstractions.mjs.map +1 -1
- package/fesm2022/angular-three-soba-cameras.mjs +302 -259
- package/fesm2022/angular-three-soba-cameras.mjs.map +1 -1
- package/fesm2022/angular-three-soba-controls.mjs +104 -83
- package/fesm2022/angular-three-soba-controls.mjs.map +1 -1
- package/fesm2022/angular-three-soba-gizmos.mjs +1043 -0
- package/fesm2022/angular-three-soba-gizmos.mjs.map +1 -0
- package/fesm2022/angular-three-soba-loaders.mjs +121 -117
- package/fesm2022/angular-three-soba-loaders.mjs.map +1 -1
- package/fesm2022/angular-three-soba-materials.mjs +662 -592
- package/fesm2022/angular-three-soba-materials.mjs.map +1 -1
- package/fesm2022/angular-three-soba-misc.mjs +2214 -105
- package/fesm2022/angular-three-soba-misc.mjs.map +1 -1
- package/fesm2022/angular-three-soba-modifiers.mjs +71 -0
- package/fesm2022/angular-three-soba-modifiers.mjs.map +1 -0
- package/fesm2022/angular-three-soba-performances.mjs +956 -0
- package/fesm2022/angular-three-soba-performances.mjs.map +1 -0
- package/fesm2022/angular-three-soba-shaders.mjs +549 -252
- package/fesm2022/angular-three-soba-shaders.mjs.map +1 -1
- package/fesm2022/angular-three-soba-staging.mjs +2899 -2563
- package/fesm2022/angular-three-soba-staging.mjs.map +1 -1
- package/fesm2022/angular-three-soba-utils.mjs +22 -0
- package/fesm2022/angular-three-soba-utils.mjs.map +1 -0
- package/gizmos/README.md +3 -0
- package/gizmos/gizmo-helper/gizmo-helper.d.ts +69 -0
- package/gizmos/gizmo-helper/gizmo-viewcube/gizmo-viewcube-edge.d.ts +22 -0
- package/gizmos/gizmo-helper/gizmo-viewcube/gizmo-viewcube-face.d.ts +29 -0
- package/gizmos/gizmo-helper/gizmo-viewcube/gizmo-viewcube-input.d.ts +33 -0
- package/gizmos/gizmo-helper/gizmo-viewcube/gizmo-viewcube.d.ts +10 -0
- package/gizmos/gizmo-helper/gizmo-viewport/gizmo-viewport-axis.d.ts +40 -0
- package/gizmos/gizmo-helper/gizmo-viewport/gizmo-viewport.d.ts +30 -0
- package/gizmos/index.d.ts +3 -0
- package/loaders/gltf-loader/gltf-loader.d.ts +4 -3
- package/loaders/loader/loader.d.ts +19 -17
- package/loaders/progress/progress.d.ts +1 -1
- package/loaders/texture-loader/texture-loader.d.ts +2 -2
- package/materials/index.d.ts +1 -0
- package/materials/mesh-distort-material/mesh-distort-material.d.ts +25 -15
- package/materials/mesh-reflector-material/mesh-reflector-material.d.ts +74 -56
- package/materials/mesh-refraction-material/mesh-refraction-material.d.ts +33 -21
- package/materials/mesh-transmission-material/mesh-transmission-material.d.ts +55 -39
- package/materials/mesh-wobble-material/mesh-wobble-material.d.ts +19 -10
- package/materials/point-material/point-material.d.ts +24 -0
- package/metadata.json +1 -0
- package/misc/animations/animations.d.ts +6 -4
- package/misc/caustics/caustics.d.ts +87 -0
- package/misc/decal/decal.d.ts +49 -0
- package/misc/depth-buffer/depth-buffer.d.ts +2 -2
- package/misc/example/example.d.ts +81 -0
- package/misc/fbo/fbo.d.ts +2 -2
- package/misc/html/html-wrapper.d.ts +559 -0
- package/misc/html/html.d.ts +214 -0
- package/misc/index.d.ts +9 -0
- package/misc/sampler/sampler.d.ts +67 -0
- package/misc/shadow/shadow.d.ts +37 -0
- package/misc/stats-gl/stats-gl.d.ts +24 -0
- package/misc/trail/trail.d.ts +57 -0
- package/misc/trail-texture/inject-trail-texture.d.ts +9 -0
- package/misc/trail-texture/trail-texture.d.ts +50 -0
- package/modifiers/README.md +3 -0
- package/modifiers/curve-modifier/curve-modifier.d.ts +23 -0
- package/modifiers/index.d.ts +1 -0
- package/package.json +31 -16
- package/performances/README.md +3 -0
- package/performances/adaptive-dpr/adaptive-dpr.d.ts +14 -0
- package/{performance/adaptive → performances/adaptive-events}/adaptive-events.d.ts +3 -0
- package/performances/index.d.ts +7 -0
- package/performances/instances/instances.d.ts +79 -0
- package/{performance → performances}/instances/position-mesh.d.ts +1 -1
- package/performances/points/points-input.d.ts +32 -0
- package/performances/points/points.d.ts +92 -0
- package/performances/points/position-point.d.ts +11 -0
- package/performances/segments/segment-object.d.ts +7 -0
- package/performances/segments/segments.d.ts +124 -0
- package/shaders/grid-material/grid-material.d.ts +37 -0
- package/shaders/index.d.ts +5 -2
- package/shaders/mesh-distort-material/mesh-distort-material.d.ts +147 -2
- package/shaders/mesh-transmission-material/mesh-transmission-material.d.ts +1 -1
- package/shaders/shader-material/shader-material.d.ts +2 -2
- package/shaders/soft-shadow-material/soft-shadow-material.d.ts +10 -1
- package/shaders/sparkles-material/sparkles-material.d.ts +15 -1
- package/shaders/spot-light-material/spot-light-material.d.ts +11 -2
- package/shaders/star-field-material/star-field-material.d.ts +11 -1
- package/shaders/wireframe-material/wireframe-material.d.ts +58 -0
- package/staging/accumulative-shadows/accumulative-shadows.d.ts +89 -39
- package/staging/accumulative-shadows/randomized-lights.d.ts +40 -27
- package/staging/backdrop/backdrop.d.ts +30 -0
- package/staging/bb-anchor/bb-anchor.d.ts +27 -0
- package/staging/bounds/bounds.d.ts +100 -24
- package/staging/camera-shake/camera-shake.d.ts +30 -19
- package/staging/center/center.d.ts +43 -35
- package/staging/cloud/cloud.d.ts +26 -23
- package/staging/contact-shadows/contact-shadows.d.ts +41 -28
- package/staging/environment/assets.d.ts +9 -9
- package/staging/environment/environment-cube.d.ts +9 -5
- package/staging/environment/environment-ground.d.ts +7 -7
- package/staging/environment/environment-input.d.ts +37 -37
- package/staging/environment/environment-map.d.ts +10 -5
- package/staging/environment/environment-portal.d.ts +10 -5
- package/staging/environment/environment.d.ts +0 -4
- package/staging/environment/utils.d.ts +2 -2
- package/staging/float/float.d.ts +14 -10
- package/staging/index.d.ts +6 -2
- package/staging/matcap-texture/matcap-texture.d.ts +13 -0
- package/staging/normal-texture/normal-texture.d.ts +16 -0
- package/staging/sky/sky.d.ts +28 -21
- package/staging/sparkles/sparkles.d.ts +36 -22
- package/staging/spot-light/shadow-mesh-input.d.ts +29 -0
- package/staging/spot-light/shadow-mesh.d.ts +37 -0
- package/staging/spot-light/spot-light-input.d.ts +25 -25
- package/staging/spot-light/spot-light.d.ts +31 -15
- package/staging/spot-light/volumetric-mesh.d.ts +15 -9
- package/staging/stage/stage.d.ts +89 -65
- package/staging/stars/stars.d.ts +28 -17
- package/staging/wireframe/wireframe-input.d.ts +65 -0
- package/staging/wireframe/wireframe.d.ts +28 -0
- package/utils/README.md +3 -0
- package/utils/content/content.d.ts +8 -0
- package/utils/index.d.ts +1 -0
- package/web-types.json +1 -0
- package/abstractions/catmull-rom-line/catmull-rom-line.d.ts +0 -25
- package/abstractions/cubic-bezier-line/cubic-bezier-line.d.ts +0 -25
- package/abstractions/gizmo-helper/gizmo-helper.d.ts +0 -34
- package/abstractions/gizmo-helper/gizmo-viewcube/gizmo-viewcube-edge.d.ts +0 -22
- package/abstractions/gizmo-helper/gizmo-viewcube/gizmo-viewcube-face.d.ts +0 -30
- package/abstractions/gizmo-helper/gizmo-viewcube/gizmo-viewcube-inputs.d.ts +0 -32
- package/abstractions/gizmo-helper/gizmo-viewcube/gizmo-viewcube.d.ts +0 -14
- package/abstractions/gizmo-helper/gizmo-viewport/gizmo-viewport-axis.d.ts +0 -47
- package/abstractions/gizmo-helper/gizmo-viewport/gizmo-viewport.d.ts +0 -40
- package/abstractions/line/line-input.d.ts +0 -42
- package/abstractions/line/line.d.ts +0 -35
- package/abstractions/quadratic-bezier-line/quadratic-bezier-line.d.ts +0 -23
- package/esm2022/abstractions/catmull-rom-line/catmull-rom-line.mjs +0 -131
- package/esm2022/abstractions/cubic-bezier-line/cubic-bezier-line.mjs +0 -113
- package/esm2022/abstractions/gizmo-helper/gizmo-helper.mjs +0 -210
- package/esm2022/abstractions/gizmo-helper/gizmo-viewcube/constants.mjs +0 -31
- package/esm2022/abstractions/gizmo-helper/gizmo-viewcube/gizmo-viewcube-edge.mjs +0 -95
- package/esm2022/abstractions/gizmo-helper/gizmo-viewcube/gizmo-viewcube-face.mjs +0 -155
- package/esm2022/abstractions/gizmo-helper/gizmo-viewcube/gizmo-viewcube-inputs.mjs +0 -62
- package/esm2022/abstractions/gizmo-helper/gizmo-viewcube/gizmo-viewcube.mjs +0 -80
- package/esm2022/abstractions/gizmo-helper/gizmo-viewport/gizmo-viewport-axis.mjs +0 -206
- package/esm2022/abstractions/gizmo-helper/gizmo-viewport/gizmo-viewport.mjs +0 -273
- package/esm2022/abstractions/line/line-input.mjs +0 -113
- package/esm2022/abstractions/line/line.mjs +0 -165
- package/esm2022/abstractions/quadratic-bezier-line/quadratic-bezier-line.mjs +0 -128
- package/esm2022/performance/adaptive/adaptive-dpr.mjs +0 -46
- package/esm2022/performance/adaptive/adaptive-events.mjs +0 -31
- package/esm2022/performance/angular-three-soba-performance.mjs +0 -5
- package/esm2022/performance/detailed/detailed.mjs +0 -61
- package/esm2022/performance/index.mjs +0 -7
- package/esm2022/performance/instances/instance.mjs +0 -48
- package/esm2022/performance/instances/instances.mjs +0 -189
- package/esm2022/performance/instances/position-mesh.mjs +0 -52
- package/esm2022/performance/stats/stats.mjs +0 -79
- package/esm2022/shaders/caustics-material/caustics-material.mjs +0 -128
- package/esm2022/shaders/caustics-material/caustics-projection-material.mjs +0 -33
- package/esm2022/staging/caustics/caustisc.mjs +0 -384
- package/esm2022/staging/spot-light/spot-light-shadow-mesh-input.mjs +0 -57
- package/esm2022/staging/spot-light/spot-light-shadow-mesh.mjs +0 -256
- package/fesm2022/angular-three-soba-performance.mjs +0 -487
- package/fesm2022/angular-three-soba-performance.mjs.map +0 -1
- package/performance/README.md +0 -3
- package/performance/adaptive/adaptive-dpr.d.ts +0 -8
- package/performance/detailed/detailed.d.ts +0 -20
- package/performance/index.d.ts +0 -6
- package/performance/instances/instance.d.ts +0 -9
- package/performance/instances/instances.d.ts +0 -35
- package/performance/stats/stats.d.ts +0 -18
- package/plugin/generators.json +0 -19
- package/plugin/libs/plugin/README.md +0 -11
- package/plugin/package.json +0 -9
- package/plugin/src/generators/init/compat.d.ts +0 -2
- package/plugin/src/generators/init/compat.js +0 -6
- package/plugin/src/generators/init/compat.js.map +0 -1
- package/plugin/src/generators/init/init.d.ts +0 -4
- package/plugin/src/generators/init/init.js +0 -22
- package/plugin/src/generators/init/init.js.map +0 -1
- package/plugin/src/generators/init/schema.json +0 -6
- package/plugin/src/index.d.ts +0 -1
- package/plugin/src/index.js +0 -6
- package/plugin/src/index.js.map +0 -1
- package/staging/caustics/caustisc.d.ts +0 -70
- package/staging/spot-light/spot-light-shadow-mesh-input.d.ts +0 -29
- package/staging/spot-light/spot-light-shadow-mesh.d.ts +0 -38
- /package/{abstractions → gizmos}/gizmo-helper/gizmo-viewcube/constants.d.ts +0 -0
- /package/shaders/{caustics-material → caustics}/caustics-material.d.ts +0 -0
- /package/shaders/{caustics-material → caustics}/caustics-projection-material.d.ts +0 -0
|
@@ -0,0 +1,478 @@
|
|
|
1
|
+
var _a;
|
|
2
|
+
import { DOCUMENT, NgTemplateOutlet } from '@angular/common';
|
|
3
|
+
import { Component, ElementRef, EmbeddedViewRef, TemplateRef, ViewChild, ViewContainerRef, computed, effect, inject, untracked, } from '@angular/core';
|
|
4
|
+
import { HTML, injectBeforeRender, injectNgtStore, is, safeDetectChanges } from 'angular-three';
|
|
5
|
+
import * as THREE from 'three';
|
|
6
|
+
import { injectNgtsHtmlInputs } from './html';
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
const v1 = new THREE.Vector3();
|
|
9
|
+
const v2 = new THREE.Vector3();
|
|
10
|
+
const v3 = new THREE.Vector3();
|
|
11
|
+
export function defaultCalculatePosition(el, camera, size) {
|
|
12
|
+
const objectPos = v1.setFromMatrixPosition(el.matrixWorld);
|
|
13
|
+
objectPos.project(camera);
|
|
14
|
+
const widthHalf = size.width / 2;
|
|
15
|
+
const heightHalf = size.height / 2;
|
|
16
|
+
return [objectPos.x * widthHalf + widthHalf, -(objectPos.y * heightHalf) + heightHalf];
|
|
17
|
+
}
|
|
18
|
+
function isObjectBehindCamera(el, camera) {
|
|
19
|
+
const objectPos = v1.setFromMatrixPosition(el.matrixWorld);
|
|
20
|
+
const cameraPos = v2.setFromMatrixPosition(camera.matrixWorld);
|
|
21
|
+
const deltaCamObj = objectPos.sub(cameraPos);
|
|
22
|
+
const camDir = camera.getWorldDirection(v3);
|
|
23
|
+
return deltaCamObj.angleTo(camDir) > Math.PI / 2;
|
|
24
|
+
}
|
|
25
|
+
function isObjectVisible(el, camera, raycaster, occlude) {
|
|
26
|
+
const elPos = v1.setFromMatrixPosition(el.matrixWorld);
|
|
27
|
+
const screenPos = elPos.clone();
|
|
28
|
+
screenPos.project(camera);
|
|
29
|
+
raycaster.setFromCamera(screenPos, camera);
|
|
30
|
+
const intersects = raycaster.intersectObjects(occlude, true);
|
|
31
|
+
if (intersects.length) {
|
|
32
|
+
const intersectionDistance = intersects[0].distance;
|
|
33
|
+
const pointDistance = elPos.distanceTo(raycaster.ray.origin);
|
|
34
|
+
return pointDistance < intersectionDistance;
|
|
35
|
+
}
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
function objectScale(el, camera) {
|
|
39
|
+
if (camera instanceof THREE.OrthographicCamera) {
|
|
40
|
+
return camera.zoom;
|
|
41
|
+
}
|
|
42
|
+
else if (camera instanceof THREE.PerspectiveCamera) {
|
|
43
|
+
const objectPos = v1.setFromMatrixPosition(el.matrixWorld);
|
|
44
|
+
const cameraPos = v2.setFromMatrixPosition(camera.matrixWorld);
|
|
45
|
+
const vFOV = (camera.fov * Math.PI) / 180;
|
|
46
|
+
const dist = objectPos.distanceTo(cameraPos);
|
|
47
|
+
const scaleFOV = 2 * Math.tan(vFOV / 2) * dist;
|
|
48
|
+
return 1 / scaleFOV;
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
return 1;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
function objectZIndex(el, camera, zIndexRange) {
|
|
55
|
+
if (camera instanceof THREE.PerspectiveCamera || camera instanceof THREE.OrthographicCamera) {
|
|
56
|
+
const objectPos = v1.setFromMatrixPosition(el.matrixWorld);
|
|
57
|
+
const cameraPos = v2.setFromMatrixPosition(camera.matrixWorld);
|
|
58
|
+
const dist = objectPos.distanceTo(cameraPos);
|
|
59
|
+
const A = (zIndexRange[1] - zIndexRange[0]) / (camera.far - camera.near);
|
|
60
|
+
const B = zIndexRange[1] - A * camera.far;
|
|
61
|
+
return Math.round(A * dist + B);
|
|
62
|
+
}
|
|
63
|
+
return undefined;
|
|
64
|
+
}
|
|
65
|
+
const epsilon = (value) => (Math.abs(value) < 1e-10 ? 0 : value);
|
|
66
|
+
function getCSSMatrix(matrix, multipliers, prepend = '') {
|
|
67
|
+
let matrix3d = 'matrix3d(';
|
|
68
|
+
for (let i = 0; i !== 16; i++) {
|
|
69
|
+
matrix3d += epsilon(multipliers[i] * matrix.elements[i]) + (i !== 15 ? ',' : ')');
|
|
70
|
+
}
|
|
71
|
+
return prepend + matrix3d;
|
|
72
|
+
}
|
|
73
|
+
const getCameraCSSMatrix = ((multipliers) => {
|
|
74
|
+
return (matrix) => getCSSMatrix(matrix, multipliers);
|
|
75
|
+
})([1, -1, 1, 1, 1, -1, 1, 1, 1, -1, 1, 1, 1, -1, 1, 1]);
|
|
76
|
+
const getObjectCSSMatrix = ((scaleMultipliers) => {
|
|
77
|
+
return (matrix, factor) => getCSSMatrix(matrix, scaleMultipliers(factor), 'translate(-50%,-50%)');
|
|
78
|
+
})((f) => [1 / f, 1 / f, 1 / f, 1, -1 / f, -1 / f, -1 / f, -1, 1 / f, 1 / f, 1 / f, 1, 1, 1, 1, 1]);
|
|
79
|
+
export class NgtsHtmlWrapper {
|
|
80
|
+
static { _a = HTML; }
|
|
81
|
+
static { this[_a] = true; }
|
|
82
|
+
constructor() {
|
|
83
|
+
this.htmlInputs = injectNgtsHtmlInputs();
|
|
84
|
+
this.store = injectNgtStore();
|
|
85
|
+
this.gl = this.store.select('gl');
|
|
86
|
+
this.connected = this.store.select('events', 'connected', { equal: Object.is });
|
|
87
|
+
this.viewport = this.store.select('viewport');
|
|
88
|
+
this.scene = this.store.select('scene');
|
|
89
|
+
this.camera = this.store.select('camera');
|
|
90
|
+
this.size = this.store.select('size');
|
|
91
|
+
this.raycaster = this.store.select('raycaster');
|
|
92
|
+
this.isMeshSizeSet = false;
|
|
93
|
+
this.document = inject(DOCUMENT);
|
|
94
|
+
this.vcr = inject(ViewContainerRef);
|
|
95
|
+
this.portalElement = computed(() => {
|
|
96
|
+
const portal = this.htmlInputs.portal();
|
|
97
|
+
if (!portal)
|
|
98
|
+
return null;
|
|
99
|
+
return is.ref(portal) ? portal.nativeElement : portal;
|
|
100
|
+
});
|
|
101
|
+
this.element = computed(() => this.document.createElement(this.htmlInputs.as()));
|
|
102
|
+
this.target = computed(() => {
|
|
103
|
+
const portalElement = this.portalElement();
|
|
104
|
+
if (portalElement)
|
|
105
|
+
return portalElement;
|
|
106
|
+
const connected = this.connected();
|
|
107
|
+
if (connected)
|
|
108
|
+
return connected;
|
|
109
|
+
return this.gl().domElement.parentElement;
|
|
110
|
+
});
|
|
111
|
+
this.styles = computed(() => {
|
|
112
|
+
const [style, center, transform, size, fullscreen] = [
|
|
113
|
+
this.htmlInputs.style(),
|
|
114
|
+
this.htmlInputs.center(),
|
|
115
|
+
this.htmlInputs.transform(),
|
|
116
|
+
this.size(),
|
|
117
|
+
this.htmlInputs.fullscreen(),
|
|
118
|
+
];
|
|
119
|
+
if (transform) {
|
|
120
|
+
return {
|
|
121
|
+
position: 'absolute',
|
|
122
|
+
top: 0,
|
|
123
|
+
left: 0,
|
|
124
|
+
width: size.width,
|
|
125
|
+
height: size.height,
|
|
126
|
+
transformStyle: 'preserve-3d',
|
|
127
|
+
pointerEvents: 'none',
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
return {
|
|
131
|
+
position: 'absolute',
|
|
132
|
+
transform: center ? 'translate3d(-50%,-50%,0)' : 'none',
|
|
133
|
+
...(fullscreen && {
|
|
134
|
+
top: -size.height / 2,
|
|
135
|
+
left: -size.width / 2,
|
|
136
|
+
width: size.width,
|
|
137
|
+
height: size.height,
|
|
138
|
+
}),
|
|
139
|
+
...(style || {}),
|
|
140
|
+
};
|
|
141
|
+
});
|
|
142
|
+
this.transformInnerStyles = computed(() => ({ position: 'absolute', pointerEvents: this.htmlInputs.pointerEvents() }));
|
|
143
|
+
this.setCanvasElementStyle();
|
|
144
|
+
this.appendElement();
|
|
145
|
+
this.setWrapperClass();
|
|
146
|
+
this.render();
|
|
147
|
+
this.beforeRender();
|
|
148
|
+
}
|
|
149
|
+
setCanvasElementStyle() {
|
|
150
|
+
effect(() => {
|
|
151
|
+
const el = untracked(this.gl).domElement;
|
|
152
|
+
const occlude = this.htmlInputs.occlude();
|
|
153
|
+
if (occlude && occlude === 'blending') {
|
|
154
|
+
el.style.zIndex = `${Math.floor(untracked(this.htmlInputs.zIndexRange)[0] / 2)}`;
|
|
155
|
+
el.style.position = 'absolute';
|
|
156
|
+
el.style.pointerEvents = 'none';
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
el.style.zIndex = null;
|
|
160
|
+
el.style.position = null;
|
|
161
|
+
el.style.pointerEvents = null;
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
appendElement() {
|
|
166
|
+
effect((onCleanup) => {
|
|
167
|
+
const [group, element] = [this.htmlInputs.groupRef.nativeElement, this.element()];
|
|
168
|
+
if (group && element) {
|
|
169
|
+
const [target, transform, scene, camera, size, calculatePosition, prepend] = [
|
|
170
|
+
this.target(),
|
|
171
|
+
this.htmlInputs.transform(),
|
|
172
|
+
untracked(this.scene),
|
|
173
|
+
untracked(this.camera),
|
|
174
|
+
untracked(this.size),
|
|
175
|
+
untracked(this.htmlInputs.calculatePosition),
|
|
176
|
+
untracked(this.htmlInputs.prepend),
|
|
177
|
+
];
|
|
178
|
+
scene.updateMatrixWorld();
|
|
179
|
+
if (transform) {
|
|
180
|
+
element.style.cssText = `position:absolute;top:0;left:0;pointer-events:none;overflow:hidden;`;
|
|
181
|
+
}
|
|
182
|
+
else {
|
|
183
|
+
const vec = calculatePosition(group, camera, size);
|
|
184
|
+
element.style.cssText = `position:absolute;top:0;left:0;transform:translate3d(${vec[0]}px,${vec[1]}px,0);transform-origin:0 0;`;
|
|
185
|
+
}
|
|
186
|
+
if (target) {
|
|
187
|
+
if (prepend)
|
|
188
|
+
target.prepend(element);
|
|
189
|
+
else
|
|
190
|
+
target.appendChild(element);
|
|
191
|
+
}
|
|
192
|
+
onCleanup(() => {
|
|
193
|
+
if (target)
|
|
194
|
+
target.removeChild(element);
|
|
195
|
+
this.vcr.clear();
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
setWrapperClass() {
|
|
201
|
+
effect(() => {
|
|
202
|
+
const [element, wrapperClass] = [this.element(), this.htmlInputs.wrapperClass()];
|
|
203
|
+
if (element && wrapperClass) {
|
|
204
|
+
element.className = wrapperClass;
|
|
205
|
+
}
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
render() {
|
|
209
|
+
effect((onCleanup) => {
|
|
210
|
+
const [{ transform }, element, content] = [
|
|
211
|
+
this.htmlInputs.state(),
|
|
212
|
+
this.element(),
|
|
213
|
+
this.htmlInputs.content(),
|
|
214
|
+
];
|
|
215
|
+
if (element) {
|
|
216
|
+
this.isMeshSizeSet = false;
|
|
217
|
+
const params = transform
|
|
218
|
+
? [this.transformTemplate, {}]
|
|
219
|
+
: [this.renderTemplate, { styles: this.styles }];
|
|
220
|
+
const ref = this.vcr.createEmbeddedView(...params);
|
|
221
|
+
if (ref.rootNodes?.[0]) {
|
|
222
|
+
if (element.hasChildNodes()) {
|
|
223
|
+
element.replaceChildren(...ref.rootNodes);
|
|
224
|
+
}
|
|
225
|
+
else {
|
|
226
|
+
element.append(...ref.rootNodes);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
safeDetectChanges(ref);
|
|
230
|
+
let contentRef;
|
|
231
|
+
let contentParent;
|
|
232
|
+
/**
|
|
233
|
+
* NOTE: utilizing rAF here so that renderAnchor (ViewContainerRef) has a chance to be resolved
|
|
234
|
+
* TODO: Another approach is to call render() in ngOnInit and pass in an injector to the effect
|
|
235
|
+
*/
|
|
236
|
+
const rAF = requestAnimationFrame(() => {
|
|
237
|
+
if (content && this.renderAnchor) {
|
|
238
|
+
contentRef = this.renderAnchor.createEmbeddedView(content);
|
|
239
|
+
contentParent = ref.rootNodes[0].lastElementChild || ref.rootNodes[0];
|
|
240
|
+
while (contentParent && contentParent.lastElementChild) {
|
|
241
|
+
contentParent = contentParent.lastElementChild;
|
|
242
|
+
}
|
|
243
|
+
if (contentRef.rootNodes?.[0]) {
|
|
244
|
+
if (contentParent.hasChildNodes()) {
|
|
245
|
+
contentParent.replaceChildren(...contentRef.rootNodes);
|
|
246
|
+
}
|
|
247
|
+
else {
|
|
248
|
+
contentParent.append(...contentRef.rootNodes);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
safeDetectChanges(contentRef);
|
|
252
|
+
}
|
|
253
|
+
});
|
|
254
|
+
onCleanup(() => {
|
|
255
|
+
cancelAnimationFrame(rAF);
|
|
256
|
+
if (contentRef && contentParent) {
|
|
257
|
+
contentRef.rootNodes.forEach((node) => {
|
|
258
|
+
if (contentParent.hasChildNodes()) {
|
|
259
|
+
contentParent.removeChild(node);
|
|
260
|
+
}
|
|
261
|
+
node.remove();
|
|
262
|
+
});
|
|
263
|
+
contentRef.destroy();
|
|
264
|
+
}
|
|
265
|
+
ref.rootNodes.forEach((node) => {
|
|
266
|
+
if (element.hasChildNodes()) {
|
|
267
|
+
element.removeChild(node);
|
|
268
|
+
}
|
|
269
|
+
node.remove();
|
|
270
|
+
});
|
|
271
|
+
ref.destroy();
|
|
272
|
+
this.renderAnchor?.clear();
|
|
273
|
+
this.vcr.clear();
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
beforeRender() {
|
|
279
|
+
let oldPosition = [0, 0];
|
|
280
|
+
let oldZoom = 0;
|
|
281
|
+
let visible = true;
|
|
282
|
+
injectBeforeRender((gl) => {
|
|
283
|
+
const [group, camera, transform, calculatePosition, size, eps, isRayCastOcclusion, occlude, scene, raycaster, element, zIndexRange, sprite, distanceFactor, occlusionMeshRef, geometry, viewport, scale,] = [
|
|
284
|
+
this.htmlInputs.groupRef.nativeElement,
|
|
285
|
+
this.camera(),
|
|
286
|
+
this.htmlInputs.transform(),
|
|
287
|
+
this.htmlInputs.calculatePosition(),
|
|
288
|
+
this.size(),
|
|
289
|
+
this.htmlInputs.eps(),
|
|
290
|
+
this.htmlInputs.isRayCastOcclusion(),
|
|
291
|
+
this.htmlInputs.occlude(),
|
|
292
|
+
this.scene(),
|
|
293
|
+
this.raycaster(),
|
|
294
|
+
this.element(),
|
|
295
|
+
this.htmlInputs.zIndexRange(),
|
|
296
|
+
this.htmlInputs.sprite(),
|
|
297
|
+
this.htmlInputs.distanceFactor(),
|
|
298
|
+
this.htmlInputs.occlusionMeshRef.nativeElement,
|
|
299
|
+
this.htmlInputs.geometry(),
|
|
300
|
+
this.viewport(),
|
|
301
|
+
this.htmlInputs.scale(),
|
|
302
|
+
];
|
|
303
|
+
if (group && element) {
|
|
304
|
+
camera.updateMatrixWorld();
|
|
305
|
+
group.updateWorldMatrix(true, false);
|
|
306
|
+
const vec = transform ? oldPosition : calculatePosition(group, camera, size);
|
|
307
|
+
if (transform ||
|
|
308
|
+
Math.abs(oldZoom - camera.zoom) > eps ||
|
|
309
|
+
Math.abs(oldPosition[0] - vec[0]) > eps ||
|
|
310
|
+
Math.abs(oldPosition[1] - vec[1]) > eps) {
|
|
311
|
+
const isBehindCamera = isObjectBehindCamera(group, camera);
|
|
312
|
+
let raytraceTarget = false;
|
|
313
|
+
if (isRayCastOcclusion) {
|
|
314
|
+
if (Array.isArray(occlude)) {
|
|
315
|
+
raytraceTarget = occlude.map((item) => (is.ref(item) ? item.nativeElement : item));
|
|
316
|
+
}
|
|
317
|
+
else if (occlude !== 'blending') {
|
|
318
|
+
raytraceTarget = [scene];
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
const previouslyVisible = visible;
|
|
322
|
+
if (raytraceTarget) {
|
|
323
|
+
const isVisible = isObjectVisible(group, camera, raycaster, raytraceTarget);
|
|
324
|
+
visible = isVisible && !isBehindCamera;
|
|
325
|
+
}
|
|
326
|
+
else {
|
|
327
|
+
visible = !isBehindCamera;
|
|
328
|
+
}
|
|
329
|
+
if (previouslyVisible !== visible) {
|
|
330
|
+
if (this.htmlInputs.occluded.observed) {
|
|
331
|
+
this.htmlInputs.occluded.emit(!visible);
|
|
332
|
+
}
|
|
333
|
+
else {
|
|
334
|
+
element.style.display = visible ? 'block' : 'none';
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
const halfRange = Math.floor(zIndexRange[0] / 2);
|
|
338
|
+
const zRange = occlude
|
|
339
|
+
? isRayCastOcclusion //
|
|
340
|
+
? [zIndexRange[0], halfRange]
|
|
341
|
+
: [halfRange - 1, 0]
|
|
342
|
+
: zIndexRange;
|
|
343
|
+
element.style.zIndex = `${objectZIndex(group, camera, zRange)}`;
|
|
344
|
+
if (transform) {
|
|
345
|
+
const [widthHalf, heightHalf] = [size.width / 2, size.height / 2];
|
|
346
|
+
const fov = camera.projectionMatrix.elements[5] * heightHalf;
|
|
347
|
+
const { isOrthographicCamera, top, left, bottom, right } = camera;
|
|
348
|
+
const cameraMatrix = getCameraCSSMatrix(camera.matrixWorldInverse);
|
|
349
|
+
const cameraTransform = isOrthographicCamera
|
|
350
|
+
? `scale(${fov})translate(${epsilon(-(right + left) / 2)}px,${epsilon((top + bottom) / 2)}px)`
|
|
351
|
+
: `translateZ(${fov}px)`;
|
|
352
|
+
let matrix = group.matrixWorld;
|
|
353
|
+
if (sprite) {
|
|
354
|
+
matrix = camera.matrixWorldInverse
|
|
355
|
+
.clone()
|
|
356
|
+
.transpose()
|
|
357
|
+
.copyPosition(matrix)
|
|
358
|
+
.scale(group.scale);
|
|
359
|
+
matrix.elements[3] = matrix.elements[7] = matrix.elements[11] = 0;
|
|
360
|
+
matrix.elements[15] = 1;
|
|
361
|
+
}
|
|
362
|
+
element.style.width = size.width + 'px';
|
|
363
|
+
element.style.height = size.height + 'px';
|
|
364
|
+
element.style.perspective = isOrthographicCamera ? '' : `${fov}px`;
|
|
365
|
+
if (this.outerDiv?.nativeElement && this.innerDiv?.nativeElement) {
|
|
366
|
+
this.outerDiv.nativeElement.style.width = size.width + 'px';
|
|
367
|
+
this.outerDiv.nativeElement.style.height = size.height + 'px';
|
|
368
|
+
this.outerDiv.nativeElement.style.transform = `${cameraTransform}${cameraMatrix}translate(${widthHalf}px,${heightHalf}px)`;
|
|
369
|
+
this.innerDiv.nativeElement.style.transform = getObjectCSSMatrix(matrix, 1 / ((distanceFactor || 10) / 400));
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
else {
|
|
373
|
+
const scale = distanceFactor === undefined ? 1 : objectScale(group, camera) * distanceFactor;
|
|
374
|
+
element.style.transform = `translate3d(${vec[0]}px,${vec[1]}px,0) scale(${scale})`;
|
|
375
|
+
}
|
|
376
|
+
oldPosition = vec;
|
|
377
|
+
oldZoom = camera.zoom;
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
if (!isRayCastOcclusion && occlusionMeshRef && !this.isMeshSizeSet) {
|
|
381
|
+
if (transform) {
|
|
382
|
+
if (this.outerDiv?.nativeElement) {
|
|
383
|
+
const el = this.outerDiv.nativeElement.children[0];
|
|
384
|
+
if (el?.clientWidth && el?.clientHeight) {
|
|
385
|
+
const { isOrthographicCamera } = camera;
|
|
386
|
+
if (isOrthographicCamera || geometry) {
|
|
387
|
+
if (scale !== 1) {
|
|
388
|
+
if (!Array.isArray(scale)) {
|
|
389
|
+
occlusionMeshRef.scale.setScalar(1 / scale);
|
|
390
|
+
}
|
|
391
|
+
else if (scale instanceof THREE.Vector3) {
|
|
392
|
+
occlusionMeshRef.scale.copy(scale.clone().divideScalar(1));
|
|
393
|
+
}
|
|
394
|
+
else {
|
|
395
|
+
occlusionMeshRef.scale.set(1 / scale[0], 1 / scale[1], 1 / scale[2]);
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
else {
|
|
400
|
+
const ratio = (distanceFactor || 10) / 400;
|
|
401
|
+
const w = el.clientWidth * ratio;
|
|
402
|
+
const h = el.clientHeight * ratio;
|
|
403
|
+
occlusionMeshRef.scale.set(w, h, 1);
|
|
404
|
+
}
|
|
405
|
+
this.isMeshSizeSet = true;
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
else {
|
|
410
|
+
const ele = element.children[0];
|
|
411
|
+
if (ele?.clientWidth && ele?.clientHeight) {
|
|
412
|
+
const ratio = 1 / viewport.factor;
|
|
413
|
+
const w = ele.clientWidth * ratio;
|
|
414
|
+
const h = ele.clientHeight * ratio;
|
|
415
|
+
occlusionMeshRef.scale.set(w, h, 1);
|
|
416
|
+
this.isMeshSizeSet = true;
|
|
417
|
+
}
|
|
418
|
+
occlusionMeshRef.lookAt(gl.camera.position);
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
});
|
|
422
|
+
}
|
|
423
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.2", ngImport: i0, type: NgtsHtmlWrapper, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
424
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.2", type: NgtsHtmlWrapper, isStandalone: true, selector: "ngts-html-wrapper", viewQueries: [{ propertyName: "transformTemplate", first: true, predicate: ["transformTemplate"], descendants: true, static: true }, { propertyName: "renderTemplate", first: true, predicate: ["renderTemplate"], descendants: true, static: true }, { propertyName: "outerDiv", first: true, predicate: ["transformedOuterDiv"], descendants: true }, { propertyName: "innerDiv", first: true, predicate: ["transformedInnerDiv"], descendants: true }, { propertyName: "renderAnchor", first: true, predicate: ["renderAnchor"], descendants: true, read: ViewContainerRef }], ngImport: i0, template: `
|
|
425
|
+
<ng-template #transformTemplate>
|
|
426
|
+
<div #transformedOuterDiv [style]="styles()">
|
|
427
|
+
<div #transformedInnerDiv [style]="transformInnerStyles()">
|
|
428
|
+
<ng-container *ngTemplateOutlet="renderTemplate; context: { styles: htmlInputs.style }" />
|
|
429
|
+
</div>
|
|
430
|
+
</div>
|
|
431
|
+
</ng-template>
|
|
432
|
+
|
|
433
|
+
<ng-template #renderTemplate let-renderedStyles="styles">
|
|
434
|
+
<div #renderedDiv [class]="htmlInputs.renderedDivClass()" [style]="renderedStyles()">
|
|
435
|
+
<ng-container #renderAnchor />
|
|
436
|
+
</div>
|
|
437
|
+
</ng-template>
|
|
438
|
+
`, isInline: true, dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] }); }
|
|
439
|
+
}
|
|
440
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.2", ngImport: i0, type: NgtsHtmlWrapper, decorators: [{
|
|
441
|
+
type: Component,
|
|
442
|
+
args: [{
|
|
443
|
+
selector: 'ngts-html-wrapper',
|
|
444
|
+
standalone: true,
|
|
445
|
+
template: `
|
|
446
|
+
<ng-template #transformTemplate>
|
|
447
|
+
<div #transformedOuterDiv [style]="styles()">
|
|
448
|
+
<div #transformedInnerDiv [style]="transformInnerStyles()">
|
|
449
|
+
<ng-container *ngTemplateOutlet="renderTemplate; context: { styles: htmlInputs.style }" />
|
|
450
|
+
</div>
|
|
451
|
+
</div>
|
|
452
|
+
</ng-template>
|
|
453
|
+
|
|
454
|
+
<ng-template #renderTemplate let-renderedStyles="styles">
|
|
455
|
+
<div #renderedDiv [class]="htmlInputs.renderedDivClass()" [style]="renderedStyles()">
|
|
456
|
+
<ng-container #renderAnchor />
|
|
457
|
+
</div>
|
|
458
|
+
</ng-template>
|
|
459
|
+
`,
|
|
460
|
+
imports: [NgTemplateOutlet],
|
|
461
|
+
}]
|
|
462
|
+
}], ctorParameters: function () { return []; }, propDecorators: { transformTemplate: [{
|
|
463
|
+
type: ViewChild,
|
|
464
|
+
args: ['transformTemplate', { static: true }]
|
|
465
|
+
}], renderTemplate: [{
|
|
466
|
+
type: ViewChild,
|
|
467
|
+
args: ['renderTemplate', { static: true }]
|
|
468
|
+
}], outerDiv: [{
|
|
469
|
+
type: ViewChild,
|
|
470
|
+
args: ['transformedOuterDiv']
|
|
471
|
+
}], innerDiv: [{
|
|
472
|
+
type: ViewChild,
|
|
473
|
+
args: ['transformedInnerDiv']
|
|
474
|
+
}], renderAnchor: [{
|
|
475
|
+
type: ViewChild,
|
|
476
|
+
args: ['renderAnchor', { read: ViewContainerRef }]
|
|
477
|
+
}] } });
|
|
478
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHRtbC13cmFwcGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9zb2JhL21pc2Mvc3JjL2h0bWwvaHRtbC13cmFwcGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDN0QsT0FBTyxFQUNOLFNBQVMsRUFDVCxVQUFVLEVBQ1YsZUFBZSxFQUNmLFdBQVcsRUFDWCxTQUFTLEVBQ1QsZ0JBQWdCLEVBQ2hCLFFBQVEsRUFDUixNQUFNLEVBQ04sTUFBTSxFQUNOLFNBQVMsR0FDVCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsSUFBSSxFQUFFLGtCQUFrQixFQUFFLGNBQWMsRUFBRSxFQUFFLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEcsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDL0IsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sUUFBUSxDQUFDOztBQUU5QyxNQUFNLEVBQUUsR0FBRyxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztBQUMvQixNQUFNLEVBQUUsR0FBRyxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztBQUMvQixNQUFNLEVBQUUsR0FBRyxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztBQUUvQixNQUFNLFVBQVUsd0JBQXdCLENBQ3ZDLEVBQWtCLEVBQ2xCLE1BQW9CLEVBQ3BCLElBQXVDO0lBRXZDLE1BQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDM0QsU0FBUyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMxQixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztJQUNqQyxNQUFNLFVBQVUsR0FBRyxJQUFJ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LEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFFWCxRQUFRO3NCQUF6QyxTQUFTO3VCQUFDLHFCQUFxQjtnQkFDRSxRQUFRO3NCQUF6QyxTQUFTO3VCQUFDLHFCQUFxQjtnQkFDdUIsWUFBWTtzQkFBbEUsU0FBUzt1QkFBQyxjQUFjLEVBQUUsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBET0NVTUVOVCwgTmdUZW1wbGF0ZU91dGxldCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuXHRDb21wb25lbnQsXG5cdEVsZW1lbnRSZWYsXG5cdEVtYmVkZGVkVmlld1JlZixcblx0VGVtcGxhdGVSZWYsXG5cdFZpZXdDaGlsZCxcblx0Vmlld0NvbnRhaW5lclJlZixcblx0Y29tcHV0ZWQsXG5cdGVmZmVjdCxcblx0aW5qZWN0LFxuXHR1bnRyYWNrZWQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSFRNTCwgaW5qZWN0QmVmb3JlUmVuZGVyLCBpbmplY3ROZ3RTdG9yZSwgaXMsIHNhZmVEZXRlY3RDaGFuZ2VzIH0gZnJvbSAnYW5ndWxhci10aHJlZSc7XG5pbXBvcnQgKiBhcyBUSFJFRSBmcm9tICd0aHJlZSc7XG5pbXBvcnQgeyBpbmplY3ROZ3RzSHRtbElucHV0cyB9IGZyb20gJy4vaHRtbCc7XG5cbmNvbnN0IHYxID0gbmV3IFRIUkVFLlZlY3RvcjMoKTtcbmNvbnN0IHYyID0gbmV3IFRIUkVFLlZlY3RvcjMoKTtcbmNvbnN0IHYzID0gbmV3IFRIUkVFLlZlY3RvcjMoKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGRlZmF1bHRDYWxjdWxhdGVQb3NpdGlvbihcblx0ZWw6IFRIUkVFLk9iamVjdDNELFxuXHRjYW1lcmE6IFRIUkVFLkNhbWVyYSxcblx0c2l6ZTogeyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9LFxuKSB7XG5cdGNvbnN0IG9iamVjdFBvcyA9IHYxLnNldEZyb21NYXRyaXhQb3NpdGlvbihlbC5tYXRyaXhXb3JsZCk7XG5cdG9iamVjdFBvcy5wcm9qZWN0KGNhbWVyYSk7XG5cdGNvbnN0IHdpZHRoSGFsZiA9IHNpemUud2lkdGggLyAyO1xuXHRjb25zdCBoZWlnaHRIYWxmID0gc2l6ZS5oZWlnaHQgLyAyO1xuXHRyZXR1cm4gW29iamVjdFBvcy54ICogd2lkdGhIYWxmICsgd2lkdGhIYWxmLCAtKG9iamVjdFBvcy55ICogaGVpZ2h0SGFsZikgKyBoZWlnaHRIYWxmXTtcbn1cblxuZnVuY3Rpb24gaXNPYmplY3RCZWhpbmRDYW1lcmEoZWw6IFRIUkVFLk9iamVjdDNELCBjYW1lcmE6IFRIUkVFLkNhbWVyYSkge1xuXHRjb25zdCBvYmplY3RQb3MgPSB2MS5zZXRGcm9tTWF0cml4UG9zaXRpb24oZWwubWF0cml4V29ybGQpO1xuXHRjb25zdCBjYW1lcmFQb3MgPSB2Mi5zZXRGcm9tTWF0cml4UG9zaXRpb24oY2FtZXJhLm1hdHJpeFdvcmxkKTtcblx0Y29uc3QgZGVsdGFDYW1PYmogPSBvYmplY3RQb3Muc3ViKGNhbWVyYVBvcyk7XG5cdGNvbnN0IGNhbURpciA9IGNhbWVyYS5nZXRXb3JsZERpcmVjdGlvbih2Myk7XG5cdHJldHVybiBkZWx0YUNhbU9iai5hbmdsZVRvKGNhbURpcikgPiBNYXRoLlBJIC8gMjtcbn1cblxuZnVuY3Rpb24gaXNPYmplY3RWaXNpYmxlKFxuXHRlbDogVEhSRUUuT2JqZWN0M0QsXG5cdGNhbWVyYTogVEhSRUUuQ2FtZXJhLFxuXHRyYXljYXN0ZXI6IFRIUkVFLlJheWNhc3Rlcixcblx0b2NjbHVkZTogVEhSRUUuT2JqZWN0M0RbXSxcbikge1xuXHRjb25zdCBlbFBvcyA9IHYxLnNldEZyb21NYXRyaXhQb3NpdGlvbihlbC5tYXRyaXhXb3JsZCk7XG5cdGNvbnN0IHNjcmVlblBvcyA9IGVsUG9zLmNsb25lKCk7XG5cdHNjcmVlblBvcy5wcm9qZWN0KGNhbWVyYSk7XG5cdHJheWNhc3Rlci5zZXRGcm9tQ2FtZXJhKHNjcmVlblBvcyBhcyBhbnksIGNhbWVyYSk7XG5cdGNvbnN0IGludGVyc2VjdHMgPSByYXljYXN0ZXIuaW50ZXJzZWN0T2JqZWN0cyhvY2NsdWRlLCB0cnVlKTtcblx0aWYgKGludGVyc2VjdHMubGVuZ3RoKSB7XG5cdFx0Y29uc3QgaW50ZXJzZWN0aW9uRGlzdGFuY2UgPSBpbnRlcnNlY3RzWzBdLmRpc3RhbmNlO1xuXHRcdGNvbnN0IHBvaW50RGlzdGFuY2UgPSBlbFBvcy5kaXN0YW5jZVRvKHJheWNhc3Rlci5yYXkub3JpZ2luKTtcblx0XHRyZXR1cm4gcG9pbnREaXN0YW5jZSA8IGludGVyc2VjdGlvbkRpc3RhbmNlO1xuXHR9XG5cdHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBvYmplY3RTY2FsZShlbDogVEhSRUUuT2JqZWN0M0QsIGNhbWVyYTogVEhSRUUuQ2FtZXJhKSB7XG5cdGlmIChjYW1lcmEgaW5zdGFuY2VvZiBUSFJFRS5PcnRob2dyYXBoaWNDYW1lcmEpIHtcblx0XHRyZXR1cm4gY2FtZXJhLnpvb207XG5cdH0gZWxzZSBpZiAoY2FtZXJhIGluc3RhbmNlb2YgVEhSRUUuUGVyc3BlY3RpdmVDYW1lcmEpIHtcblx0XHRjb25zdCBvYmplY3RQb3MgPSB2MS5zZXRGcm9tTWF0cml4UG9zaXRpb24oZWwubWF0cml4V29ybGQpO1xuXHRcdGNvbnN0IGNhbWVyYVBvcyA9IHYyLnNldEZyb21NYXRyaXhQb3NpdGlvbihjYW1lcmEubWF0cml4V29ybGQpO1xuXHRcdGNvbnN0IHZGT1YgPSAoY2FtZXJhLmZvdiAqIE1hdGguUEkpIC8gMTgwO1xuXHRcdGNvbnN0IGRpc3QgPSBvYmplY3RQb3MuZGlzdGFuY2VUbyhjYW1lcmFQb3MpO1xuXHRcdGNvbnN0IHNjYWxlRk9WID0gMiAqIE1hdGgudGFuKHZGT1YgLyAyKSAqIGRpc3Q7XG5cdFx0cmV0dXJuIDEgLyBzY2FsZUZPVjtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gMTtcblx0fVxufVxuXG5mdW5jdGlvbiBvYmplY3RaSW5kZXgoZWw6IFRIUkVFLk9iamVjdDNELCBjYW1lcmE6IFRIUkVFLkNhbWVyYSwgekluZGV4UmFuZ2U6IEFycmF5PG51bWJlcj4pIHtcblx0aWYgKGNhbWVyYSBpbnN0YW5jZW9mIFRIUkVFLlBlcnNwZWN0aXZlQ2FtZXJhIHx8IGNhbWVyYSBpbnN0YW5jZW9mIFRIUkVFLk9ydGhvZ3JhcGhpY0NhbWVyYSkge1xuXHRcdGNvbnN0IG9iamVjdFBvcyA9IHYxLnNldEZyb21NYXRyaXhQb3NpdGlvbihlbC5tYXRyaXhXb3JsZCk7XG5cdFx0Y29uc3QgY2FtZXJhUG9zID0gdjIuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGNhbWVyYS5tYXRyaXhXb3JsZCk7XG5cdFx0Y29uc3QgZGlzdCA9IG9iamVjdFBvcy5kaXN0YW5jZVRvKGNhbWVyYVBvcyk7XG5cdFx0Y29uc3QgQSA9ICh6SW5kZXhSYW5nZVsxXSAtIHpJbmRleFJhbmdlWzBdKSAvIChjYW1lcmEuZmFyIC0gY2FtZXJhLm5lYXIpO1xuXHRcdGNvbnN0IEIgPSB6SW5kZXhSYW5nZVsxXSAtIEEgKiBjYW1lcmEuZmFyO1xuXHRcdHJldHVybiBNYXRoLnJvdW5kKEEgKiBkaXN0ICsgQik7XG5cdH1cblx0cmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuY29uc3QgZXBzaWxvbiA9ICh2YWx1ZTogbnVtYmVyKSA9PiAoTWF0aC5hYnModmFsdWUpIDwgMWUtMTAgPyAwIDogdmFsdWUpO1xuXG5mdW5jdGlvbiBnZXRDU1NNYXRyaXgobWF0cml4OiBUSFJFRS5NYXRyaXg0LCBtdWx0aXBsaWVyczogbnVtYmVyW10sIHByZXBlbmQgPSAnJykge1xuXHRsZXQgbWF0cml4M2QgPSAnbWF0cml4M2QoJztcblx0Zm9yIChsZXQgaSA9IDA7IGkgIT09IDE2OyBpKyspIHtcblx0XHRtYXRyaXgzZCArPSBlcHNpbG9uKG11bHRpcGxpZXJzW2ldICogbWF0cml4LmVsZW1lbnRzW2ldKSArIChpICE9PSAxNSA/ICcsJyA6ICcpJyk7XG5cdH1cblx0cmV0dXJuIHByZXBlbmQgKyBtYXRyaXgzZDtcbn1cblxuY29uc3QgZ2V0Q2FtZXJhQ1NTTWF0cml4ID0gKChtdWx0aXBsaWVyczogbnVtYmVyW10pID0+IHtcblx0cmV0dXJuIChtYXRyaXg6IFRIUkVFLk1hdHJpeDQpID0+IGdldENTU01hdHJpeChtYXRyaXgsIG11bHRpcGxpZXJzKTtcbn0pKFsxLCAtMSwgMSwgMSwgMSwgLTEsIDEsIDEsIDEsIC0xLCAxLCAxLCAxLCAtMSwgMSwgMV0pO1xuXG5jb25zdCBnZXRPYmplY3RDU1NNYXRyaXggPSAoKHNjYWxlTXVsdGlwbGllcnM6IChuOiBudW1iZXIpID0+IG51bWJlcltdKSA9PiB7XG5cdHJldHVybiAobWF0cml4OiBUSFJFRS5NYXRyaXg0LCBmYWN0b3I6IG51bWJlcikgPT5cblx0XHRnZXRDU1NNYXRyaXgobWF0cml4LCBzY2FsZU11bHRpcGxpZXJzKGZhY3RvciksICd0cmFuc2xhdGUoLTUwJSwtNTAlKScpO1xufSkoKGY6IG51bWJlcikgPT4gWzEgLyBmLCAxIC8gZiwgMSAvIGYsIDEsIC0xIC8gZiwgLTEgLyBmLCAtMSAvIGYsIC0xLCAxIC8gZiwgMSAvIGYsIDEgLyBmLCAxLCAxLCAxLCAxLCAxXSk7XG5cbkBDb21wb25lbnQoe1xuXHRzZWxlY3RvcjogJ25ndHMtaHRtbC13cmFwcGVyJyxcblx0c3RhbmRhbG9uZTogdHJ1ZSxcblx0dGVtcGxhdGU6IGBcblx0XHQ8bmctdGVtcGxhdGUgI3RyYW5zZm9ybVRlbXBsYXRlPlxuXHRcdFx0PGRpdiAjdHJhbnNmb3JtZWRPdXRlckRpdiBbc3R5bGVdPVwic3R5bGVzKClcIj5cblx0XHRcdFx0PGRpdiAjdHJhbnNmb3JtZWRJbm5lckRpdiBbc3R5bGVdPVwidHJhbnNmb3JtSW5uZXJTdHlsZXMoKVwiPlxuXHRcdFx0XHRcdDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJyZW5kZXJUZW1wbGF0ZTsgY29udGV4dDogeyBzdHlsZXM6IGh0bWxJbnB1dHMuc3R5bGUgfVwiIC8+XG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0PC9kaXY+XG5cdFx0PC9uZy10ZW1wbGF0ZT5cblxuXHRcdDxuZy10ZW1wbGF0ZSAjcmVuZGVyVGVtcGxhdGUgbGV0LXJlbmRlcmVkU3R5bGVzPVwic3R5bGVzXCI+XG5cdFx0XHQ8ZGl2ICNyZW5kZXJlZERpdiBbY2xhc3NdPVwiaHRtbElucHV0cy5yZW5kZXJlZERpdkNsYXNzKClcIiBbc3R5bGVdPVwicmVuZGVyZWRTdHlsZXMoKVwiPlxuXHRcdFx0XHQ8bmctY29udGFpbmVyICNyZW5kZXJBbmNob3IgLz5cblx0XHRcdDwvZGl2PlxuXHRcdDwvbmctdGVtcGxhdGU+XG5cdGAsXG5cdGltcG9ydHM6IFtOZ1RlbXBsYXRlT3V0bGV0XSxcbn0pXG5leHBvcnQgY2xhc3MgTmd0c0h0bWxXcmFwcGVyIHtcblx0c3RhdGljIFtIVE1MXSA9IHRydWU7XG5cblx0aHRtbElucHV0cyA9IGluamVjdE5ndHNIdG1sSW5wdXRzKCk7XG5cblx0QFZpZXdDaGlsZCgndHJhbnNmb3JtVGVtcGxhdGUnLCB7IHN0YXRpYzogdHJ1ZSB9KSB0cmFuc2Zvcm1UZW1wbGF0ZSE6IFRlbXBsYXRlUmVmPHVua25vd24+O1xuXHRAVmlld0NoaWxkKCdyZW5kZXJUZW1wbGF0ZScsIHsgc3RhdGljOiB0cnVlIH0pIHJlbmRlclRlbXBsYXRlITogVGVtcGxhdGVSZWY8dW5rbm93bj47XG5cblx0QFZpZXdDaGlsZCgndHJhbnNmb3JtZWRPdXRlckRpdicpIG91dGVyRGl2PzogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cdEBWaWV3Q2hpbGQoJ3RyYW5zZm9ybWVkSW5uZXJEaXYnKSBpbm5lckRpdj86IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXHRAVmlld0NoaWxkKCdyZW5kZXJBbmNob3InLCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYgfSkgcmVuZGVyQW5jaG9yPzogVmlld0NvbnRhaW5lclJlZjtcblxuXHRwcml2YXRlIHN0b3JlID0gaW5qZWN0Tmd0U3RvcmUoKTtcblx0cHJpdmF0ZSBnbCA9IHRoaXMuc3RvcmUuc2VsZWN0KCdnbCcpO1xuXHRwcml2YXRlIGNvbm5lY3RlZCA9IHRoaXMuc3RvcmUuc2VsZWN0KCdldmVudHMnLCAnY29ubmVjdGVkJywgeyBlcXVhbDogT2JqZWN0LmlzIH0pO1xuXHRwcml2YXRlIHZpZXdwb3J0ID0gdGhpcy5zdG9yZS5zZWxlY3QoJ3ZpZXdwb3J0Jyk7XG5cdHByaXZhdGUgc2NlbmUgPSB0aGlzLnN0b3JlLnNlbGVjdCgnc2NlbmUnKTtcblx0cHJpdmF0ZSBjYW1lcmEgPSB0aGlzLnN0b3JlLnNlbGVjdCgnY2FtZXJhJyk7XG5cdHByaXZhdGUgc2l6ZSA9IHRoaXMuc3RvcmUuc2VsZWN0KCdzaXplJyk7XG5cdHByaXZhdGUgcmF5Y2FzdGVyID0gdGhpcy5zdG9yZS5zZWxlY3QoJ3JheWNhc3RlcicpO1xuXG5cdHByaXZhdGUgaXNNZXNoU2l6ZVNldCA9IGZhbHNlO1xuXG5cdHByaXZhdGUgZG9jdW1lbnQgPSBpbmplY3QoRE9DVU1FTlQpO1xuXHRwcml2YXRlIHZjciA9IGluamVjdChWaWV3Q29udGFpbmVyUmVmKTtcblxuXHRwcml2YXRlIHBvcnRhbEVsZW1lbnQgPSBjb21wdXRlZCgoKSA9PiB7XG5cdFx0Y29uc3QgcG9ydGFsID0gdGhpcy5odG1sSW5wdXRzLnBvcnRhbCgpO1xuXHRcdGlmICghcG9ydGFsKSByZXR1cm4gbnVsbDtcblx0XHRyZXR1cm4gaXMucmVmKHBvcnRhbCkgPyBwb3J0YWwubmF0aXZlRWxlbWVudCA6IHBvcnRhbDtcblx0fSk7XG5cblx0cHJpdmF0ZSBlbGVtZW50ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KHRoaXMuaHRtbElucHV0cy5hcygpKSBhcyBIVE1MRWxlbWVudCk7XG5cdHByaXZhdGUgdGFyZ2V0ID0gY29tcHV0ZWQoKCkgPT4ge1xuXHRcdGNvbnN0IHBvcnRhbEVsZW1lbnQgPSB0aGlzLnBvcnRhbEVsZW1lbnQoKTtcblx0XHRpZiAocG9ydGFsRWxlbWVudCkgcmV0dXJuIHBvcnRhbEVsZW1lbnQ7XG5cdFx0Y29uc3QgY29ubmVjdGVkID0gdGhpcy5jb25uZWN0ZWQoKTtcblx0XHRpZiAoY29ubmVjdGVkKSByZXR1cm4gY29ubmVjdGVkIGFzIEhUTUxFbGVtZW50O1xuXHRcdHJldHVybiB0aGlzLmdsKCkuZG9tRWxlbWVudC5wYXJlbnRFbGVtZW50ITtcblx0fSk7XG5cblx0c3R5bGVzID0gY29tcHV0ZWQoKCkgPT4ge1xuXHRcdGNvbnN0IFtzdHlsZSwgY2VudGVyLCB0cmFuc2Zvcm0sIHNpemUsIGZ1bGxzY3JlZW5dID0gW1xuXHRcdFx0dGhpcy5odG1sSW5wdXRzLnN0eWxlKCksXG5cdFx0XHR0aGlzLmh0bWxJbnB1dHMuY2VudGVyKCksXG5cdFx0XHR0aGlzLmh0bWxJbnB1dHMudHJhbnNmb3JtKCksXG5cdFx0XHR0aGlzLnNpemUoKSxcblx0XHRcdHRoaXMuaHRtbElucHV0cy5mdWxsc2NyZWVuKCksXG5cdFx0XTtcblxuXHRcdGlmICh0cmFuc2Zvcm0pIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuXHRcdFx0XHR0b3A6IDAsXG5cdFx0XHRcdGxlZnQ6IDAsXG5cdFx0XHRcdHdpZHRoOiBzaXplLndpZHRoLFxuXHRcdFx0XHRoZWlnaHQ6IHNpemUuaGVpZ2h0LFxuXHRcdFx0XHR0cmFuc2Zvcm1TdHlsZTogJ3ByZXNlcnZlLTNkJyxcblx0XHRcdFx0cG9pbnRlckV2ZW50czogJ25vbmUnLFxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0cG9zaXRpb246ICdhYnNvbHV0ZScsXG5cdFx0XHR0cmFuc2Zvcm06IGNlbnRlciA/ICd0cmFuc2xhdGUzZCgtNTAlLC01MCUsMCknIDogJ25vbmUnLFxuXHRcdFx0Li4uKGZ1bGxzY3JlZW4gJiYge1xuXHRcdFx0XHR0b3A6IC1zaXplLmhlaWdodCAvIDIsXG5cdFx0XHRcdGxlZnQ6IC1zaXplLndpZHRoIC8gMixcblx0XHRcdFx0d2lkdGg6IHNpemUud2lkdGgsXG5cdFx0XHRcdGhlaWdodDogc2l6ZS5oZWlnaHQsXG5cdFx0XHR9KSxcblx0XHRcdC4uLihzdHlsZSB8fCB7fSksXG5cdFx0fTtcblx0fSk7XG5cdHRyYW5zZm9ybUlubmVyU3R5bGVzID0gY29tcHV0ZWQoKCkgPT4gKHsgcG9zaXRpb246ICdhYnNvbHV0ZScsIHBvaW50ZXJFdmVudHM6IHRoaXMuaHRtbElucHV0cy5wb2ludGVyRXZlbnRzKCkgfSkpO1xuXG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdHRoaXMuc2V0Q2FudmFzRWxlbWVudFN0eWxlKCk7XG5cdFx0dGhpcy5hcHBlbmRFbGVtZW50KCk7XG5cdFx0dGhpcy5zZXRXcmFwcGVyQ2xhc3MoKTtcblx0XHR0aGlzLnJlbmRlcigpO1xuXHRcdHRoaXMuYmVmb3JlUmVuZGVyKCk7XG5cdH1cblxuXHRwcml2YXRlIHNldENhbnZhc0VsZW1lbnRTdHlsZSgpIHtcblx0XHRlZmZlY3QoKCkgPT4ge1xuXHRcdFx0Y29uc3QgZWwgPSB1bnRyYWNrZWQodGhpcy5nbCkuZG9tRWxlbWVudCE7XG5cdFx0XHRjb25zdCBvY2NsdWRlID0gdGhpcy5odG1sSW5wdXRzLm9jY2x1ZGUoKTtcblx0XHRcdGlmIChvY2NsdWRlICYmIG9jY2x1ZGUgPT09ICdibGVuZGluZycpIHtcblx0XHRcdFx0ZWwuc3R5bGUuekluZGV4ID0gYCR7TWF0aC5mbG9vcih1bnRyYWNrZWQodGhpcy5odG1sSW5wdXRzLnpJbmRleFJhbmdlKVswXSAvIDIpfWA7XG5cdFx0XHRcdGVsLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcblx0XHRcdFx0ZWwuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJztcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGVsLnN0eWxlLnpJbmRleCA9IG51bGwhO1xuXHRcdFx0XHRlbC5zdHlsZS5wb3NpdGlvbiA9IG51bGwhO1xuXHRcdFx0XHRlbC5zdHlsZS5wb2ludGVyRXZlbnRzID0gbnVsbCE7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHRwcml2YXRlIGFwcGVuZEVsZW1lbnQoKSB7XG5cdFx0ZWZmZWN0KChvbkNsZWFudXApID0+IHtcblx0XHRcdGNvbnN0IFtncm91cCwgZWxlbWVudF0gPSBbdGhpcy5odG1sSW5wdXRzLmdyb3VwUmVmLm5hdGl2ZUVsZW1lbnQsIHRoaXMuZWxlbWVudCgpXTtcblx0XHRcdGlmIChncm91cCAmJiBlbGVtZW50KSB7XG5cdFx0XHRcdGNvbnN0IFt0YXJnZXQsIHRyYW5zZm9ybSwgc2NlbmUsIGNhbWVyYSwgc2l6ZSwgY2FsY3VsYXRlUG9zaXRpb24sIHByZXBlbmRdID0gW1xuXHRcdFx0XHRcdHRoaXMudGFyZ2V0KCksXG5cdFx0XHRcdFx0dGhpcy5odG1sSW5wdXRzLnRyYW5zZm9ybSgpLFxuXHRcdFx0XHRcdHVudHJhY2tlZCh0aGlzLnNjZW5lKSxcblx0XHRcdFx0XHR1bnRyYWNrZWQodGhpcy5jYW1lcmEpLFxuXHRcdFx0XHRcdHVudHJhY2tlZCh0aGlzLnNpemUpLFxuXHRcdFx0XHRcdHVudHJhY2tlZCh0aGlzLmh0bWxJbnB1dHMuY2FsY3VsYXRlUG9zaXRpb24pLFxuXHRcdFx0XHRcdHVudHJhY2tlZCh0aGlzLmh0bWxJbnB1dHMucHJlcGVuZCksXG5cdFx0XHRcdF07XG5cdFx0XHRcdHNjZW5lLnVwZGF0ZU1hdHJpeFdvcmxkKCk7XG5cdFx0XHRcdGlmICh0cmFuc2Zvcm0pIHtcblx0XHRcdFx0XHRlbGVtZW50LnN0eWxlLmNzc1RleHQgPSBgcG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO3BvaW50ZXItZXZlbnRzOm5vbmU7b3ZlcmZsb3c6aGlkZGVuO2A7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y29uc3QgdmVjID0gY2FsY3VsYXRlUG9zaXRpb24oZ3JvdXAsIGNhbWVyYSwgc2l6ZSk7XG5cdFx0XHRcdFx0ZWxlbWVudC5zdHlsZS5jc3NUZXh0ID0gYHBvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoJHt2ZWNbMF19cHgsJHt2ZWNbMV19cHgsMCk7dHJhbnNmb3JtLW9yaWdpbjowIDA7YDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICh0YXJnZXQpIHtcblx0XHRcdFx0XHRpZiAocHJlcGVuZCkgdGFyZ2V0LnByZXBlbmQoZWxlbWVudCk7XG5cdFx0XHRcdFx0ZWxzZSB0YXJnZXQuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRvbkNsZWFudXAoKCkgPT4ge1xuXHRcdFx0XHRcdGlmICh0YXJnZXQpIHRhcmdldC5yZW1vdmVDaGlsZChlbGVtZW50KTtcblx0XHRcdFx0XHR0aGlzLnZjci5jbGVhcigpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdHByaXZhdGUgc2V0V3JhcHBlckNsYXNzKCkge1xuXHRcdGVmZmVjdCgoKSA9PiB7XG5cdFx0XHRjb25zdCBbZWxlbWVudCwgd3JhcHBlckNsYXNzXSA9IFt0aGlzLmVsZW1lbnQoKSwgdGhpcy5odG1sSW5wdXRzLndyYXBwZXJDbGFzcygpXTtcblx0XHRcdGlmIChlbGVtZW50ICYmIHdyYXBwZXJDbGFzcykge1xuXHRcdFx0XHRlbGVtZW50LmNsYXNzTmFtZSA9IHdyYXBwZXJDbGFzcztcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdHByaXZhdGUgcmVuZGVyKCkge1xuXHRcdGVmZmVjdCgob25DbGVhbnVwKSA9PiB7XG5cdFx0XHRjb25zdCBbeyB0cmFuc2Zvcm0gfSwgZWxlbWVudCwgY29udGVudF0gPSBbXG5cdFx0XHRcdHRoaXMuaHRtbElucHV0cy5zdGF0ZSgpLFxuXHRcdFx0XHR0aGlzLmVsZW1lbnQoKSxcblx0XHRcdFx0dGhpcy5odG1sSW5wdXRzLmNvbnRlbnQoKSxcblx0XHRcdF07XG5cblx0XHRcdGlmIChlbGVtZW50KSB7XG5cdFx0XHRcdHRoaXMuaXNNZXNoU2l6ZVNldCA9IGZhbHNlO1xuXHRcdFx0XHRjb25zdCBwYXJhbXM6IFBhcmFtZXRlcnM8Vmlld0NvbnRhaW5lclJlZlsnY3JlYXRlRW1iZWRkZWRWaWV3J10+ID0gdHJhbnNmb3JtXG5cdFx0XHRcdFx0PyBbdGhpcy50cmFuc2Zvcm1UZW1wbGF0ZSwge31dXG5cdFx0XHRcdFx0OiBbdGhpcy5yZW5kZXJUZW1wbGF0ZSwgeyBzdHlsZXM6IHRoaXMuc3R5bGVzIH1dO1xuXG5cdFx0XHRcdGNvbnN0IHJlZiA9IHRoaXMudmNyLmNyZWF0ZUVtYmVkZGVkVmlldyguLi5wYXJhbXMpO1xuXHRcdFx0XHRpZiAocmVmLnJvb3ROb2Rlcz8uWzBdKSB7XG5cdFx0XHRcdFx0aWYgKGVsZW1lbnQuaGFzQ2hpbGROb2RlcygpKSB7XG5cdFx0XHRcdFx0XHRlbGVtZW50LnJlcGxhY2VDaGlsZHJlbiguLi5yZWYucm9vdE5vZGVzKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0ZWxlbWVudC5hcHBlbmQoLi4ucmVmLnJvb3ROb2Rlcyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHNhZmVEZXRlY3RDaGFuZ2VzKHJlZik7XG5cblx0XHRcdFx0bGV0IGNvbnRlbnRSZWY6IEVtYmVkZGVkVmlld1JlZjx1bmtub3duPjtcblx0XHRcdFx0bGV0IGNvbnRlbnRQYXJlbnQ6IEhUTUxFbGVtZW50O1xuXHRcdFx0XHQvKipcblx0XHRcdFx0ICogTk9URTogdXRpbGl6aW5nIHJBRiBoZXJlIHNvIHRoYXQgcmVuZGVyQW5jaG9yIChWaWV3Q29udGFpbmVyUmVmKSBoYXMgYSBjaGFuY2UgdG8gYmUgcmVzb2x2ZWRcblx0XHRcdFx0ICogVE9ETzogQW5vdGhlciBhcHByb2FjaCBpcyB0byBjYWxsIHJlbmRlcigpIGluIG5nT25Jbml0IGFuZCBwYXNzIGluIGFuIGluamVjdG9yIHRvIHRoZSBlZmZlY3Rcblx0XHRcdFx0ICovXG5cdFx0XHRcdGNvbnN0IHJBRiA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG5cdFx0XHRcdFx0aWYgKGNvbnRlbnQgJiYgdGhpcy5yZW5kZXJBbmNob3IpIHtcblx0XHRcdFx0XHRcdGNvbnRlbnRSZWYgPSB0aGlzLnJlbmRlckFuY2hvci5jcmVhdGVFbWJlZGRlZFZpZXcoY29udGVudCk7XG5cdFx0XHRcdFx0XHRjb250ZW50UGFyZW50ID0gcmVmLnJvb3ROb2Rlc1swXS5sYXN0RWxlbWVudENoaWxkIHx8IHJlZi5yb290Tm9kZXNbMF07XG5cdFx0XHRcdFx0XHR3aGlsZSAoY29udGVudFBhcmVudCAmJiBjb250ZW50UGFyZW50Lmxhc3RFbGVtZW50Q2hpbGQpIHtcblx0XHRcdFx0XHRcdFx0Y29udGVudFBhcmVudCA9IGNvbnRlbnRQYXJlbnQubGFzdEVsZW1lbnRDaGlsZCBhcyBIVE1MRWxlbWVudDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmIChjb250ZW50UmVmLnJvb3ROb2Rlcz8uWzBdKSB7XG5cdFx0XHRcdFx0XHRcdGlmIChjb250ZW50UGFyZW50Lmhhc0NoaWxkTm9kZXMoKSkge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnRlbnRQYXJlbnQucmVwbGFjZUNoaWxkcmVuKC4uLmNvbnRlbnRSZWYucm9vdE5vZGVzKTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRjb250ZW50UGFyZW50LmFwcGVuZCguLi5jb250ZW50UmVmLnJvb3ROb2Rlcyk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHNhZmVEZXRlY3RDaGFuZ2VzKGNvbnRlbnRSZWYpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0b25DbGVhbnVwKCgpID0+IHtcblx0XHRcdFx0XHRjYW5jZWxBbmltYXRpb25GcmFtZShyQUYpO1xuXG5cdFx0XHRcdFx0aWYgKGNvbnRlbnRSZWYgJiYgY29udGVudFBhcmVudCkge1xuXHRcdFx0XHRcdFx0Y29udGVudFJlZi5yb290Tm9kZXMuZm9yRWFjaCgobm9kZSkgPT4ge1xuXHRcdFx0XHRcdFx0XHRpZiAoY29udGVudFBhcmVudC5oYXNDaGlsZE5vZGVzKCkpIHtcblx0XHRcdFx0XHRcdFx0XHRjb250ZW50UGFyZW50LnJlbW92ZUNoaWxkKG5vZGUpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdG5vZGUucmVtb3ZlKCk7XG5cdFx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHRcdFx0Y29udGVudFJlZi5kZXN0cm95KCk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmVmLnJvb3ROb2Rlcy5mb3JFYWNoKChub2RlKSA9PiB7XG5cdFx0XHRcdFx0XHRpZiAoZWxlbWVudC5oYXNDaGlsZE5vZGVzKCkpIHtcblx0XHRcdFx0XHRcdFx0ZWxlbWVudC5yZW1vdmVDaGlsZChub2RlKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdG5vZGUucmVtb3ZlKCk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0cmVmLmRlc3Ryb3koKTtcblx0XHRcdFx0XHR0aGlzLnJlbmRlckFuY2hvcj8uY2xlYXIoKTtcblx0XHRcdFx0XHR0aGlzLnZjci5jbGVhcigpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdHByaXZhdGUgYmVmb3JlUmVuZGVyKCkge1xuXHRcdGxldCBvbGRQb3NpdGlvbiA9IFswLCAwXTtcblx0XHRsZXQgb2xkWm9vbSA9IDA7XG5cdFx0bGV0IHZpc2libGUgPSB0cnVlO1xuXHRcdGluamVjdEJlZm9yZVJlbmRlcigoZ2wpID0+IHtcblx0XHRcdGNvbnN0IFtcblx0XHRcdFx0Z3JvdXAsXG5cdFx0XHRcdGNhbWVyYSxcblx0XHRcdFx0dHJhbnNmb3JtLFxuXHRcdFx0XHRjYWxjdWxhdGVQb3NpdGlvbixcblx0XHRcdFx0c2l6ZSxcblx0XHRcdFx0ZXBzLFxuXHRcdFx0XHRpc1JheUNhc3RPY2NsdXNpb24sXG5cdFx0XHRcdG9jY2x1ZGUsXG5cdFx0XHRcdHNjZW5lLFxuXHRcdFx0XHRyYXljYXN0ZXIsXG5cdFx0XHRcdGVsZW1lbnQsXG5cdFx0XHRcdHpJbmRleFJhbmdlLFxuXHRcdFx0XHRzcHJpdGUsXG5cdFx0XHRcdGRpc3RhbmNlRmFjdG9yLFxuXHRcdFx0XHRvY2NsdXNpb25NZXNoUmVmLFxuXHRcdFx0XHRnZW9tZXRyeSxcblx0XHRcdFx0dmlld3BvcnQsXG5cdFx0XHRcdHNjYWxlLFxuXHRcdFx0XSA9IFtcblx0XHRcdFx0dGhpcy5odG1sSW5wdXRzLmdyb3VwUmVmLm5hdGl2ZUVsZW1lbnQsXG5cdFx0XHRcdHRoaXMuY2FtZXJhKCksXG5cdFx0XHRcdHRoaXMuaHRtbElucHV0cy50cmFuc2Zvcm0oKSxcblx0XHRcdFx0dGhpcy5odG1sSW5wdXRzLmNhbGN1bGF0ZVBvc2l0aW9uKCksXG5cdFx0XHRcdHRoaXMuc2l6ZSgpLFxuXHRcdFx0XHR0aGlzLmh0bWxJbnB1dHMuZXBzKCksXG5cdFx0XHRcdHRoaXMuaHRtbElucHV0cy5pc1JheUNhc3RPY2NsdXNpb24oKSxcblx0XHRcdFx0dGhpcy5odG1sSW5wdXRzLm9jY2x1ZGUoKSxcblx0XHRcdFx0dGhpcy5zY2VuZSgpLFxuXHRcdFx0XHR0aGlzLnJheWNhc3RlcigpLFxuXHRcdFx0XHR0aGlzLmVsZW1lbnQoKSxcblx0XHRcdFx0dGhpcy5odG1sSW5wdXRzLnpJbmRleFJhbmdlKCksXG5cdFx0XHRcdHRoaXMuaHRtbElucHV0cy5zcHJpdGUoKSxcblx0XHRcdFx0dGhpcy5odG1sSW5wdXRzLmRpc3RhbmNlRmFjdG9yKCksXG5cdFx0XHRcdHRoaXMuaHRtbElucHV0cy5vY2NsdXNpb25NZXNoUmVmLm5hdGl2ZUVsZW1lbnQsXG5cdFx0XHRcdHRoaXMuaHRtbElucHV0cy5nZW9tZXRyeSgpLFxuXHRcdFx0XHR0aGlzLnZpZXdwb3J0KCksXG5cdFx0XHRcdHRoaXMuaHRtbElucHV0cy5zY2FsZSgpLFxuXHRcdFx0XTtcblx0XHRcdGlmIChncm91cCAmJiBlbGVtZW50KSB7XG5cdFx0XHRcdGNhbWVyYS51cGRhdGVNYXRyaXhXb3JsZCgpO1xuXHRcdFx0XHRncm91cC51cGRhdGVXb3JsZE1hdHJpeCh0cnVlLCBmYWxzZSk7XG5cdFx0XHRcdGNvbnN0IHZlYyA9IHRyYW5zZm9ybSA/IG9sZFBvc2l0aW9uIDogY2FsY3VsYXRlUG9zaXRpb24oZ3JvdXAsIGNhbWVyYSwgc2l6ZSk7XG5cblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdHRyYW5zZm9ybSB8fFxuXHRcdFx0XHRcdE1hdGguYWJzKG9sZFpvb20gLSBjYW1lcmEuem9vbSkgPiBlcHMgfHxcblx0XHRcdFx0XHRNYXRoLmFicyhvbGRQb3NpdGlvblswXSAtIHZlY1swXSkgPiBlcHMgfHxcblx0XHRcdFx0XHRNYXRoLmFicyhvbGRQb3NpdGlvblsxXSAtIHZlY1sxXSkgPiBlcHNcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0Y29uc3QgaXNCZWhpbmRDYW1lcmEgPSBpc09iamVjdEJlaGluZENhbWVyYShncm91cCwgY2FtZXJhKTtcblx0XHRcdFx0XHRsZXQgcmF5dHJhY2VUYXJnZXQ6IG51bGwgfCB1bmRlZmluZWQgfCBib29sZWFuIHwgVEhSRUUuT2JqZWN0M0RbXSA9IGZhbHNlO1xuXG5cdFx0XHRcdFx0aWYgKGlzUmF5Q2FzdE9jY2x1c2lvbikge1xuXHRcdFx0XHRcdFx0aWYgKEFycmF5LmlzQXJyYXkob2NjbHVkZSkpIHtcblx0XHRcdFx0XHRcdFx0cmF5dHJhY2VUYXJnZXQgPSBvY2NsdWRlLm1hcCgoaXRlbSkgPT4gKGlzLnJlZihpdGVtKSA/IGl0ZW0ubmF0aXZlRWxlbWVudCA6IGl0ZW0pKTtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAob2NjbHVkZSAhPT0gJ2JsZW5kaW5nJykge1xuXHRcdFx0XHRcdFx0XHRyYXl0cmFjZVRhcmdldCA9IFtzY2VuZV07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Y29uc3QgcHJldmlvdXNseVZpc2libGUgPSB2aXNpYmxlO1xuXHRcdFx0XHRcdGlmIChyYXl0cmFjZVRhcmdldCkge1xuXHRcdFx0XHRcdFx0Y29uc3QgaXNWaXNpYmxlID0gaXNPYmplY3RWaXNpYmxlKGdyb3VwLCBjYW1lcmEsIHJheWNhc3RlciwgcmF5dHJhY2VUYXJnZXQpO1xuXHRcdFx0XHRcdFx0dmlzaWJsZSA9IGlzVmlzaWJsZSAmJiAhaXNCZWhpbmRDYW1lcmE7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHZpc2libGUgPSAhaXNCZWhpbmRDYW1lcmE7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKHByZXZpb3VzbHlWaXNpYmxlICE9PSB2aXNpYmxlKSB7XG5cdFx0XHRcdFx0XHRpZiAodGhpcy5odG1sSW5wdXRzLm9jY2x1ZGVkLm9ic2VydmVkKSB7XG5cdFx0XHRcdFx0XHRcdHRoaXMuaHRtbElucHV0cy5vY2NsdWRlZC5lbWl0KCF2aXNpYmxlKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGVsZW1lbnQuc3R5bGUuZGlzcGxheSA9IHZpc2libGUgPyAnYmxvY2snIDogJ25vbmUnO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGNvbnN0IGhhbGZSYW5nZSA9IE1hdGguZmxvb3IoekluZGV4UmFuZ2VbMF0gLyAyKTtcblx0XHRcdFx0XHRjb25zdCB6UmFuZ2UgPSBvY2NsdWRlXG5cdFx0XHRcdFx0XHQ/IGlzUmF5Q2FzdE9jY2x1c2lvbiAvL1xuXHRcdFx0XHRcdFx0XHQ/IFt6SW5kZXhSYW5nZVswXSwgaGFsZlJhbmdlXVxuXHRcdFx0XHRcdFx0XHQ6IFtoYWxmUmFuZ2UgLSAxLCAwXVxuXHRcdFx0XHRcdFx0OiB6SW5kZXhSYW5nZTtcblxuXHRcdFx0XHRcdGVsZW1lbnQuc3R5bGUuekluZGV4ID0gYCR7b2JqZWN0WkluZGV4KGdyb3VwLCBjYW1lcmEsIHpSYW5nZSl9YDtcblxuXHRcdFx0XHRcdGlmICh0cmFuc2Zvcm0pIHtcblx0XHRcdFx0XHRcdGNvbnN0IFt3aWR0aEhhbGYsIGhlaWdodEhhbGZdID0gW3NpemUud2lkdGggLyAyLCBzaXplLmhlaWdodCAvIDJdO1xuXHRcdFx0XHRcdFx0Y29uc3QgZm92ID0gY2FtZXJhLnByb2plY3Rpb25NYXRyaXguZWxlbWVudHNbNV0gKiBoZWlnaHRIYWxmO1xuXHRcdFx0XHRcdFx0Y29uc3QgeyBpc09ydGhvZ3JhcGhpY0NhbWVyYSwgdG9wLCBsZWZ0LCBib3R0b20sIHJpZ2h0IH0gPSBjYW1lcmEgYXMgVEhSRUUuT3J0aG9ncmFwaGljQ2FtZXJhO1xuXHRcdFx0XHRcdFx0Y29uc3QgY2FtZXJhTWF0cml4ID0gZ2V0Q2FtZXJhQ1NTTWF0cml4KGNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UpO1xuXHRcdFx0XHRcdFx0Y29uc3QgY2FtZXJhVHJhbnNmb3JtID0gaXNPcnRob2dyYXBoaWNDYW1lcmFcblx0XHRcdFx0XHRcdFx0PyBgc2NhbGUoJHtmb3Z9KXRyYW5zbGF0ZSgke2Vwc2lsb24oLShyaWdodCArIGxlZnQpIC8gMil9cHgsJHtlcHNpbG9uKFxuXHRcdFx0XHRcdFx0XHRcdFx0KHRvcCArIGJvdHRvbSkgLyAyLFxuXHRcdFx0XHRcdFx0XHQgICl9cHgpYFxuXHRcdFx0XHRcdFx0XHQ6IGB0cmFuc2xhdGVaKCR7Zm92fXB4KWA7XG5cdFx0XHRcdFx0XHRsZXQgbWF0cml4ID0gZ3JvdXAubWF0cml4V29ybGQ7XG5cdFx0XHRcdFx0XHRpZiAoc3ByaXRlKSB7XG5cdFx0XHRcdFx0XHRcdG1hdHJpeCA9IGNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2Vcblx0XHRcdFx0XHRcdFx0XHQuY2xvbmUoKVxuXHRcdFx0XHRcdFx0XHRcdC50cmFuc3Bvc2UoKVxuXHRcdFx0XHRcdFx0XHRcdC5jb3B5UG9zaXRpb24obWF0cml4KVxuXHRcdFx0XHRcdFx0XHRcdC5zY2FsZShncm91cC5zY2FsZSk7XG5cdFx0XHRcdFx0XHRcdG1hdHJpeC5lbGVtZW50c1szXSA9IG1hdHJpeC5lbGVtZW50c1s3XSA9IG1hdHJpeC5lbGVtZW50c1sxMV0gPSAwO1xuXHRcdFx0XHRcdFx0XHRtYXRyaXguZWxlbWVudHNbMTVdID0gMTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGVsZW1lbnQuc3R5bGUud2lkdGggPSBzaXplLndpZHRoICsgJ3B4Jztcblx0XHRcdFx0XHRcdGVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gc2l6ZS5oZWlnaHQgKyAncHgnO1xuXHRcdFx0XHRcdFx0ZWxlbWVudC5zdHlsZS5wZXJzcGVjdGl2ZSA9IGlzT3J0aG9ncmFwaGljQ2FtZXJhID8gJycgOiBgJHtmb3Z9cHhgO1xuXHRcdFx0XHRcdFx0aWYgKHRoaXMub3V0ZXJEaXY/Lm5hdGl2ZUVsZW1lbnQgJiYgdGhpcy5pbm5lckRpdj8ubmF0aXZlRWxlbWVudCkge1xuXHRcdFx0XHRcdFx0XHR0aGlzLm91dGVyRGl2Lm5hdGl2ZUVsZW1lbnQuc3R5bGUud2lkdGggPSBzaXplLndpZHRoICsgJ3B4Jztcblx0XHRcdFx0XHRcdFx0dGhpcy5vdXRlckRpdi5uYXRpdmVFbGVtZW50LnN0eWxlLmhlaWdodCA9IHNpemUuaGVpZ2h0ICsgJ3B4Jztcblx0XHRcdFx0XHRcdFx0dGhpcy5vdXRlckRpdi5uYXRpdmVFbGVtZW50LnN0eWxlLnRyYW5zZm9ybSA9IGAke2NhbWVyYVRyYW5zZm9ybX0ke2NhbWVyYU1hdHJpeH10cmFuc2xhdGUoJHt3aWR0aEhhbGZ9cHgsJHtoZWlnaHRIYWxmfXB4KWA7XG5cdFx0XHRcdFx0XHRcdHRoaXMuaW5uZXJEaXYubmF0aXZlRWxlbWVudC5zdHlsZS50cmFuc2Zvcm0gPSBnZXRPYmplY3RDU1NNYXRyaXgoXG5cdFx0XHRcdFx0XHRcdFx0bWF0cml4LFxuXHRcdFx0XHRcdFx0XHRcdDEgLyAoKGRpc3RhbmNlRmFjdG9yIHx8IDEwKSAvIDQwMCksXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGNvbnN0IHNjYWxlID0gZGlzdGFuY2VGYWN0b3IgPT09IHVuZGVmaW5lZCA/IDEgOiBvYmplY3RTY2FsZShncm91cCwgY2FtZXJhKSAqIGRpc3RhbmNlRmFjdG9yO1xuXHRcdFx0XHRcdFx0ZWxlbWVudC5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlM2QoJHt2ZWNbMF19cHgsJHt2ZWNbMV19cHgsMCkgc2NhbGUoJHtzY2FsZX0pYDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0b2xkUG9zaXRpb24gPSB2ZWM7XG5cdFx0XHRcdFx0b2xkWm9vbSA9IGNhbWVyYS56b29tO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmICghaXNSYXlDYXN0T2NjbHVzaW9uICYmIG9jY2x1c2lvbk1lc2hSZWYgJiYgIXRoaXMuaXNNZXNoU2l6ZVNldCkge1xuXHRcdFx0XHRpZiAodHJhbnNmb3JtKSB7XG5cdFx0XHRcdFx0aWYgKHRoaXMub3V0ZXJEaXY/Lm5hdGl2ZUVsZW1lbnQpIHtcblx0XHRcdFx0XHRcdGNvbnN0IGVsID0gdGhpcy5vdXRlckRpdi5uYXRpdmVFbGVtZW50LmNoaWxkcmVuWzBdO1xuXG5cdFx0XHRcdFx0XHRpZiAoZWw/LmNsaWVudFdpZHRoICYmIGVsPy5jbGllbnRIZWlnaHQpIHtcblx0XHRcdFx0XHRcdFx0Y29uc3QgeyBpc09ydGhvZ3JhcGhpY0NhbWVyYSB9ID0gY2FtZXJhIGFzIFRIUkVFLk9ydGhvZ3JhcGhpY0NhbWVyYTtcblxuXHRcdFx0XHRcdFx0XHRpZiAoaXNPcnRob2dyYXBoaWNDYW1lcmEgfHwgZ2VvbWV0cnkpIHtcblx0XHRcdFx0XHRcdFx0XHRpZiAoc2NhbGUgIT09IDEpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGlmICghQXJyYXkuaXNBcnJheShzY2FsZSkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0b2NjbHVzaW9uTWVzaFJlZi5zY2FsZS5zZXRTY2FsYXIoMSAvIChzY2FsZSBhcyBudW1iZXIpKTtcblx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoc2NhbGUgaW5zdGFuY2VvZiBUSFJFRS5WZWN0b3IzKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG9jY2x1c2lvbk1lc2hSZWYuc2NhbGUuY29weShzY2FsZS5jbG9uZSgpLmRpdmlkZVNjYWxhcigxKSk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRvY2NsdXNpb25NZXNoUmVmLnNjYWxlLnNldCgxIC8gc2NhbGVbMF0sIDEgLyBzY2FsZVsxXSwgMSAvIHNjYWxlWzJdKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgcmF0aW8gPSAoZGlzdGFuY2VGYWN0b3IgfHwgMTApIC8gNDAwO1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IHcgPSBlbC5jbGllbnRXaWR0aCAqIHJhdGlvO1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IGggPSBlbC5jbGllbnRIZWlnaHQgKiByYXRpbztcblxuXHRcdFx0XHRcdFx0XHRcdG9jY2x1c2lvbk1lc2hSZWYuc2NhbGUuc2V0KHcsIGgsIDEpO1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0dGhpcy5pc01lc2hTaXplU2V0ID0gdHJ1ZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y29uc3QgZWxlID0gZWxlbWVudC5jaGlsZHJlblswXTtcblxuXHRcdFx0XHRcdGlmIChlbGU/LmNsaWVudFdpZHRoICYmIGVsZT8uY2xpZW50SGVpZ2h0KSB7XG5cdFx0XHRcdFx0XHRjb25zdCByYXRpbyA9IDEgLyB2aWV3cG9ydC5mYWN0b3I7XG5cdFx0XHRcdFx0XHRjb25zdCB3ID0gZWxlLmNsaWVudFdpZHRoICogcmF0aW87XG5cdFx0XHRcdFx0XHRjb25zdCBoID0gZWxlLmNsaWVudEhlaWdodCAqIHJhdGlvO1xuXG5cdFx0XHRcdFx0XHRvY2NsdXNpb25NZXNoUmVmLnNjYWxlLnNldCh3LCBoLCAxKTtcblxuXHRcdFx0XHRcdFx0dGhpcy5pc01lc2hTaXplU2V0ID0gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRvY2NsdXNpb25NZXNoUmVmLmxvb2tBdChnbC5jYW1lcmEucG9zaXRpb24pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cbn1cbiJdfQ==
|