angular-three 0.0.0-replace

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 (89) hide show
  1. package/README.md +7 -0
  2. package/esm2022/angular-three.mjs +5 -0
  3. package/esm2022/index.mjs +20 -0
  4. package/esm2022/lib/canvas.mjs +187 -0
  5. package/esm2022/lib/directives/args.mjs +35 -0
  6. package/esm2022/lib/directives/common.mjs +42 -0
  7. package/esm2022/lib/directives/parent.mjs +35 -0
  8. package/esm2022/lib/dom/events.mjs +73 -0
  9. package/esm2022/lib/events.mjs +362 -0
  10. package/esm2022/lib/instance.mjs +70 -0
  11. package/esm2022/lib/loader.mjs +64 -0
  12. package/esm2022/lib/loop.mjs +153 -0
  13. package/esm2022/lib/portal.mjs +208 -0
  14. package/esm2022/lib/ref.mjs +46 -0
  15. package/esm2022/lib/renderer/catalogue.mjs +7 -0
  16. package/esm2022/lib/renderer/constants.mjs +21 -0
  17. package/esm2022/lib/renderer/index.mjs +432 -0
  18. package/esm2022/lib/renderer/store.mjs +423 -0
  19. package/esm2022/lib/renderer/utils.mjs +201 -0
  20. package/esm2022/lib/roots.mjs +261 -0
  21. package/esm2022/lib/routed-scene.mjs +33 -0
  22. package/esm2022/lib/store.mjs +181 -0
  23. package/esm2022/lib/three-types.mjs +2 -0
  24. package/esm2022/lib/types.mjs +2 -0
  25. package/esm2022/lib/utils/apply-props.mjs +123 -0
  26. package/esm2022/lib/utils/attach.mjs +32 -0
  27. package/esm2022/lib/utils/before-render.mjs +12 -0
  28. package/esm2022/lib/utils/create-api-token.mjs +13 -0
  29. package/esm2022/lib/utils/inputs.mjs +18 -0
  30. package/esm2022/lib/utils/is.mjs +52 -0
  31. package/esm2022/lib/utils/make.mjs +53 -0
  32. package/esm2022/lib/utils/signal-store.mjs +101 -0
  33. package/esm2022/lib/utils/update.mjs +34 -0
  34. package/fesm2022/angular-three.mjs +3167 -0
  35. package/fesm2022/angular-three.mjs.map +1 -0
  36. package/index.d.ts +22 -0
  37. package/lib/canvas.d.ts +1170 -0
  38. package/lib/directives/args.d.ts +11 -0
  39. package/lib/directives/common.d.ts +26 -0
  40. package/lib/directives/parent.d.ts +13 -0
  41. package/lib/dom/events.d.ts +5 -0
  42. package/lib/events.d.ts +83 -0
  43. package/lib/instance.d.ts +46 -0
  44. package/lib/loader.d.ts +32 -0
  45. package/lib/loop.d.ts +68 -0
  46. package/lib/portal.d.ts +58 -0
  47. package/lib/ref.d.ts +7 -0
  48. package/lib/renderer/catalogue.d.ts +13 -0
  49. package/lib/renderer/constants.d.ts +20 -0
  50. package/lib/renderer/index.d.ts +56 -0
  51. package/lib/renderer/store.d.ts +64 -0
  52. package/lib/renderer/utils.d.ts +31 -0
  53. package/lib/roots.d.ts +12 -0
  54. package/lib/routed-scene.d.ts +10 -0
  55. package/lib/store.d.ts +141 -0
  56. package/lib/three-types.d.ts +302 -0
  57. package/lib/types.d.ts +12 -0
  58. package/lib/utils/apply-props.d.ts +3 -0
  59. package/lib/utils/attach.d.ts +11 -0
  60. package/lib/utils/before-render.d.ts +6 -0
  61. package/lib/utils/create-api-token.d.ts +23 -0
  62. package/lib/utils/inputs.d.ts +5 -0
  63. package/lib/utils/is.d.ts +23 -0
  64. package/lib/utils/make.d.ts +19 -0
  65. package/lib/utils/signal-store.d.ts +30 -0
  66. package/lib/utils/update.d.ts +4 -0
  67. package/metadata.json +1 -0
  68. package/package.json +73 -0
  69. package/plugin/README.md +11 -0
  70. package/plugin/generators.json +17 -0
  71. package/plugin/src/generators/init/compat.d.ts +2 -0
  72. package/plugin/src/generators/init/compat.js +6 -0
  73. package/plugin/src/generators/init/compat.js.map +1 -0
  74. package/plugin/src/generators/init/files/experience/experience.component.html__tmpl__ +4 -0
  75. package/plugin/src/generators/init/files/experience/experience.component.ts__tmpl__ +18 -0
  76. package/plugin/src/generators/init/generator.d.ts +3 -0
  77. package/plugin/src/generators/init/generator.js +143 -0
  78. package/plugin/src/generators/init/generator.js.map +1 -0
  79. package/plugin/src/generators/init/schema.json +6 -0
  80. package/plugin/src/generators/utils.d.ts +2 -0
  81. package/plugin/src/generators/utils.js +34 -0
  82. package/plugin/src/generators/utils.js.map +1 -0
  83. package/plugin/src/generators/version.d.ts +14 -0
  84. package/plugin/src/generators/version.js +18 -0
  85. package/plugin/src/generators/version.js.map +1 -0
  86. package/plugin/src/index.d.ts +0 -0
  87. package/plugin/src/index.js +1 -0
  88. package/plugin/src/index.js.map +1 -0
  89. package/web-types.json +1 -0
@@ -0,0 +1,153 @@
1
+ import { createInjectionToken } from 'ngxtension/create-injection-token';
2
+ import { roots } from './roots';
3
+ function createSubs(callback, subs) {
4
+ const sub = { callback };
5
+ subs.add(sub);
6
+ return () => void subs.delete(sub);
7
+ }
8
+ const globalEffects = new Set();
9
+ const globalAfterEffects = new Set();
10
+ const globalTailEffects = new Set();
11
+ /**
12
+ * Adds a global render callback which is called each frame.
13
+ * @see https://docs.pmnd.rs/react-three-fiber/api/additional-exports#addEffect
14
+ */
15
+ export const addEffect = (callback) => createSubs(callback, globalEffects);
16
+ /**
17
+ * Adds a global after-render callback which is called each frame.
18
+ * @see https://docs.pmnd.rs/react-three-fiber/api/additional-exports#addAfterEffect
19
+ */
20
+ export const addAfterEffect = (callback) => createSubs(callback, globalAfterEffects);
21
+ /**
22
+ * Adds a global callback which is called when rendering stops.
23
+ * @see https://docs.pmnd.rs/react-three-fiber/api/additional-exports#addTail
24
+ */
25
+ export const addTail = (callback) => createSubs(callback, globalTailEffects);
26
+ function run(effects, timestamp) {
27
+ if (!effects.size)
28
+ return;
29
+ for (const { callback } of effects.values()) {
30
+ callback(timestamp);
31
+ }
32
+ }
33
+ export function flushGlobalEffects(type, timestamp) {
34
+ switch (type) {
35
+ case 'before':
36
+ return run(globalEffects, timestamp);
37
+ case 'after':
38
+ return run(globalAfterEffects, timestamp);
39
+ case 'tail':
40
+ return run(globalTailEffects, timestamp);
41
+ }
42
+ }
43
+ function render(timestamp, store, frame) {
44
+ const state = store.snapshot;
45
+ // Run local effects
46
+ let delta = state.clock.getDelta();
47
+ // In frameloop='never' mode, clock times are updated using the provided timestamp
48
+ if (state.frameloop === 'never' && typeof timestamp === 'number') {
49
+ delta = timestamp - state.clock.elapsedTime;
50
+ state.clock.oldTime = state.clock.elapsedTime;
51
+ state.clock.elapsedTime = timestamp;
52
+ }
53
+ // Call subscribers (beforeRender)
54
+ const subscribers = state.internal.subscribers;
55
+ for (let i = 0; i < subscribers.length; i++) {
56
+ const subscription = subscribers[i];
57
+ subscription.callback({ ...subscription.store.snapshot, delta, frame });
58
+ }
59
+ // Render content
60
+ if (!state.internal.priority && state.gl.render)
61
+ state.gl.render(state.scene, state.camera);
62
+ // Decrease frame count
63
+ state.internal.frames = Math.max(0, state.internal.frames - 1);
64
+ return state.frameloop === 'always' ? 1 : state.internal.frames;
65
+ }
66
+ function createLoop(roots) {
67
+ let running = false;
68
+ let injectBeforeRenderInProgress = false;
69
+ let repeat;
70
+ let frame;
71
+ function loop(timestamp) {
72
+ frame = requestAnimationFrame(loop);
73
+ running = true;
74
+ repeat = 0;
75
+ // Run effects
76
+ flushGlobalEffects('before', timestamp);
77
+ // Render all roots
78
+ injectBeforeRenderInProgress = true;
79
+ for (const root of roots.values()) {
80
+ const state = root.snapshot;
81
+ // If the frameloop is invalidated, do not run another frame
82
+ if (state.internal.active &&
83
+ (state.frameloop === 'always' || state.internal.frames > 0) &&
84
+ !state.gl.xr?.isPresenting) {
85
+ repeat += render(timestamp, root);
86
+ }
87
+ }
88
+ injectBeforeRenderInProgress = false;
89
+ // Run after-effects
90
+ flushGlobalEffects('after', timestamp);
91
+ // Stop the loop if nothing invalidates it
92
+ if (repeat === 0) {
93
+ // Tail call effects, they are called when rendering stops
94
+ flushGlobalEffects('tail', timestamp);
95
+ // Flag end of operation
96
+ running = false;
97
+ return cancelAnimationFrame(frame);
98
+ }
99
+ }
100
+ function invalidate(store, frames = 1) {
101
+ const state = store?.snapshot;
102
+ if (!state)
103
+ return roots.forEach((root) => invalidate(root, frames));
104
+ if (state.gl.xr?.isPresenting || !state.internal.active || state.frameloop === 'never')
105
+ return;
106
+ if (frames > 1) {
107
+ // legacy support for people using frames parameters
108
+ // Increase frames, do not go higher than 60
109
+ state.internal.frames = Math.min(60, state.internal.frames + frames);
110
+ }
111
+ else {
112
+ if (injectBeforeRenderInProgress) {
113
+ // called from within a injectBeforeRender, it means the user wants an additional frame
114
+ state.internal.frames = 2;
115
+ }
116
+ else {
117
+ // the user needs a new frame, no need to increment
118
+ state.internal.frames = 1;
119
+ }
120
+ }
121
+ // If the render-loop isn't active, start it
122
+ if (!running) {
123
+ running = true;
124
+ requestAnimationFrame(loop);
125
+ }
126
+ }
127
+ function advance(timestamp, runGlobalEffects = true, store, frame) {
128
+ if (runGlobalEffects)
129
+ flushGlobalEffects('before', timestamp);
130
+ if (!store)
131
+ for (const root of roots.values())
132
+ render(timestamp, root);
133
+ else
134
+ render(timestamp, store, frame);
135
+ if (runGlobalEffects)
136
+ flushGlobalEffects('after', timestamp);
137
+ }
138
+ return {
139
+ loop,
140
+ /**
141
+ * Invalidates the view, requesting a frame to be rendered. Will globally invalidate unless passed a root's state.
142
+ * @see https://docs.pmnd.rs/react-three-fiber/api/additional-exports#invalidate
143
+ */
144
+ invalidate,
145
+ /**
146
+ * Advances the frameloop and runs render effects, useful for when manually rendering via `frameloop="never"`.
147
+ * @see https://docs.pmnd.rs/react-three-fiber/api/additional-exports#advance
148
+ */
149
+ advance,
150
+ };
151
+ }
152
+ export const [injectNgtLoop] = createInjectionToken(() => createLoop(roots));
153
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9vcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvY29yZS9zcmMvbGliL2xvb3AudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDekUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFNBQVMsQ0FBQztBQU9oQyxTQUFTLFVBQVUsQ0FBQyxRQUFpQyxFQUFFLElBQWtCO0lBQ3hFLE1BQU0sR0FBRyxHQUFHLEVBQUUsUUFBUSxFQUFFLENBQUM7SUFDekIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNkLE9BQU8sR0FBRyxFQUFFLENBQUMsS0FBSyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BDLENBQUM7QUFFRCxNQUFNLGFBQWEsR0FBaUIsSUFBSSxHQUFHLEVBQUUsQ0FBQztBQUM5QyxNQUFNLGtCQUFrQixHQUFpQixJQUFJLEdBQUcsRUFBRSxDQUFDO0FBQ25ELE1BQU0saUJBQWlCLEdBQWlCLElBQUksR0FBRyxFQUFFLENBQUM7QUFFbEQ7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLENBQUMsUUFBaUMsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxhQUFhLENBQUMsQ0FBQztBQUVwRzs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsQ0FBQyxRQUFpQyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLGtCQUFrQixDQUFDLENBQUM7QUFFOUc7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLENBQUMsUUFBaUMsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO0FBRXRHLFNBQVMsR0FBRyxDQUFDLE9BQXFCLEVBQUUsU0FBaUI7SUFDcEQsSUFBSSxD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QUM7O1lBQ2xFLE1BQU0sQ0FBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3JDLElBQUksZ0JBQWdCO1lBQUUsa0JBQWtCLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFFRCxPQUFPO1FBQ04sSUFBSTtRQUNKOzs7V0FHRztRQUNILFVBQVU7UUFDVjs7O1dBR0c7UUFDSCxPQUFPO0tBQ1AsQ0FBQztBQUNILENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxHQUFHLG9CQUFvQixDQUFDLEdBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlSW5qZWN0aW9uVG9rZW4gfSBmcm9tICduZ3h0ZW5zaW9uL2NyZWF0ZS1pbmplY3Rpb24tdG9rZW4nO1xuaW1wb3J0IHsgcm9vdHMgfSBmcm9tICcuL3Jvb3RzJztcbmltcG9ydCB0eXBlIHsgTmd0U3RhdGUgfSBmcm9tICcuL3N0b3JlJztcbmltcG9ydCB0eXBlIHsgTmd0U2lnbmFsU3RvcmUgfSBmcm9tICcuL3V0aWxzL3NpZ25hbC1zdG9yZSc7XG5cbmV4cG9ydCB0eXBlIE5ndEdsb2JhbFJlbmRlckNhbGxiYWNrID0gKHRpbWVTdGFtcDogbnVtYmVyKSA9PiB2b2lkO1xudHlwZSBTdWJJdGVtID0geyBjYWxsYmFjazogTmd0R2xvYmFsUmVuZGVyQ2FsbGJhY2sgfTtcblxuZnVuY3Rpb24gY3JlYXRlU3VicyhjYWxsYmFjazogTmd0R2xvYmFsUmVuZGVyQ2FsbGJhY2ssIHN1YnM6IFNldDxTdWJJdGVtPik6ICgpID0+IHZvaWQge1xuXHRjb25zdCBzdWIgPSB7IGNhbGxiYWNrIH07XG5cdHN1YnMuYWRkKHN1Yik7XG5cdHJldHVybiAoKSA9PiB2b2lkIHN1YnMuZGVsZXRlKHN1Yik7XG59XG5cbmNvbnN0IGdsb2JhbEVmZmVjdHM6IFNldDxTdWJJdGVtPiA9IG5ldyBTZXQoKTtcbmNvbnN0IGdsb2JhbEFmdGVyRWZmZWN0czogU2V0PFN1Ykl0ZW0+ID0gbmV3IFNldCgpO1xuY29uc3QgZ2xvYmFsVGFpbEVmZmVjdHM6IFNldDxTdWJJdGVtPiA9IG5ldyBTZXQoKTtcblxuLyoqXG4gKiBBZGRzIGEgZ2xvYmFsIHJlbmRlciBjYWxsYmFjayB3aGljaCBpcyBjYWxsZWQgZWFjaCBmcmFtZS5cbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLnBtbmQucnMvcmVhY3QtdGhyZWUtZmliZXIvYXBpL2FkZGl0aW9uYWwtZXhwb3J0cyNhZGRFZmZlY3RcbiAqL1xuZXhwb3J0IGNvbnN0IGFkZEVmZmVjdCA9IChjYWxsYmFjazogTmd0R2xvYmFsUmVuZGVyQ2FsbGJhY2spID0+IGNyZWF0ZVN1YnMoY2FsbGJhY2ssIGdsb2JhbEVmZmVjdHMpO1xuXG4vKipcbiAqIEFkZHMgYSBnbG9iYWwgYWZ0ZXItcmVuZGVyIGNhbGxiYWNrIHdoaWNoIGlzIGNhbGxlZCBlYWNoIGZyYW1lLlxuICogQHNlZSBodHRwczovL2RvY3MucG1uZC5ycy9yZWFjdC10aHJlZS1maWJlci9hcGkvYWRkaXRpb25hbC1leHBvcnRzI2FkZEFmdGVyRWZmZWN0XG4gKi9cbmV4cG9ydCBjb25zdCBhZGRBZnRlckVmZmVjdCA9IChjYWxsYmFjazogTmd0R2xvYmFsUmVuZGVyQ2FsbGJhY2spID0+IGNyZWF0ZVN1YnMoY2FsbGJhY2ssIGdsb2JhbEFmdGVyRWZmZWN0cyk7XG5cbi8qKlxuICogQWRkcyBhIGdsb2JhbCBjYWxsYmFjayB3aGljaCBpcyBjYWxsZWQgd2hlbiByZW5kZXJpbmcgc3RvcHMuXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5wbW5kLnJzL3JlYWN0LXRocmVlLWZpYmVyL2FwaS9hZGRpdGlvbmFsLWV4cG9ydHMjYWRkVGFpbFxuICovXG5leHBvcnQgY29uc3QgYWRkVGFpbCA9IChjYWxsYmFjazogTmd0R2xvYmFsUmVuZGVyQ2FsbGJhY2spID0+IGNyZWF0ZVN1YnMoY2FsbGJhY2ssIGdsb2JhbFRhaWxFZmZlY3RzKTtcblxuZnVuY3Rpb24gcnVuKGVmZmVjdHM6IFNldDxTdWJJdGVtPiwgdGltZXN0YW1wOiBudW1iZXIpIHtcblx0aWYgKCFlZmZlY3RzLnNpemUpIHJldHVybjtcblx0Zm9yIChjb25zdCB7IGNhbGxiYWNrIH0gb2YgZWZmZWN0cy52YWx1ZXMoKSkge1xuXHRcdGNhbGxiYWNrKHRpbWVzdGFtcCk7XG5cdH1cbn1cblxuZXhwb3J0IHR5cGUgTmd0R2xvYmFsRWZmZWN0VHlwZSA9ICdiZWZvcmUnIHwgJ2FmdGVyJyB8ICd0YWlsJztcblxuZXhwb3J0IGZ1bmN0aW9uIGZsdXNoR2xvYmFsRWZmZWN0cyh0eXBlOiBOZ3RHbG9iYWxFZmZlY3RUeXBlLCB0aW1lc3RhbXA6IG51bWJlcik6IHZvaWQge1xuXHRzd2l0Y2ggKHR5cGUpIHtcblx0XHRjYXNlICdiZWZvcmUnOlxuXHRcdFx0cmV0dXJuIHJ1bihnbG9iYWxFZmZlY3RzLCB0aW1lc3RhbXApO1xuXHRcdGNhc2UgJ2FmdGVyJzpcblx0XHRcdHJldHVybiBydW4oZ2xvYmFsQWZ0ZXJFZmZlY3RzLCB0aW1lc3RhbXApO1xuXHRcdGNhc2UgJ3RhaWwnOlxuXHRcdFx0cmV0dXJuIHJ1bihnbG9iYWxUYWlsRWZmZWN0cywgdGltZXN0YW1wKTtcblx0fVxufVxuXG5mdW5jdGlvbiByZW5kZXIodGltZXN0YW1wOiBudW1iZXIsIHN0b3JlOiBOZ3RTaWduYWxTdG9yZTxOZ3RTdGF0ZT4sIGZyYW1lPzogWFJGcmFtZSkge1xuXHRjb25zdCBzdGF0ZSA9IHN0b3JlLnNuYXBzaG90O1xuXHQvLyBSdW4gbG9jYWwgZWZmZWN0c1xuXHRsZXQgZGVsdGEgPSBzdGF0ZS5jbG9jay5nZXREZWx0YSgpO1xuXHQvLyBJbiBmcmFtZWxvb3A9J25ldmVyJyBtb2RlLCBjbG9jayB0aW1lcyBhcmUgdXBkYXRlZCB1c2luZyB0aGUgcHJvdmlkZWQgdGltZXN0YW1wXG5cdGlmIChzdGF0ZS5mcmFtZWxvb3AgPT09ICduZXZlcicgJiYgdHlwZW9mIHRpbWVzdGFtcCA9PT0gJ251bWJlcicpIHtcblx0XHRkZWx0YSA9IHRpbWVzdGFtcCAtIHN0YXRlLmNsb2NrLmVsYXBzZWRUaW1lO1xuXHRcdHN0YXRlLmNsb2NrLm9sZFRpbWUgPSBzdGF0ZS5jbG9jay5lbGFwc2VkVGltZTtcblx0XHRzdGF0ZS5jbG9jay5lbGFwc2VkVGltZSA9IHRpbWVzdGFtcDtcblx0fVxuXHQvLyBDYWxsIHN1YnNjcmliZXJzIChiZWZvcmVSZW5kZXIpXG5cdGNvbnN0IHN1YnNjcmliZXJzID0gc3RhdGUuaW50ZXJuYWwuc3Vic2NyaWJlcnM7XG5cdGZvciAobGV0IGkgPSAwOyBpIDwgc3Vic2NyaWJlcnMubGVuZ3RoOyBpKyspIHtcblx0XHRjb25zdCBzdWJzY3JpcHRpb24gPSBzdWJzY3JpYmVyc1tpXTtcblx0XHRzdWJzY3JpcHRpb24uY2FsbGJhY2soeyAuLi5zdWJzY3JpcHRpb24uc3RvcmUuc25hcHNob3QsIGRlbHRhLCBmcmFtZSB9KTtcblx0fVxuXHQvLyBSZW5kZXIgY29udGVudFxuXHRpZiAoIXN0YXRlLmludGVybmFsLnByaW9yaXR5ICYmIHN0YXRlLmdsLnJlbmRlcikgc3RhdGUuZ2wucmVuZGVyKHN0YXRlLnNjZW5lLCBzdGF0ZS5jYW1lcmEpO1xuXHQvLyBEZWNyZWFzZSBmcmFtZSBjb3VudFxuXHRzdGF0ZS5pbnRlcm5hbC5mcmFtZXMgPSBNYXRoLm1heCgwLCBzdGF0ZS5pbnRlcm5hbC5mcmFtZXMgLSAxKTtcblx0cmV0dXJuIHN0YXRlLmZyYW1lbG9vcCA9PT0gJ2Fsd2F5cycgPyAxIDogc3RhdGUuaW50ZXJuYWwuZnJhbWVzO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVMb29wPFRDYW52YXM+KHJvb3RzOiBNYXA8VENhbnZhcywgTmd0U2lnbmFsU3RvcmU8Tmd0U3RhdGU+Pikge1xuXHRsZXQgcnVubmluZyA9IGZhbHNlO1xuXHRsZXQgaW5qZWN0QmVmb3JlUmVuZGVySW5Qcm9ncmVzcyA9IGZhbHNlO1xuXHRsZXQgcmVwZWF0OiBudW1iZXI7XG5cdGxldCBmcmFtZTogbnVtYmVyO1xuXG5cdGZ1bmN0aW9uIGxvb3AodGltZXN0YW1wOiBudW1iZXIpOiB2b2lkIHtcblx0XHRmcmFtZSA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShsb29wKTtcblx0XHRydW5uaW5nID0gdHJ1ZTtcblx0XHRyZXBlYXQgPSAwO1xuXG5cdFx0Ly8gUnVuIGVmZmVjdHNcblx0XHRmbHVzaEdsb2JhbEVmZmVjdHMoJ2JlZm9yZScsIHRpbWVzdGFtcCk7XG5cblx0XHQvLyBSZW5kZXIgYWxsIHJvb3RzXG5cdFx0aW5qZWN0QmVmb3JlUmVuZGVySW5Qcm9ncmVzcyA9IHRydWU7XG5cdFx0Zm9yIChjb25zdCByb290IG9mIHJvb3RzLnZhbHVlcygpKSB7XG5cdFx0XHRjb25zdCBzdGF0ZSA9IHJvb3Quc25hcHNob3Q7XG5cdFx0XHQvLyBJZiB0aGUgZnJhbWVsb29wIGlzIGludmFsaWRhdGVkLCBkbyBub3QgcnVuIGFub3RoZXIgZnJhbWVcblx0XHRcdGlmIChcblx0XHRcdFx0c3RhdGUuaW50ZXJuYWwuYWN0aXZlICYmXG5cdFx0XHRcdChzdGF0ZS5mcmFtZWxvb3AgPT09ICdhbHdheXMnIHx8IHN0YXRlLmludGVybmFsLmZyYW1lcyA+IDApICYmXG5cdFx0XHRcdCFzdGF0ZS5nbC54cj8uaXNQcmVzZW50aW5nXG5cdFx0XHQpIHtcblx0XHRcdFx0cmVwZWF0ICs9IHJlbmRlcih0aW1lc3RhbXAsIHJvb3QpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpbmplY3RCZWZvcmVSZW5kZXJJblByb2dyZXNzID0gZmFsc2U7XG5cblx0XHQvLyBSdW4gYWZ0ZXItZWZmZWN0c1xuXHRcdGZsdXNoR2xvYmFsRWZmZWN0cygnYWZ0ZXInLCB0aW1lc3RhbXApO1xuXG5cdFx0Ly8gU3RvcCB0aGUgbG9vcCBpZiBub3RoaW5nIGludmFsaWRhdGVzIGl0XG5cdFx0aWYgKHJlcGVhdCA9PT0gMCkge1xuXHRcdFx0Ly8gVGFpbCBjYWxsIGVmZmVjdHMsIHRoZXkgYXJlIGNhbGxlZCB3aGVuIHJlbmRlcmluZyBzdG9wc1xuXHRcdFx0Zmx1c2hHbG9iYWxFZmZlY3RzKCd0YWlsJywgdGltZXN0YW1wKTtcblxuXHRcdFx0Ly8gRmxhZyBlbmQgb2Ygb3BlcmF0aW9uXG5cdFx0XHRydW5uaW5nID0gZmFsc2U7XG5cdFx0XHRyZXR1cm4gY2FuY2VsQW5pbWF0aW9uRnJhbWUoZnJhbWUpO1xuXHRcdH1cblx0fVxuXG5cdGZ1bmN0aW9uIGludmFsaWRhdGUoc3RvcmU/OiBOZ3RTaWduYWxTdG9yZTxOZ3RTdGF0ZT4sIGZyYW1lcyA9IDEpOiB2b2lkIHtcblx0XHRjb25zdCBzdGF0ZSA9IHN0b3JlPy5zbmFwc2hvdDtcblx0XHRpZiAoIXN0YXRlKSByZXR1cm4gcm9vdHMuZm9yRWFjaCgocm9vdCkgPT4gaW52YWxpZGF0ZShyb290LCBmcmFtZXMpKTtcblx0XHRpZiAoc3RhdGUuZ2wueHI/LmlzUHJlc2VudGluZyB8fCAhc3RhdGUuaW50ZXJuYWwuYWN0aXZlIHx8IHN0YXRlLmZyYW1lbG9vcCA9PT0gJ25ldmVyJykgcmV0dXJuO1xuXG5cdFx0aWYgKGZyYW1lcyA+IDEpIHtcblx0XHRcdC8vIGxlZ2FjeSBzdXBwb3J0IGZvciBwZW9wbGUgdXNpbmcgZnJhbWVzIHBhcmFtZXRlcnNcblx0XHRcdC8vIEluY3JlYXNlIGZyYW1lcywgZG8gbm90IGdvIGhpZ2hlciB0aGFuIDYwXG5cdFx0XHRzdGF0ZS5pbnRlcm5hbC5mcmFtZXMgPSBNYXRoLm1pbig2MCwgc3RhdGUuaW50ZXJuYWwuZnJhbWVzICsgZnJhbWVzKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKGluamVjdEJlZm9yZVJlbmRlckluUHJvZ3Jlc3MpIHtcblx0XHRcdFx0Ly8gY2FsbGVkIGZyb20gd2l0aGluIGEgaW5qZWN0QmVmb3JlUmVuZGVyLCBpdCBtZWFucyB0aGUgdXNlciB3YW50cyBhbiBhZGRpdGlvbmFsIGZyYW1lXG5cdFx0XHRcdHN0YXRlLmludGVybmFsLmZyYW1lcyA9IDI7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyB0aGUgdXNlciBuZWVkcyBhIG5ldyBmcmFtZSwgbm8gbmVlZCB0byBpbmNyZW1lbnRcblx0XHRcdFx0c3RhdGUuaW50ZXJuYWwuZnJhbWVzID0gMTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBJZiB0aGUgcmVuZGVyLWxvb3AgaXNuJ3QgYWN0aXZlLCBzdGFydCBpdFxuXHRcdGlmICghcnVubmluZykge1xuXHRcdFx0cnVubmluZyA9IHRydWU7XG5cdFx0XHRyZXF1ZXN0QW5pbWF0aW9uRnJhbWUobG9vcCk7XG5cdFx0fVxuXHR9XG5cblx0ZnVuY3Rpb24gYWR2YW5jZShcblx0XHR0aW1lc3RhbXA6IG51bWJlcixcblx0XHRydW5HbG9iYWxFZmZlY3RzID0gdHJ1ZSxcblx0XHRzdG9yZT86IE5ndFNpZ25hbFN0b3JlPE5ndFN0YXRlPixcblx0XHRmcmFtZT86IFhSRnJhbWUsXG5cdCk6IHZvaWQge1xuXHRcdGlmIChydW5HbG9iYWxFZmZlY3RzKSBmbHVzaEdsb2JhbEVmZmVjdHMoJ2JlZm9yZScsIHRpbWVzdGFtcCk7XG5cdFx0aWYgKCFzdG9yZSkgZm9yIChjb25zdCByb290IG9mIHJvb3RzLnZhbHVlcygpKSByZW5kZXIodGltZXN0YW1wLCByb290KTtcblx0XHRlbHNlIHJlbmRlcih0aW1lc3RhbXAsIHN0b3JlLCBmcmFtZSk7XG5cdFx0aWYgKHJ1bkdsb2JhbEVmZmVjdHMpIGZsdXNoR2xvYmFsRWZmZWN0cygnYWZ0ZXInLCB0aW1lc3RhbXApO1xuXHR9XG5cblx0cmV0dXJuIHtcblx0XHRsb29wLFxuXHRcdC8qKlxuXHRcdCAqIEludmFsaWRhdGVzIHRoZSB2aWV3LCByZXF1ZXN0aW5nIGEgZnJhbWUgdG8gYmUgcmVuZGVyZWQuIFdpbGwgZ2xvYmFsbHkgaW52YWxpZGF0ZSB1bmxlc3MgcGFzc2VkIGEgcm9vdCdzIHN0YXRlLlxuXHRcdCAqIEBzZWUgaHR0cHM6Ly9kb2NzLnBtbmQucnMvcmVhY3QtdGhyZWUtZmliZXIvYXBpL2FkZGl0aW9uYWwtZXhwb3J0cyNpbnZhbGlkYXRlXG5cdFx0ICovXG5cdFx0aW52YWxpZGF0ZSxcblx0XHQvKipcblx0XHQgKiBBZHZhbmNlcyB0aGUgZnJhbWVsb29wIGFuZCBydW5zIHJlbmRlciBlZmZlY3RzLCB1c2VmdWwgZm9yIHdoZW4gbWFudWFsbHkgcmVuZGVyaW5nIHZpYSBgZnJhbWVsb29wPVwibmV2ZXJcImAuXG5cdFx0ICogQHNlZSBodHRwczovL2RvY3MucG1uZC5ycy9yZWFjdC10aHJlZS1maWJlci9hcGkvYWRkaXRpb25hbC1leHBvcnRzI2FkdmFuY2Vcblx0XHQgKi9cblx0XHRhZHZhbmNlLFxuXHR9O1xufVxuXG5leHBvcnQgY29uc3QgW2luamVjdE5ndExvb3BdID0gY3JlYXRlSW5qZWN0aW9uVG9rZW4oKCkgPT4gY3JlYXRlTG9vcChyb290cykpO1xuIl19
@@ -0,0 +1,208 @@
1
+ import { afterNextRender, ChangeDetectionStrategy, Component, computed, contentChild, CUSTOM_ELEMENTS_SCHEMA, DestroyRef, Directive, ElementRef, inject, Injector, input, signal, SkipSelf, TemplateRef, untracked, viewChild, ViewContainerRef, } from '@angular/core';
2
+ import { injectAutoEffect } from 'ngxtension/auto-effect';
3
+ import { createInjectionToken } from 'ngxtension/create-injection-token';
4
+ import * as THREE from 'three';
5
+ import { prepare } from './instance';
6
+ import { injectNgtRef } from './ref';
7
+ import { SPECIAL_INTERNAL_ADD_COMMENT } from './renderer/constants';
8
+ import { injectNgtStore, NGT_STORE } from './store';
9
+ import { injectBeforeRender } from './utils/before-render';
10
+ import { is } from './utils/is';
11
+ import { signalStore } from './utils/signal-store';
12
+ import { updateCamera } from './utils/update';
13
+ import * as i0 from "@angular/core";
14
+ const privateKeys = [
15
+ 'get',
16
+ 'set',
17
+ 'select',
18
+ 'setSize',
19
+ 'setDpr',
20
+ 'setFrameloop',
21
+ 'events',
22
+ 'invalidate',
23
+ 'advance',
24
+ 'size',
25
+ 'viewport',
26
+ ];
27
+ const [, providePortalStore] = createInjectionToken((parentStore) => {
28
+ const parentState = parentStore.snapshot;
29
+ const pointer = new THREE.Vector2();
30
+ const raycaster = new THREE.Raycaster();
31
+ return signalStore(({ update }) => {
32
+ return {
33
+ ...parentState,
34
+ pointer,
35
+ raycaster,
36
+ previousRoot: parentStore,
37
+ // Layers are allowed to override events
38
+ setEvents: (events) => update((state) => ({ ...state, events: { ...state.events, ...events } })),
39
+ };
40
+ });
41
+ }, { isRoot: false, token: NGT_STORE, deps: [[new SkipSelf(), NGT_STORE]] });
42
+ export class NgtPortalBeforeRender {
43
+ constructor() {
44
+ this.portalStore = injectNgtStore();
45
+ this.injector = inject(Injector);
46
+ this.renderPriority = input(1);
47
+ this.parentScene = input.required();
48
+ this.parentCamera = input.required();
49
+ afterNextRender(() => {
50
+ let oldClear;
51
+ injectBeforeRender(() => {
52
+ const { gl, scene, camera } = this.portalStore.get();
53
+ oldClear = gl.autoClear;
54
+ if (this.renderPriority() === 1) {
55
+ // clear scene and render with default
56
+ gl.autoClear = true;
57
+ gl.render(this.parentScene(), this.parentCamera());
58
+ }
59
+ // disable cleaning
60
+ gl.autoClear = false;
61
+ gl.clearDepth();
62
+ gl.render(scene, camera);
63
+ // restore
64
+ gl.autoClear = oldClear;
65
+ }, { priority: this.renderPriority(), injector: this.injector });
66
+ });
67
+ }
68
+ onPointerOver() {
69
+ /* noop */
70
+ }
71
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.0", ngImport: i0, type: NgtPortalBeforeRender, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
72
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.0.0", type: NgtPortalBeforeRender, isStandalone: true, selector: "ngt-portal-before-render", inputs: { renderPriority: { classPropertyName: "renderPriority", publicName: "renderPriority", isSignal: true, isRequired: false, transformFunction: null }, parentScene: { classPropertyName: "parentScene", publicName: "parentScene", isSignal: true, isRequired: true, transformFunction: null }, parentCamera: { classPropertyName: "parentCamera", publicName: "parentCamera", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: `
73
+ <!-- Without an element that receives pointer events state.pointer will always be 0/0 -->
74
+ <ngt-group (pointerover)="onPointerOver()" attach="none" />
75
+ `, isInline: true }); }
76
+ }
77
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0", ngImport: i0, type: NgtPortalBeforeRender, decorators: [{
78
+ type: Component,
79
+ args: [{
80
+ selector: 'ngt-portal-before-render',
81
+ standalone: true,
82
+ template: `
83
+ <!-- Without an element that receives pointer events state.pointer will always be 0/0 -->
84
+ <ngt-group (pointerover)="onPointerOver()" attach="none" />
85
+ `,
86
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
87
+ }]
88
+ }], ctorParameters: () => [] });
89
+ export class NgtPortalContent {
90
+ constructor(vcr, parentVcr) {
91
+ const commentNode = vcr.element.nativeElement;
92
+ if (commentNode[SPECIAL_INTERNAL_ADD_COMMENT]) {
93
+ commentNode[SPECIAL_INTERNAL_ADD_COMMENT](parentVcr.element.nativeElement);
94
+ delete commentNode[SPECIAL_INTERNAL_ADD_COMMENT];
95
+ }
96
+ }
97
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.0", ngImport: i0, type: NgtPortalContent, deps: [{ token: i0.ViewContainerRef }, { token: i0.ViewContainerRef, skipSelf: true }], target: i0.ɵɵFactoryTarget.Directive }); }
98
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.0.0", type: NgtPortalContent, isStandalone: true, selector: "ng-template[ngtPortalContent]", ngImport: i0 }); }
99
+ }
100
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0", ngImport: i0, type: NgtPortalContent, decorators: [{
101
+ type: Directive,
102
+ args: [{ selector: 'ng-template[ngtPortalContent]', standalone: true }]
103
+ }], ctorParameters: () => [{ type: i0.ViewContainerRef }, { type: i0.ViewContainerRef, decorators: [{
104
+ type: SkipSelf
105
+ }] }] });
106
+ export class NgtPortal {
107
+ constructor() {
108
+ this.options = input({ container: injectNgtRef(prepare(new THREE.Scene())) }, {
109
+ transform: (value) => ({
110
+ container: injectNgtRef(prepare(new THREE.Scene())),
111
+ ...value,
112
+ }),
113
+ });
114
+ this.autoRender = input(false);
115
+ this.autoRenderPriority = input(1);
116
+ this.portalContentTemplate = contentChild.required(NgtPortalContent, { read: TemplateRef });
117
+ this.portalContentAnchor = viewChild.required('portalContentAnchor', { read: ViewContainerRef });
118
+ this.destroyRef = inject(DestroyRef);
119
+ this.autoEffect = injectAutoEffect();
120
+ this.parentStore = injectNgtStore({ skipSelf: true });
121
+ this.portalStore = injectNgtStore({ self: true });
122
+ this.portalRendered = signal(false);
123
+ this.renderAutoBeforeRender = computed(() => this.portalRendered() && this.autoRender());
124
+ this.parentScene = this.parentStore.get('scene');
125
+ this.parentCamera = this.parentStore.get('camera');
126
+ afterNextRender(() => {
127
+ const parentState = this.parentStore.snapshot;
128
+ const { container, state: { events = {}, size = {}, ...rest } = {} } = untracked(this.options);
129
+ this.portalStore.update({
130
+ scene: (is.ref(container) ? container.nativeElement : container),
131
+ events: { ...parentState.events, ...events },
132
+ size: { ...parentState.size, ...size },
133
+ ...rest,
134
+ });
135
+ this.autoEffect(() => {
136
+ const previous = this.parentStore.state();
137
+ this.portalStore.update((state) => this.inject(previous, state));
138
+ });
139
+ untracked(() => {
140
+ const portalView = this.portalContentAnchor().createEmbeddedView(this.portalContentTemplate());
141
+ portalView.detectChanges();
142
+ this.destroyRef.onDestroy(portalView.destroy.bind(portalView));
143
+ });
144
+ this.portalRendered.set(true);
145
+ });
146
+ }
147
+ inject(rootState, injectState) {
148
+ const intersect = { ...rootState };
149
+ Object.keys(intersect).forEach((key) => {
150
+ if (privateKeys.includes(key) ||
151
+ rootState[key] !== injectState[key]) {
152
+ delete intersect[key];
153
+ }
154
+ });
155
+ const inputs = untracked(this.options);
156
+ const { size, events, ...restInputsState } = inputs.state || {};
157
+ let viewport = undefined;
158
+ if (injectState && size) {
159
+ const camera = injectState.camera;
160
+ viewport = rootState.viewport.getCurrentViewport(camera, new THREE.Vector3(), size);
161
+ if (camera !== rootState.camera)
162
+ updateCamera(camera, size);
163
+ }
164
+ return {
165
+ ...intersect,
166
+ scene: is.ref(inputs.container) ? inputs.container.nativeElement : inputs.container,
167
+ previousRoot: this.parentStore,
168
+ events: { ...rootState.events, ...(injectState?.events || {}), ...events },
169
+ size: { ...rootState.size, ...size },
170
+ viewport: { ...rootState.viewport, ...(viewport || {}) },
171
+ ...restInputsState,
172
+ };
173
+ }
174
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.0", ngImport: i0, type: NgtPortal, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
175
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.0", type: NgtPortal, isStandalone: true, selector: "ngt-portal", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, autoRender: { classPropertyName: "autoRender", publicName: "autoRender", isSignal: true, isRequired: false, transformFunction: null }, autoRenderPriority: { classPropertyName: "autoRenderPriority", publicName: "autoRenderPriority", isSignal: true, isRequired: false, transformFunction: null } }, providers: [providePortalStore()], queries: [{ propertyName: "portalContentTemplate", first: true, predicate: NgtPortalContent, descendants: true, read: TemplateRef, isSignal: true }], viewQueries: [{ propertyName: "portalContentAnchor", first: true, predicate: ["portalContentAnchor"], descendants: true, read: ViewContainerRef, isSignal: true }], ngImport: i0, template: `
176
+ <ng-container #portalContentAnchor>
177
+ @if (renderAutoBeforeRender()) {
178
+ <ngt-portal-before-render
179
+ [renderPriority]="autoRenderPriority()"
180
+ [parentScene]="parentScene"
181
+ [parentCamera]="parentCamera"
182
+ />
183
+ }
184
+ </ng-container>
185
+ `, isInline: true, dependencies: [{ kind: "component", type: NgtPortalBeforeRender, selector: "ngt-portal-before-render", inputs: ["renderPriority", "parentScene", "parentCamera"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
186
+ }
187
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0", ngImport: i0, type: NgtPortal, decorators: [{
188
+ type: Component,
189
+ args: [{
190
+ selector: 'ngt-portal',
191
+ standalone: true,
192
+ template: `
193
+ <ng-container #portalContentAnchor>
194
+ @if (renderAutoBeforeRender()) {
195
+ <ngt-portal-before-render
196
+ [renderPriority]="autoRenderPriority()"
197
+ [parentScene]="parentScene"
198
+ [parentCamera]="parentCamera"
199
+ />
200
+ }
201
+ </ng-container>
202
+ `,
203
+ imports: [NgtPortalBeforeRender],
204
+ providers: [providePortalStore()],
205
+ changeDetection: ChangeDetectionStrategy.OnPush,
206
+ }]
207
+ }], ctorParameters: () => [] });
208
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9ydGFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvcG9ydGFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTixlQUFlLEVBQ2YsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxRQUFRLEVBQ1IsWUFBWSxFQUNaLHNCQUFzQixFQUN0QixVQUFVLEVBQ1YsU0FBUyxFQUNULFVBQVUsRUFDVixNQUFNLEVBQ04sUUFBUSxFQUNSLEtBQUssRUFDTCxNQUFNLEVBQ04sUUFBUSxFQUNSLFdBQVcsRUFDWCxTQUFTLEVBQ1QsU0FBUyxFQUNULGdCQUFnQixHQUNoQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMxRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUN6RSxPQUFPLEtBQUssS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUUvQixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDckMsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDcEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxTQUFTLEVBQStCLE1BQU0sU0FBUyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzNELE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDaEMsT0FBTyxFQUFFLFdBQVcsRUFBdUIsTUFBTSxzQkFBc0IsQ0FBQztBQUN4RSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7O0FBRTlDLE1BQU0sV0FBVyxHQUFHO0lBQ25CLEtBQUs7SUFDTCxLQUFLO0lBQ0wsUUFBUTtJQUNSLFNBQVM7SUFDVCxRQUFRO0lB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RSxNQUFNLElBQUksRUFBRSxDQUFDLEVBQUUsR0FBRyxNQUFNLEVBQUU7WUFDMUUsSUFBSSxFQUFFLEVBQUUsR0FBRyxTQUFTLENBQUMsSUFBSSxFQUFFLEdBQUcsSUFBSSxFQUFFO1lBQ3BDLFFBQVEsRUFBRSxFQUFFLEdBQUcsU0FBUyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQyxFQUFFO1lBQ3hELEdBQUcsZUFBZTtTQUNOLENBQUM7SUFDZixDQUFDOzhHQXRGVyxTQUFTO2tHQUFULFNBQVMseWVBSFYsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLDZFQWlCYSxnQkFBZ0IsMkJBQVUsV0FBVyxvSkFDWCxnQkFBZ0IsNkNBOUI5RTs7Ozs7Ozs7OztFQVVULDREQTdEVyxxQkFBcUI7OzJGQWtFckIsU0FBUztrQkFsQnJCLFNBQVM7bUJBQUM7b0JBQ1YsUUFBUSxFQUFFLFlBQVk7b0JBQ3RCLFVBQVUsRUFBRSxJQUFJO29CQUNoQixRQUFRLEVBQUU7Ozs7Ozs7Ozs7RUFVVDtvQkFDRCxPQUFPLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQztvQkFDaEMsU0FBUyxFQUFFLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztvQkFDakMsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07aUJBQy9DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcblx0YWZ0ZXJOZXh0UmVuZGVyLFxuXHRDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcblx0Q29tcG9uZW50LFxuXHRjb21wdXRlZCxcblx0Y29udGVudENoaWxkLFxuXHRDVVNUT01fRUxFTUVOVFNfU0NIRU1BLFxuXHREZXN0cm95UmVmLFxuXHREaXJlY3RpdmUsXG5cdEVsZW1lbnRSZWYsXG5cdGluamVjdCxcblx0SW5qZWN0b3IsXG5cdGlucHV0LFxuXHRzaWduYWwsXG5cdFNraXBTZWxmLFxuXHRUZW1wbGF0ZVJlZixcblx0dW50cmFja2VkLFxuXHR2aWV3Q2hpbGQsXG5cdFZpZXdDb250YWluZXJSZWYsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgaW5qZWN0QXV0b0VmZmVjdCB9IGZyb20gJ25neHRlbnNpb24vYXV0by1lZmZlY3QnO1xuaW1wb3J0IHsgY3JlYXRlSW5qZWN0aW9uVG9rZW4gfSBmcm9tICduZ3h0ZW5zaW9uL2NyZWF0ZS1pbmplY3Rpb24tdG9rZW4nO1xuaW1wb3J0ICogYXMgVEhSRUUgZnJvbSAndGhyZWUnO1xuaW1wb3J0IHR5cGUgeyBOZ3RFdmVudE1hbmFnZXIgfSBmcm9tICcuL2V2ZW50cyc7XG5pbXBvcnQgeyBwcmVwYXJlIH0gZnJvbSAnLi9pbnN0YW5jZSc7XG5pbXBvcnQgeyBpbmplY3ROZ3RSZWYgfSBmcm9tICcuL3JlZic7XG5pbXBvcnQgeyBTUEVDSUFMX0lOVEVSTkFMX0FERF9DT01NRU5UIH0gZnJvbSAnLi9yZW5kZXJlci9jb25zdGFudHMnO1xuaW1wb3J0IHsgaW5qZWN0Tmd0U3RvcmUsIE5HVF9TVE9SRSwgdHlwZSBOZ3RTaXplLCB0eXBlIE5ndFN0YXRlIH0gZnJvbSAnLi9zdG9yZSc7XG5pbXBvcnQgeyBpbmplY3RCZWZvcmVSZW5kZXIgfSBmcm9tICcuL3V0aWxzL2JlZm9yZS1yZW5kZXInO1xuaW1wb3J0IHsgaXMgfSBmcm9tICcuL3V0aWxzL2lzJztcbmltcG9ydCB7IHNpZ25hbFN0b3JlLCB0eXBlIE5ndFNpZ25hbFN0b3JlIH0gZnJvbSAnLi91dGlscy9zaWduYWwtc3RvcmUnO1xuaW1wb3J0IHsgdXBkYXRlQ2FtZXJhIH0gZnJvbSAnLi91dGlscy91cGRhdGUnO1xuXG5jb25zdCBwcml2YXRlS2V5cyA9IFtcblx0J2dldCcsXG5cdCdzZXQnLFxuXHQnc2VsZWN0Jyxcblx0J3NldFNpemUnLFxuXHQnc2V0RHByJyxcblx0J3NldEZyYW1lbG9vcCcsXG5cdCdldmVudHMnLFxuXHQnaW52YWxpZGF0ZScsXG5cdCdhZHZhbmNlJyxcblx0J3NpemUnLFxuXHQndmlld3BvcnQnLFxuXSBhcyBjb25zdDtcbnR5cGUgUHJpdmF0ZUtleXMgPSAodHlwZW9mIHByaXZhdGVLZXlzKVtudW1iZXJdO1xuXG5leHBvcnQgaW50ZXJmYWNlIE5ndFBvcnRhbElucHV0cyB7XG5cdGNvbnRhaW5lcjogRWxlbWVudFJlZjxUSFJFRS5PYmplY3QzRD4gfCBUSFJFRS5PYmplY3QzRDtcblx0Y2FtZXJhOiBFbGVtZW50UmVmPFRIUkVFLkNhbWVyYT4gfCBUSFJFRS5DYW1lcmE7XG5cdHN0YXRlOiBQYXJ0aWFsPFxuXHRcdE9taXQ8Tmd0U3RhdGUsIFByaXZhdGVLZXlzPiAmIHtcblx0XHRcdGV2ZW50czogUGFydGlhbDxQaWNrPE5ndEV2ZW50TWFuYWdlcjxhbnk+LCAnZW5hYmxlZCcgfCAncHJpb3JpdHknIHwgJ2NvbXB1dGUnIHwgJ2Nvbm5lY3RlZCc+Pjtcblx0XHRcdHNpemU6IE5ndFNpemU7XG5cdFx0fVxuXHQ+O1xufVxuXG5jb25zdCBbLCBwcm92aWRlUG9ydGFsU3RvcmVdID0gY3JlYXRlSW5qZWN0aW9uVG9rZW4oXG5cdChwYXJlbnRTdG9yZTogTmd0U2lnbmFsU3RvcmU8Tmd0U3RhdGU+KSA9PiB7XG5cdFx0Y29uc3QgcGFyZW50U3RhdGUgPSBwYXJlbnRTdG9yZS5zbmFwc2hvdDtcblx0XHRjb25zdCBwb2ludGVyID0gbmV3IFRIUkVFLlZlY3RvcjIoKTtcblx0XHRjb25zdCByYXljYXN0ZXIgPSBuZXcgVEhSRUUuUmF5Y2FzdGVyKCk7XG5cdFx0cmV0dXJuIHNpZ25hbFN0b3JlPE5ndFN0YXRlPigoeyB1cGRhdGUgfSkgPT4ge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0Li4ucGFyZW50U3RhdGUsXG5cdFx0XHRcdHBvaW50ZXIsXG5cdFx0XHRcdHJheWNhc3Rlcixcblx0XHRcdFx0cHJldmlvdXNSb290OiBwYXJlbnRTdG9yZSxcblx0XHRcdFx0Ly8gTGF5ZXJzIGFyZSBhbGxvd2VkIHRvIG92ZXJyaWRlIGV2ZW50c1xuXHRcdFx0XHRzZXRFdmVudHM6IChldmVudHMpID0+IHVwZGF0ZSgoc3RhdGUpID0+ICh7IC4uLnN0YXRlLCBldmVudHM6IHsgLi4uc3RhdGUuZXZlbnRzLCAuLi5ldmVudHMgfSB9KSksXG5cdFx0XHR9O1xuXHRcdH0pO1xuXHR9LFxuXHR7IGlzUm9vdDogZmFsc2UsIHRva2VuOiBOR1RfU1RPUkUsIGRlcHM6IFtbbmV3IFNraXBTZWxmKCksIE5HVF9TVE9SRV1dIH0sXG4pO1xuXG5AQ29tcG9uZW50KHtcblx0c2VsZWN0b3I6ICduZ3QtcG9ydGFsLWJlZm9yZS1yZW5kZXInLFxuXHRzdGFuZGFsb25lOiB0cnVlLFxuXHR0ZW1wbGF0ZTogYFxuXHRcdDwhLS0gV2l0aG91dCBhbiBlbGVtZW50IHRoYXQgcmVjZWl2ZXMgcG9pbnRlciBldmVudHMgc3RhdGUucG9pbnRlciB3aWxsIGFsd2F5cyBiZSAwLzAgLS0+XG5cdFx0PG5ndC1ncm91cCAocG9pbnRlcm92ZXIpPVwib25Qb2ludGVyT3ZlcigpXCIgYXR0YWNoPVwibm9uZVwiIC8+XG5cdGAsXG5cdHNjaGVtYXM6IFtDVVNUT01fRUxFTUVOVFNfU0NIRU1BXSxcbn0pXG5leHBvcnQgY2xhc3MgTmd0UG9ydGFsQmVmb3JlUmVuZGVyIHtcblx0cHJpdmF0ZSBwb3J0YWxTdG9yZSA9IGluamVjdE5ndFN0b3JlKCk7XG5cdHByaXZhdGUgaW5qZWN0b3IgPSBpbmplY3QoSW5qZWN0b3IpO1xuXG5cdHJlbmRlclByaW9yaXR5ID0gaW5wdXQoMSk7XG5cdHBhcmVudFNjZW5lID0gaW5wdXQucmVxdWlyZWQ8VEhSRUUuU2NlbmU+KCk7XG5cdHBhcmVudENhbWVyYSA9IGlucHV0LnJlcXVpcmVkPFRIUkVFLkNhbWVyYT4oKTtcblxuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHRhZnRlck5leHRSZW5kZXIoKCkgPT4ge1xuXHRcdFx0bGV0IG9sZENsZWFyOiBib29sZWFuO1xuXHRcdFx0aW5qZWN0QmVmb3JlUmVuZGVyKFxuXHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgeyBnbCwgc2NlbmUsIGNhbWVyYSB9ID0gdGhpcy5wb3J0YWxTdG9yZS5nZXQoKTtcblx0XHRcdFx0XHRvbGRDbGVhciA9IGdsLmF1dG9DbGVhcjtcblx0XHRcdFx0XHRpZiAodGhpcy5yZW5kZXJQcmlvcml0eSgpID09PSAxKSB7XG5cdFx0XHRcdFx0XHQvLyBjbGVhciBzY2VuZSBhbmQgcmVuZGVyIHdpdGggZGVmYXVsdFxuXHRcdFx0XHRcdFx0Z2wuYXV0b0NsZWFyID0gdHJ1ZTtcblx0XHRcdFx0XHRcdGdsLnJlbmRlcih0aGlzLnBhcmVudFNjZW5lKCksIHRoaXMucGFyZW50Q2FtZXJhKCkpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQvLyBkaXNhYmxlIGNsZWFuaW5nXG5cdFx0XHRcdFx0Z2wuYXV0b0NsZWFyID0gZmFsc2U7XG5cdFx0XHRcdFx0Z2wuY2xlYXJEZXB0aCgpO1xuXHRcdFx0XHRcdGdsLnJlbmRlcihzY2VuZSwgY2FtZXJhKTtcblx0XHRcdFx0XHQvLyByZXN0b3JlXG5cdFx0XHRcdFx0Z2wuYXV0b0NsZWFyID0gb2xkQ2xlYXI7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHsgcHJpb3JpdHk6IHRoaXMucmVuZGVyUHJpb3JpdHkoKSwgaW5qZWN0b3I6IHRoaXMuaW5qZWN0b3IgfSxcblx0XHRcdCk7XG5cdFx0fSk7XG5cdH1cblxuXHRvblBvaW50ZXJPdmVyKCkge1xuXHRcdC8qIG5vb3AgKi9cblx0fVxufVxuXG5ARGlyZWN0aXZlKHsgc2VsZWN0b3I6ICduZy10ZW1wbGF0ZVtuZ3RQb3J0YWxDb250ZW50XScsIHN0YW5kYWxvbmU6IHRydWUgfSlcbmV4cG9ydCBjbGFzcyBOZ3RQb3J0YWxDb250ZW50IHtcblx0Y29uc3RydWN0b3IodmNyOiBWaWV3Q29udGFpbmVyUmVmLCBAU2tpcFNlbGYoKSBwYXJlbnRWY3I6IFZpZXdDb250YWluZXJSZWYpIHtcblx0XHRjb25zdCBjb21tZW50Tm9kZSA9IHZjci5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XG5cdFx0aWYgKGNvbW1lbnROb2RlW1NQRUNJQUxfSU5URVJOQUxfQUREX0NPTU1FTlRdKSB7XG5cdFx0XHRjb21tZW50Tm9kZVtTUEVDSUFMX0lOVEVSTkFMX0FERF9DT01NRU5UXShwYXJlbnRWY3IuZWxlbWVudC5uYXRpdmVFbGVtZW50KTtcblx0XHRcdGRlbGV0ZSBjb21tZW50Tm9kZVtTUEVDSUFMX0lOVEVSTkFMX0FERF9DT01NRU5UXTtcblx0XHR9XG5cdH1cbn1cblxuQENvbXBvbmVudCh7XG5cdHNlbGVjdG9yOiAnbmd0LXBvcnRhbCcsXG5cdHN0YW5kYWxvbmU6IHRydWUsXG5cdHRlbXBsYXRlOiBgXG5cdFx0PG5nLWNvbnRhaW5lciAjcG9ydGFsQ29udGVudEFuY2hvcj5cblx0XHRcdEBpZiAocmVuZGVyQXV0b0JlZm9yZVJlbmRlcigpKSB7XG5cdFx0XHRcdDxuZ3QtcG9ydGFsLWJlZm9yZS1yZW5kZXJcblx0XHRcdFx0XHRbcmVuZGVyUHJpb3JpdHldPVwiYXV0b1JlbmRlclByaW9yaXR5KClcIlxuXHRcdFx0XHRcdFtwYXJlbnRTY2VuZV09XCJwYXJlbnRTY2VuZVwiXG5cdFx0XHRcdFx0W3BhcmVudENhbWVyYV09XCJwYXJlbnRDYW1lcmFcIlxuXHRcdFx0XHQvPlxuXHRcdFx0fVxuXHRcdDwvbmctY29udGFpbmVyPlxuXHRgLFxuXHRpbXBvcnRzOiBbTmd0UG9ydGFsQmVmb3JlUmVuZGVyXSxcblx0cHJvdmlkZXJzOiBbcHJvdmlkZVBvcnRhbFN0b3JlKCldLFxuXHRjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgTmd0UG9ydGFsIHtcblx0b3B0aW9ucyA9IGlucHV0KFxuXHRcdHsgY29udGFpbmVyOiBpbmplY3ROZ3RSZWY8VEhSRUUuU2NlbmU+KHByZXBhcmUobmV3IFRIUkVFLlNjZW5lKCkpKSB9LFxuXHRcdHtcblx0XHRcdHRyYW5zZm9ybTogKHZhbHVlOiBQYXJ0aWFsPE5ndFBvcnRhbElucHV0cz4pID0+ICh7XG5cdFx0XHRcdGNvbnRhaW5lcjogaW5qZWN0Tmd0UmVmPFRIUkVFLlNjZW5lPihwcmVwYXJlKG5ldyBUSFJFRS5TY2VuZSgpKSksXG5cdFx0XHRcdC4uLnZhbHVlLFxuXHRcdFx0fSksXG5cdFx0fSxcblx0KTtcblxuXHRhdXRvUmVuZGVyID0gaW5wdXQoZmFsc2UpO1xuXHRhdXRvUmVuZGVyUHJpb3JpdHkgPSBpbnB1dCgxKTtcblxuXHRwb3J0YWxDb250ZW50VGVtcGxhdGUgPSBjb250ZW50Q2hpbGQucmVxdWlyZWQoTmd0UG9ydGFsQ29udGVudCwgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KTtcblx0cG9ydGFsQ29udGVudEFuY2hvciA9IHZpZXdDaGlsZC5yZXF1aXJlZCgncG9ydGFsQ29udGVudEFuY2hvcicsIHsgcmVhZDogVmlld0NvbnRhaW5lclJlZiB9KTtcblxuXHRwcml2YXRlIGRlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG5cdHByaXZhdGUgYXV0b0VmZmVjdCA9IGluamVjdEF1dG9FZmZlY3QoKTtcblx0cHJpdmF0ZSBwYXJlbnRTdG9yZSA9IGluamVjdE5ndFN0b3JlKHsgc2tpcFNlbGY6IHRydWUgfSk7XG5cdHByaXZhdGUgcG9ydGFsU3RvcmUgPSBpbmplY3ROZ3RTdG9yZSh7IHNlbGY6IHRydWUgfSk7XG5cblx0cHJpdmF0ZSBwb3J0YWxSZW5kZXJlZCA9IHNpZ25hbChmYWxzZSk7XG5cblx0cHJvdGVjdGVkIHJlbmRlckF1dG9CZWZvcmVSZW5kZXIgPSBjb21wdXRlZCgoKSA9PiB0aGlzLnBvcnRhbFJlbmRlcmVkKCkgJiYgdGhpcy5hdXRvUmVuZGVyKCkpO1xuXHRwcm90ZWN0ZWQgcGFyZW50U2NlbmUgPSB0aGlzLnBhcmVudFN0b3JlLmdldCgnc2NlbmUnKTtcblx0cHJvdGVjdGVkIHBhcmVudENhbWVyYSA9IHRoaXMucGFyZW50U3RvcmUuZ2V0KCdjYW1lcmEnKTtcblxuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHRhZnRlck5leHRSZW5kZXIoKCkgPT4ge1xuXHRcdFx0Y29uc3QgcGFyZW50U3RhdGUgPSB0aGlzLnBhcmVudFN0b3JlLnNuYXBzaG90O1xuXHRcdFx0Y29uc3QgeyBjb250YWluZXIsIHN0YXRlOiB7IGV2ZW50cyA9IHt9LCBzaXplID0ge30sIC4uLnJlc3QgfSA9IHt9IH0gPSB1bnRyYWNrZWQodGhpcy5vcHRpb25zKTtcblxuXHRcdFx0dGhpcy5wb3J0YWxTdG9yZS51cGRhdGUoe1xuXHRcdFx0XHRzY2VuZTogKGlzLnJlZihjb250YWluZXIpID8gY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQgOiBjb250YWluZXIpIGFzIFRIUkVFLlNjZW5lLFxuXHRcdFx0XHRldmVudHM6IHsgLi4ucGFyZW50U3RhdGUuZXZlbnRzLCAuLi5ldmVudHMgfSxcblx0XHRcdFx0c2l6ZTogeyAuLi5wYXJlbnRTdGF0ZS5zaXplLCAuLi5zaXplIH0sXG5cdFx0XHRcdC4uLnJlc3QsXG5cdFx0XHR9KTtcblxuXHRcdFx0dGhpcy5hdXRvRWZmZWN0KCgpID0+IHtcblx0XHRcdFx0Y29uc3QgcHJldmlvdXMgPSB0aGlzLnBhcmVudFN0b3JlLnN0YXRlKCk7XG5cdFx0XHRcdHRoaXMucG9ydGFsU3RvcmUudXBkYXRlKChzdGF0ZSkgPT4gdGhpcy5pbmplY3QocHJldmlvdXMsIHN0YXRlKSk7XG5cdFx0XHR9KTtcblxuXHRcdFx0dW50cmFja2VkKCgpID0+IHtcblx0XHRcdFx0Y29uc3QgcG9ydGFsVmlldyA9IHRoaXMucG9ydGFsQ29udGVudEFuY2hvcigpLmNyZWF0ZUVtYmVkZGVkVmlldyh0aGlzLnBvcnRhbENvbnRlbnRUZW1wbGF0ZSgpKTtcblx0XHRcdFx0cG9ydGFsVmlldy5kZXRlY3RDaGFuZ2VzKCk7XG5cdFx0XHRcdHRoaXMuZGVzdHJveVJlZi5vbkRlc3Ryb3kocG9ydGFsVmlldy5kZXN0cm95LmJpbmQocG9ydGFsVmlldykpO1xuXHRcdFx0fSk7XG5cblx0XHRcdHRoaXMucG9ydGFsUmVuZGVyZWQuc2V0KHRydWUpO1xuXHRcdH0pO1xuXHR9XG5cblx0cHJpdmF0ZSBpbmplY3Qocm9vdFN0YXRlOiBOZ3RTdGF0ZSwgaW5qZWN0U3RhdGU6IE5ndFN0YXRlKSB7XG5cdFx0Y29uc3QgaW50ZXJzZWN0OiBQYXJ0aWFsPE5ndFN0YXRlPiA9IHsgLi4ucm9vdFN0YXRlIH07XG5cblx0XHRPYmplY3Qua2V5cyhpbnRlcnNlY3QpLmZvckVhY2goKGtleSkgPT4ge1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRwcml2YXRlS2V5cy5pbmNsdWRlcyhrZXkgYXMgUHJpdmF0ZUtleXMpIHx8XG5cdFx0XHRcdHJvb3RTdGF0ZVtrZXkgYXMga2V5b2YgTmd0U3RhdGVdICE9PSBpbmplY3RTdGF0ZVtrZXkgYXMga2V5b2YgTmd0U3RhdGVdXG5cdFx0XHQpIHtcblx0XHRcdFx0ZGVsZXRlIGludGVyc2VjdFtrZXkgYXMga2V5b2YgTmd0U3RhdGVdO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0Y29uc3QgaW5wdXRzID0gdW50cmFja2VkKHRoaXMub3B0aW9ucyk7XG5cdFx0Y29uc3QgeyBzaXplLCBldmVudHMsIC4uLnJlc3RJbnB1dHNTdGF0ZSB9ID0gaW5wdXRzLnN0YXRlIHx8IHt9O1xuXG5cdFx0bGV0IHZpZXdwb3J0ID0gdW5kZWZpbmVkO1xuXHRcdGlmIChpbmplY3RTdGF0ZSAmJiBzaXplKSB7XG5cdFx0XHRjb25zdCBjYW1lcmEgPSBpbmplY3RTdGF0ZS5jYW1lcmE7XG5cdFx0XHR2aWV3cG9ydCA9IHJvb3RTdGF0ZS52aWV3cG9ydC5nZXRDdXJyZW50Vmlld3BvcnQoY2FtZXJhLCBuZXcgVEhSRUUuVmVjdG9yMygpLCBzaXplKTtcblx0XHRcdGlmIChjYW1lcmEgIT09IHJvb3RTdGF0ZS5jYW1lcmEpIHVwZGF0ZUNhbWVyYShjYW1lcmEsIHNpemUpO1xuXHRcdH1cblxuXHRcdHJldHVybiB7XG5cdFx0XHQuLi5pbnRlcnNlY3QsXG5cdFx0XHRzY2VuZTogaXMucmVmKGlucHV0cy5jb250YWluZXIpID8gaW5wdXRzLmNvbnRhaW5lci5uYXRpdmVFbGVtZW50IDogaW5wdXRzLmNvbnRhaW5lcixcblx0XHRcdHByZXZpb3VzUm9vdDogdGhpcy5wYXJlbnRTdG9yZSxcblx0XHRcdGV2ZW50czogeyAuLi5yb290U3RhdGUuZXZlbnRzLCAuLi4oaW5qZWN0U3RhdGU/LmV2ZW50cyB8fCB7fSksIC4uLmV2ZW50cyB9LFxuXHRcdFx0c2l6ZTogeyAuLi5yb290U3RhdGUuc2l6ZSwgLi4uc2l6ZSB9LFxuXHRcdFx0dmlld3BvcnQ6IHsgLi4ucm9vdFN0YXRlLnZpZXdwb3J0LCAuLi4odmlld3BvcnQgfHwge30pIH0sXG5cdFx0XHQuLi5yZXN0SW5wdXRzU3RhdGUsXG5cdFx0fSBhcyBOZ3RTdGF0ZTtcblx0fVxufVxuIl19
@@ -0,0 +1,46 @@
1
+ import { DestroyRef, ElementRef, computed, inject, signal, untracked } from '@angular/core';
2
+ import { assertInjector } from 'ngxtension/assert-injector';
3
+ import { getLocalState } from './instance';
4
+ import { is } from './utils/is';
5
+ export function injectNgtRef(initial = null, injector) {
6
+ return assertInjector(injectNgtRef, injector, () => {
7
+ const ref = is.ref(initial) ? initial : new ElementRef(initial);
8
+ const refSignal = signal(ref.nativeElement, { equal: Object.is });
9
+ const readonlyRef = refSignal.asReadonly();
10
+ const computedCached = new Map();
11
+ inject(DestroyRef).onDestroy(() => void computedCached.clear());
12
+ const children = (type = 'objects') => {
13
+ if (!computedCached.has(type)) {
14
+ computedCached.set(type, computed(() => {
15
+ const instance = readonlyRef();
16
+ if (!instance)
17
+ return [];
18
+ const localState = getLocalState(instance);
19
+ if (!localState?.instanceStore)
20
+ return [];
21
+ if (type === 'objects')
22
+ return localState.objects();
23
+ if (type === 'nonObjects')
24
+ return localState.nonObjects();
25
+ return [...localState.objects(), ...localState.nonObjects()];
26
+ }));
27
+ }
28
+ return computedCached.get(type);
29
+ };
30
+ Object.defineProperties(ref, {
31
+ nativeElement: {
32
+ set: (newElement) => {
33
+ untracked(() => {
34
+ if (newElement !== readonlyRef()) {
35
+ refSignal.set(newElement);
36
+ }
37
+ });
38
+ },
39
+ get: readonlyRef,
40
+ },
41
+ children: { value: children },
42
+ });
43
+ return ref;
44
+ });
45
+ }
46
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVmLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvcmVmLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBOEIsTUFBTSxlQUFlLENBQUM7QUFDeEgsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzVELE9BQU8sRUFBRSxhQUFhLEVBQXdCLE1BQU0sWUFBWSxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFTaEMsTUFBTSxVQUFVLFlBQVksQ0FDM0IsVUFBMkMsSUFBSyxFQUNoRCxRQUFtQjtJQUVuQixPQUFPLGNBQWMsQ0FBQyxZQUFZLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRTtRQUNsRCxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksVUFBVSxDQUFDLE9BQW1CLENBQUMsQ0FBQztRQUM1RSxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNsRSxNQUFNLFdBQVcsR0FBRyxTQUFTLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDM0MsTUFBTSxjQUFjLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUVqQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssY0FBYyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7UUFFaEUsTUFBTSxRQUFRLEdBQUcsQ0FBQyxPQUEwQyxTQUFTLEVBQUUsRUFBRTtZQUN4RSxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUMvQixjQUFjLENBQUMsR0FBRyxDQUNqQixJQUFJLEVBQ0osUUFBUSxDQUFDLEdBQUcsRUFBRTtvQkFDYixNQUFNLFFBQVEsR0FBRyxXQUFXLEVBQUUsQ0FBQztvQkFDL0IsSUFBSSxDQUFDLFFBQVE7d0JBQUUsT0FBTyxFQUFFLENBQUM7b0JBQ3pCLE1BQU0sVUFBVSxHQUFHLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFDM0MsSUFBSSxDQUFDLFVBQVUsRUFBRSxhQUFhO3dCQUFFLE9BQU8sRUFBRSxDQUFDO29CQUMxQyxJQUFJLElBQUksS0FBSyxTQUFTO3dCQUFFLE9BQU8sVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDO29CQUNwRCxJQUFJLElBQUksS0FBSyxZQUFZO3dCQUFFLE9BQU8sVUFBVSxDQUFDLFVBQVUsRUFBRSxDQUFDO29CQUMxRCxPQUFPLENBQUMsR0FBRyxVQUFVLENBQUMsT0FBTyxFQUFFLEVBQUUsR0FBRyxVQUFVLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztnQkFDOUQsQ0FBQyxDQUFDLENBQ0YsQ0FBQztZQUNILENBQUM7WUFDRCxPQUFPLGNBQWMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFFLENBQUM7UUFDbEMsQ0FBQyxDQUFDO1FBRUYsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsRUFBRTtZQUM1QixhQUFhLEVBQUU7Z0JBQ2QsR0FBRyxFQUFFLENBQUMsVUFBVSxFQUFFLEVBQUU7b0JBQ25CLFNBQVMsQ0FBQyxHQUFHLEVBQUU7d0JBQ2QsSUFBSSxVQUFVLEtBQUssV0FBVyxFQUFFLEVBQUUsQ0FBQzs0QkFDbEMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQzt3QkFDM0IsQ0FBQztvQkFDRixDQUFDLENBQUMsQ0FBQztnQkFDSixDQUFDO2dCQUNELEdBQUcsRUFBRSxXQUFXO2FBQ2hCO1lBQ0QsUUFBUSxFQUFFLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRTtTQUM3QixDQUFDLENBQUM7UUFFSCxPQUFPLEdBQStCLENBQUM7SUFDeEMsQ0FBQyxDQUFDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGVzdHJveVJlZiwgRWxlbWVudFJlZiwgY29tcHV0ZWQsIGluamVjdCwgc2lnbmFsLCB1bnRyYWNrZWQsIHR5cGUgSW5qZWN0b3IsIHR5cGUgU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBhc3NlcnRJbmplY3RvciB9IGZyb20gJ25neHRlbnNpb24vYXNzZXJ0LWluamVjdG9yJztcbmltcG9ydCB7IGdldExvY2FsU3RhdGUsIHR5cGUgTmd0SW5zdGFuY2VOb2RlIH0gZnJvbSAnLi9pbnN0YW5jZSc7XG5pbXBvcnQgeyBpcyB9IGZyb20gJy4vdXRpbHMvaXMnO1xuXG5leHBvcnQgdHlwZSBOZ3RJbmplY3RlZFJlZjxURWxlbWVudD4gPSBFbGVtZW50UmVmPFRFbGVtZW50PiAmIHtcblx0LyogY29uc3VtZXJzIHNob3VsZCB1c2UgdGhpcyBmb3IgbGlzdGVudGluZyB0byBjaGlsZHJlbiBjaGFuZ2VzIG9uIHRoaXMgcmVmICovXG5cdGNoaWxkcmVuOiAodHlwZT86ICdvYmplY3RzJyB8ICdub25PYmplY3RzJyB8ICdib3RoJykgPT4gU2lnbmFsPE5ndEluc3RhbmNlTm9kZVtdPjtcbn07XG5cbmV4cG9ydCB0eXBlIE5ndFJlZjxURWxlbWVudD4gPSBURWxlbWVudCB8IE5ndEluamVjdGVkUmVmPFRFbGVtZW50PjtcblxuZXhwb3J0IGZ1bmN0aW9uIGluamVjdE5ndFJlZjxURWxlbWVudD4oXG5cdGluaXRpYWw6IEVsZW1lbnRSZWY8VEVsZW1lbnQ+IHwgVEVsZW1lbnQgPSBudWxsISxcblx0aW5qZWN0b3I/OiBJbmplY3Rvcixcbik6IE5ndEluamVjdGVkUmVmPFRFbGVtZW50PiB7XG5cdHJldHVybiBhc3NlcnRJbmplY3RvcihpbmplY3ROZ3RSZWYsIGluamVjdG9yLCAoKSA9PiB7XG5cdFx0Y29uc3QgcmVmID0gaXMucmVmKGluaXRpYWwpID8gaW5pdGlhbCA6IG5ldyBFbGVtZW50UmVmKGluaXRpYWwgYXMgVEVsZW1lbnQpO1xuXHRcdGNvbnN0IHJlZlNpZ25hbCA9IHNpZ25hbChyZWYubmF0aXZlRWxlbWVudCwgeyBlcXVhbDogT2JqZWN0LmlzIH0pO1xuXHRcdGNvbnN0IHJlYWRvbmx5UmVmID0gcmVmU2lnbmFsLmFzUmVhZG9ubHkoKTtcblx0XHRjb25zdCBjb21wdXRlZENhY2hlZCA9IG5ldyBNYXAoKTtcblxuXHRcdGluamVjdChEZXN0cm95UmVmKS5vbkRlc3Ryb3koKCkgPT4gdm9pZCBjb21wdXRlZENhY2hlZC5jbGVhcigpKTtcblxuXHRcdGNvbnN0IGNoaWxkcmVuID0gKHR5cGU6ICdvYmplY3RzJyB8ICdub25PYmplY3RzJyB8ICdib3RoJyA9ICdvYmplY3RzJykgPT4ge1xuXHRcdFx0aWYgKCFjb21wdXRlZENhY2hlZC5oYXModHlwZSkpIHtcblx0XHRcdFx0Y29tcHV0ZWRDYWNoZWQuc2V0KFxuXHRcdFx0XHRcdHR5cGUsXG5cdFx0XHRcdFx0Y29tcHV0ZWQoKCkgPT4ge1xuXHRcdFx0XHRcdFx0Y29uc3QgaW5zdGFuY2UgPSByZWFkb25seVJlZigpO1xuXHRcdFx0XHRcdFx0aWYgKCFpbnN0YW5jZSkgcmV0dXJuIFtdO1xuXHRcdFx0XHRcdFx0Y29uc3QgbG9jYWxTdGF0ZSA9IGdldExvY2FsU3RhdGUoaW5zdGFuY2UpO1xuXHRcdFx0XHRcdFx0aWYgKCFsb2NhbFN0YXRlPy5pbnN0YW5jZVN0b3JlKSByZXR1cm4gW107XG5cdFx0XHRcdFx0XHRpZiAodHlwZSA9PT0gJ29iamVjdHMnKSByZXR1cm4gbG9jYWxTdGF0ZS5vYmplY3RzKCk7XG5cdFx0XHRcdFx0XHRpZiAodHlwZSA9PT0gJ25vbk9iamVjdHMnKSByZXR1cm4gbG9jYWxTdGF0ZS5ub25PYmplY3RzKCk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gWy4uLmxvY2FsU3RhdGUub2JqZWN0cygpLCAuLi5sb2NhbFN0YXRlLm5vbk9iamVjdHMoKV07XG5cdFx0XHRcdFx0fSksXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gY29tcHV0ZWRDYWNoZWQuZ2V0KHR5cGUpITtcblx0XHR9O1xuXG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnRpZXMocmVmLCB7XG5cdFx0XHRuYXRpdmVFbGVtZW50OiB7XG5cdFx0XHRcdHNldDogKG5ld0VsZW1lbnQpID0+IHtcblx0XHRcdFx0XHR1bnRyYWNrZWQoKCkgPT4ge1xuXHRcdFx0XHRcdFx0aWYgKG5ld0VsZW1lbnQgIT09IHJlYWRvbmx5UmVmKCkpIHtcblx0XHRcdFx0XHRcdFx0cmVmU2lnbmFsLnNldChuZXdFbGVtZW50KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSxcblx0XHRcdFx0Z2V0OiByZWFkb25seVJlZixcblx0XHRcdH0sXG5cdFx0XHRjaGlsZHJlbjogeyB2YWx1ZTogY2hpbGRyZW4gfSxcblx0XHR9KTtcblxuXHRcdHJldHVybiByZWYgYXMgTmd0SW5qZWN0ZWRSZWY8VEVsZW1lbnQ+O1xuXHR9KTtcbn1cbiJdfQ==
@@ -0,0 +1,7 @@
1
+ import { createInjectionToken } from 'ngxtension/create-injection-token';
2
+ const catalogue = {};
3
+ export function extend(objects) {
4
+ Object.assign(catalogue, objects);
5
+ }
6
+ export const [injectNgtCatalogue] = createInjectionToken(() => catalogue);
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2F0YWxvZ3VlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvcmVuZGVyZXIvY2F0YWxvZ3VlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBSXpFLE1BQU0sU0FBUyxHQUFzQyxFQUFFLENBQUM7QUFFeEQsTUFBTSxVQUFVLE1BQU0sQ0FBQyxPQUFlO0lBQ3JDLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ25DLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsb0JBQW9CLENBQUMsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcmVhdGVJbmplY3Rpb25Ub2tlbiB9IGZyb20gJ25neHRlbnNpb24vY3JlYXRlLWluamVjdGlvbi10b2tlbic7XG5cbmV4cG9ydCB0eXBlIE5ndEFueUNvbnN0cnVjdG9yID0gbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55O1xuXG5jb25zdCBjYXRhbG9ndWU6IFJlY29yZDxzdHJpbmcsIE5ndEFueUNvbnN0cnVjdG9yPiA9IHt9O1xuXG5leHBvcnQgZnVuY3Rpb24gZXh0ZW5kKG9iamVjdHM6IG9iamVjdCk6IHZvaWQge1xuXHRPYmplY3QuYXNzaWduKGNhdGFsb2d1ZSwgb2JqZWN0cyk7XG59XG5cbmV4cG9ydCBjb25zdCBbaW5qZWN0Tmd0Q2F0YWxvZ3VlXSA9IGNyZWF0ZUluamVjdGlvblRva2VuKCgpID0+IGNhdGFsb2d1ZSk7XG4iXX0=
@@ -0,0 +1,21 @@
1
+ export const ROUTED_SCENE = '__ngt_renderer_is_routed_scene__';
2
+ export const HTML = '__ngt_renderer_is_html';
3
+ export const SPECIAL_INTERNAL_ADD_COMMENT = '__ngt_renderer_add_comment__';
4
+ export const SPECIAL_DOM_TAG = {
5
+ NGT_PORTAL: 'ngt-portal',
6
+ NGT_PRIMITIVE: 'ngt-primitive',
7
+ NGT_VALUE: 'ngt-value',
8
+ };
9
+ export const SPECIAL_PROPERTIES = {
10
+ COMPOUND: 'ngtCompound',
11
+ RENDER_PRIORITY: 'priority',
12
+ ATTACH: 'attach',
13
+ RAW_VALUE: 'rawValue',
14
+ REF: 'ref',
15
+ };
16
+ export const SPECIAL_EVENTS = {
17
+ BEFORE_RENDER: 'beforeRender',
18
+ AFTER_UPDATE: 'afterUpdate',
19
+ AFTER_ATTACH: 'afterAttach',
20
+ };
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvcmVuZGVyZXIvY29uc3RhbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxrQ0FBa0MsQ0FBQztBQUMvRCxNQUFNLENBQUMsTUFBTSxJQUFJLEdBQUcsd0JBQXdCLENBQUM7QUFDN0MsTUFBTSxDQUFDLE1BQU0sNEJBQTRCLEdBQUcsOEJBQThCLENBQUM7QUFFM0UsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHO0lBQzlCLFVBQVUsRUFBRSxZQUFZO0lBQ3hCLGFBQWEsRUFBRSxlQUFlO0lBQzlCLFNBQVMsRUFBRSxXQUFXO0NBQ2IsQ0FBQztBQUVYLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHO0lBQ2pDLFFBQVEsRUFBRSxhQUFhO0lBQ3ZCLGVBQWUsRUFBRSxVQUFVO0lBQzNCLE1BQU0sRUFBRSxRQUFRO0lBQ2hCLFNBQVMsRUFBRSxVQUFVO0lBQ3JCLEdBQUcsRUFBRSxLQUFLO0NBQ0QsQ0FBQztBQUVYLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRztJQUM3QixhQUFhLEVBQUUsY0FBYztJQUM3QixZQUFZLEVBQUUsYUFBYTtJQUMzQixZQUFZLEVBQUUsYUFBYTtDQUNsQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IFJPVVRFRF9TQ0VORSA9ICdfX25ndF9yZW5kZXJlcl9pc19yb3V0ZWRfc2NlbmVfXyc7XG5leHBvcnQgY29uc3QgSFRNTCA9ICdfX25ndF9yZW5kZXJlcl9pc19odG1sJztcbmV4cG9ydCBjb25zdCBTUEVDSUFMX0lOVEVSTkFMX0FERF9DT01NRU5UID0gJ19fbmd0X3JlbmRlcmVyX2FkZF9jb21tZW50X18nO1xuXG5leHBvcnQgY29uc3QgU1BFQ0lBTF9ET01fVEFHID0ge1xuXHROR1RfUE9SVEFMOiAnbmd0LXBvcnRhbCcsXG5cdE5HVF9QUklNSVRJVkU6ICduZ3QtcHJpbWl0aXZlJyxcblx0TkdUX1ZBTFVFOiAnbmd0LXZhbHVlJyxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBTUEVDSUFMX1BST1BFUlRJRVMgPSB7XG5cdENPTVBPVU5EOiAnbmd0Q29tcG91bmQnLFxuXHRSRU5ERVJfUFJJT1JJVFk6ICdwcmlvcml0eScsXG5cdEFUVEFDSDogJ2F0dGFjaCcsXG5cdFJBV19WQUxVRTogJ3Jhd1ZhbHVlJyxcblx0UkVGOiAncmVmJyxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBTUEVDSUFMX0VWRU5UUyA9IHtcblx0QkVGT1JFX1JFTkRFUjogJ2JlZm9yZVJlbmRlcicsXG5cdEFGVEVSX1VQREFURTogJ2FmdGVyVXBkYXRlJyxcblx0QUZURVJfQVRUQUNIOiAnYWZ0ZXJBdHRhY2gnLFxufSBhcyBjb25zdDtcbiJdfQ==