angular-three 2.0.0-beta.4 → 2.0.0-beta.41

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 (153) hide show
  1. package/README.md +4 -147
  2. package/esm2022/angular-three.mjs +1 -1
  3. package/esm2022/index.mjs +10 -11
  4. package/esm2022/lib/before-render.mjs +13 -0
  5. package/esm2022/lib/canvas.mjs +137 -161
  6. package/esm2022/lib/directives/args.mjs +13 -11
  7. package/esm2022/lib/directives/common.mjs +28 -27
  8. package/esm2022/lib/directives/key.mjs +29 -0
  9. package/esm2022/lib/directives/parent.mjs +13 -11
  10. package/esm2022/lib/dom/events.mjs +6 -1
  11. package/esm2022/lib/events.mjs +77 -60
  12. package/esm2022/lib/instance.mjs +65 -0
  13. package/esm2022/lib/loader.mjs +35 -41
  14. package/esm2022/lib/loop.mjs +6 -3
  15. package/esm2022/lib/portal.mjs +103 -112
  16. package/esm2022/lib/ref.mjs +48 -0
  17. package/esm2022/lib/renderer/catalogue.mjs +7 -0
  18. package/esm2022/lib/renderer/constants.mjs +21 -0
  19. package/esm2022/lib/renderer/index.mjs +419 -0
  20. package/esm2022/lib/renderer/store.mjs +148 -112
  21. package/esm2022/lib/renderer/utils.mjs +63 -48
  22. package/esm2022/lib/roots.mjs +249 -0
  23. package/esm2022/lib/routed-scene.mjs +11 -8
  24. package/esm2022/lib/store.mjs +207 -0
  25. package/esm2022/lib/three-types.mjs +2 -2
  26. package/esm2022/lib/types.mjs +1 -1
  27. package/esm2022/lib/utils/apply-props.mjs +23 -11
  28. package/esm2022/lib/utils/attach.mjs +2 -2
  29. package/esm2022/lib/utils/is.mjs +1 -1
  30. package/esm2022/lib/utils/make.mjs +1 -1
  31. package/esm2022/lib/utils/safe-detect-changes.mjs +15 -13
  32. package/esm2022/lib/utils/signal-store.mjs +99 -0
  33. package/esm2022/lib/utils/update.mjs +1 -1
  34. package/fesm2022/angular-three.mjs +2014 -1882
  35. package/fesm2022/angular-three.mjs.map +1 -1
  36. package/index.d.ts +9 -10
  37. package/lib/{di/before-render.d.ts → before-render.d.ts} +1 -1
  38. package/lib/canvas.d.ts +82 -12
  39. package/lib/directives/args.d.ts +2 -2
  40. package/lib/directives/common.d.ts +5 -1
  41. package/lib/directives/key.d.ts +10 -0
  42. package/lib/directives/parent.d.ts +5 -5
  43. package/lib/dom/events.d.ts +3 -2
  44. package/lib/events.d.ts +78 -2
  45. package/lib/instance.d.ts +36 -0
  46. package/lib/loader.d.ts +21 -3
  47. package/lib/loop.d.ts +68 -6
  48. package/lib/portal.d.ts +21 -12
  49. package/lib/{di/ref.d.ts → ref.d.ts} +3 -2
  50. package/lib/renderer/catalogue.d.ts +13 -0
  51. package/lib/renderer/constants.d.ts +20 -0
  52. package/lib/renderer/index.d.ts +5 -0
  53. package/lib/renderer/store.d.ts +21 -15
  54. package/lib/renderer/utils.d.ts +29 -19
  55. package/lib/roots.d.ts +11 -0
  56. package/lib/routed-scene.d.ts +1 -1
  57. package/lib/store.d.ts +147 -0
  58. package/lib/three-types.d.ts +5 -5
  59. package/lib/types.d.ts +1 -309
  60. package/lib/utils/apply-props.d.ts +4 -2
  61. package/lib/utils/attach.d.ts +5 -3
  62. package/lib/utils/is.d.ts +5 -4
  63. package/lib/utils/make.d.ts +12 -1
  64. package/lib/utils/safe-detect-changes.d.ts +2 -2
  65. package/lib/utils/signal-store.d.ts +17 -0
  66. package/lib/utils/update.d.ts +1 -1
  67. package/metadata.json +1 -1
  68. package/package.json +24 -5
  69. package/plugin/generators.json +57 -17
  70. package/plugin/migrations.json +27 -0
  71. package/plugin/package.json +22 -4
  72. package/plugin/src/generators/init/compat.d.ts +3 -1
  73. package/plugin/src/generators/init/compat.js +2 -2
  74. package/plugin/src/generators/init/compat.js.map +1 -1
  75. package/plugin/src/generators/init/files/experience/experience.component.html__tmpl__ +4 -0
  76. package/plugin/src/generators/init/files/experience/experience.component.ts__tmpl__ +18 -0
  77. package/plugin/src/generators/init/generator.d.ts +6 -0
  78. package/plugin/src/generators/init/generator.js +160 -0
  79. package/plugin/src/generators/init/generator.js.map +1 -0
  80. package/plugin/src/generators/init/schema.json +15 -4
  81. package/plugin/src/generators/init-cannon/compat.d.ts +2 -0
  82. package/plugin/src/generators/init-cannon/compat.js +6 -0
  83. package/plugin/src/generators/init-cannon/compat.js.map +1 -0
  84. package/plugin/src/generators/init-cannon/generator.d.ts +2 -0
  85. package/plugin/src/generators/init-cannon/generator.js +23 -0
  86. package/plugin/src/generators/init-cannon/generator.js.map +1 -0
  87. package/plugin/src/generators/init-cannon/schema.json +6 -0
  88. package/plugin/src/generators/init-postprocessing/compat.d.ts +2 -0
  89. package/plugin/src/generators/init-postprocessing/compat.js +6 -0
  90. package/plugin/src/generators/init-postprocessing/compat.js.map +1 -0
  91. package/plugin/src/generators/init-postprocessing/generator.d.ts +2 -0
  92. package/plugin/src/generators/init-postprocessing/generator.js +21 -0
  93. package/plugin/src/generators/init-postprocessing/generator.js.map +1 -0
  94. package/plugin/src/generators/init-postprocessing/schema.json +6 -0
  95. package/plugin/src/generators/init-rapier/compat.d.ts +2 -0
  96. package/plugin/src/generators/init-rapier/compat.js +6 -0
  97. package/plugin/src/generators/init-rapier/compat.js.map +1 -0
  98. package/plugin/src/generators/init-rapier/generator.d.ts +2 -0
  99. package/plugin/src/generators/init-rapier/generator.js +22 -0
  100. package/plugin/src/generators/init-rapier/generator.js.map +1 -0
  101. package/plugin/src/generators/init-rapier/schema.json +6 -0
  102. package/plugin/src/generators/init-soba/compat.d.ts +2 -0
  103. package/plugin/src/generators/init-soba/compat.js +6 -0
  104. package/plugin/src/generators/init-soba/compat.js.map +1 -0
  105. package/plugin/src/generators/init-soba/generator.d.ts +2 -0
  106. package/plugin/src/generators/init-soba/generator.js +27 -0
  107. package/plugin/src/generators/init-soba/generator.js.map +1 -0
  108. package/plugin/src/generators/init-soba/schema.json +6 -0
  109. package/plugin/src/generators/utils.d.ts +2 -0
  110. package/plugin/src/generators/utils.js +34 -0
  111. package/plugin/src/generators/utils.js.map +1 -0
  112. package/plugin/src/generators/versions.d.ts +14 -0
  113. package/plugin/src/generators/versions.js +18 -0
  114. package/plugin/src/generators/versions.js.map +1 -0
  115. package/plugin/src/index.d.ts +5 -1
  116. package/plugin/src/index.js +11 -3
  117. package/plugin/src/index.js.map +1 -1
  118. package/plugin/src/migrations/migrate-to-ngxtension/compat.d.ts +2 -0
  119. package/plugin/src/migrations/migrate-to-ngxtension/compat.js +6 -0
  120. package/plugin/src/migrations/migrate-to-ngxtension/compat.js.map +1 -0
  121. package/plugin/src/migrations/migrate-to-ngxtension/migrate-to-ngxtension.d.ts +2 -0
  122. package/plugin/src/migrations/migrate-to-ngxtension/migrate-to-ngxtension.js +55 -0
  123. package/plugin/src/migrations/migrate-to-ngxtension/migrate-to-ngxtension.js.map +1 -0
  124. package/web-types.json +1 -1
  125. package/esm2022/lib/di/before-render.mjs +0 -13
  126. package/esm2022/lib/di/catalogue.mjs +0 -7
  127. package/esm2022/lib/di/ref.mjs +0 -49
  128. package/esm2022/lib/directives/repeat.mjs +0 -18
  129. package/esm2022/lib/renderer/di.mjs +0 -3
  130. package/esm2022/lib/renderer/enums.mjs +0 -2
  131. package/esm2022/lib/renderer/provider.mjs +0 -18
  132. package/esm2022/lib/renderer/renderer.mjs +0 -368
  133. package/esm2022/lib/stores/signal.store.mjs +0 -79
  134. package/esm2022/lib/stores/store.mjs +0 -420
  135. package/esm2022/lib/utils/assert-in-injection-context.mjs +0 -14
  136. package/esm2022/lib/utils/instance.mjs +0 -63
  137. package/esm2022/lib/utils/signal.mjs +0 -24
  138. package/esm2022/lib/utils/timing.mjs +0 -21
  139. package/lib/di/catalogue.d.ts +0 -3
  140. package/lib/directives/repeat.d.ts +0 -7
  141. package/lib/renderer/di.d.ts +0 -2
  142. package/lib/renderer/enums.d.ts +0 -26
  143. package/lib/renderer/provider.d.ts +0 -8
  144. package/lib/renderer/renderer.d.ts +0 -49
  145. package/lib/stores/signal.store.d.ts +0 -21
  146. package/lib/stores/store.d.ts +0 -13
  147. package/lib/utils/assert-in-injection-context.d.ts +0 -2
  148. package/lib/utils/instance.d.ts +0 -4
  149. package/lib/utils/signal.d.ts +0 -2
  150. package/lib/utils/timing.d.ts +0 -4
  151. package/plugin/src/generators/init/init.d.ts +0 -5
  152. package/plugin/src/generators/init/init.js +0 -56
  153. package/plugin/src/generators/init/init.js.map +0 -1
@@ -1,28 +1,42 @@
1
- import { EventEmitter, untracked } from '@angular/core';
1
+ import { ChangeDetectorRef, EventEmitter, NgZone, untracked } from '@angular/core';
2
2
  import { removeInteractivity } from '../events';
3
+ import { getLocalState, invalidateInstance } from '../instance';
3
4
  import { attach, detach } from '../utils/attach';
4
- import { getLocalState, invalidateInstance } from '../utils/instance';
5
5
  import { is } from '../utils/is';
6
6
  import { safeDetectChanges } from '../utils/safe-detect-changes';
7
- export const ROUTED_SCENE = '__ngt_renderer_is_routed_scene__';
8
- export const SPECIAL_INTERNAL_ADD_COMMENT = '__ngt_renderer_add_comment__';
9
- export const SPECIAL_DOM_TAG = {
10
- NGT_PORTAL: 'ngt-portal',
11
- NGT_PRIMITIVE: 'ngt-primitive',
12
- NGT_VALUE: 'ngt-value',
13
- };
14
- export const SPECIAL_PROPERTIES = {
15
- COMPOUND: 'ngtCompound',
16
- RENDER_PRIORITY: 'priority',
17
- ATTACH: 'attach',
18
- VALUE: 'rawValue',
19
- REF: 'ref',
20
- };
21
- const SPECIAL_EVENTS = {
22
- BEFORE_RENDER: 'beforeRender',
23
- AFTER_UPDATE: 'afterUpdate',
24
- AFTER_ATTACH: 'afterAttach',
25
- };
7
+ import { SPECIAL_EVENTS } from './constants';
8
+ // @internal
9
+ export var NgtRendererClassId;
10
+ (function (NgtRendererClassId) {
11
+ NgtRendererClassId[NgtRendererClassId["type"] = 0] = "type";
12
+ NgtRendererClassId[NgtRendererClassId["parent"] = 1] = "parent";
13
+ NgtRendererClassId[NgtRendererClassId["injectedParent"] = 2] = "injectedParent";
14
+ NgtRendererClassId[NgtRendererClassId["children"] = 3] = "children";
15
+ NgtRendererClassId[NgtRendererClassId["destroyed"] = 4] = "destroyed";
16
+ NgtRendererClassId[NgtRendererClassId["compound"] = 5] = "compound";
17
+ NgtRendererClassId[NgtRendererClassId["compoundParent"] = 6] = "compoundParent";
18
+ NgtRendererClassId[NgtRendererClassId["compounded"] = 7] = "compounded";
19
+ NgtRendererClassId[NgtRendererClassId["queueOps"] = 8] = "queueOps";
20
+ NgtRendererClassId[NgtRendererClassId["attributes"] = 9] = "attributes";
21
+ NgtRendererClassId[NgtRendererClassId["properties"] = 10] = "properties";
22
+ NgtRendererClassId[NgtRendererClassId["rawValue"] = 11] = "rawValue";
23
+ NgtRendererClassId[NgtRendererClassId["ref"] = 12] = "ref";
24
+ NgtRendererClassId[NgtRendererClassId["portalContainer"] = 13] = "portalContainer";
25
+ NgtRendererClassId[NgtRendererClassId["injectorFactory"] = 14] = "injectorFactory";
26
+ })(NgtRendererClassId || (NgtRendererClassId = {}));
27
+ // @internal
28
+ export var NgtCompoundClassId;
29
+ (function (NgtCompoundClassId) {
30
+ NgtCompoundClassId[NgtCompoundClassId["applyFirst"] = 0] = "applyFirst";
31
+ NgtCompoundClassId[NgtCompoundClassId["props"] = 1] = "props";
32
+ })(NgtCompoundClassId || (NgtCompoundClassId = {}));
33
+ // @internal
34
+ export var NgtQueueOpClassId;
35
+ (function (NgtQueueOpClassId) {
36
+ NgtQueueOpClassId[NgtQueueOpClassId["type"] = 0] = "type";
37
+ NgtQueueOpClassId[NgtQueueOpClassId["op"] = 1] = "op";
38
+ NgtQueueOpClassId[NgtQueueOpClassId["done"] = 2] = "done";
39
+ })(NgtQueueOpClassId || (NgtQueueOpClassId = {}));
26
40
  export function attachThreeChild(parent, child) {
27
41
  const pLS = getLocalState(parent);
28
42
  const cLS = getLocalState(child);
@@ -33,7 +47,7 @@ export function attachThreeChild(parent, child) {
33
47
  let added = false;
34
48
  // assign store on child if not already exist
35
49
  // or child store is the parent of parent store
36
- if (!cLS.store || cLS.store === pLS.store.get('previousStore')) {
50
+ if (!cLS.store || cLS.store === pLS.store.get('previousRoot')) {
37
51
  cLS.store = pLS.store;
38
52
  }
39
53
  if (cLS.attach) {
@@ -59,13 +73,15 @@ export function attachThreeChild(parent, child) {
59
73
  }
60
74
  // attach
61
75
  if (cLS.isRaw) {
62
- if (cLS.parent) {
63
- cLS.parent.set(parent);
76
+ if (cLS.parent && cLS.parent() !== parent) {
77
+ untracked(() => {
78
+ cLS.parent.set(parent);
79
+ });
64
80
  }
65
81
  // at this point we don't have rawValue yet, so we bail and wait until the Renderer recalls attach
66
- if (child.__ngt_renderer__[11 /* NgtRendererClassId.rawValue */] === undefined)
82
+ if (child.__ngt_renderer__[NgtRendererClassId.rawValue] === undefined)
67
83
  return;
68
- attach(parent, child.__ngt_renderer__[11 /* NgtRendererClassId.rawValue */], attachProp);
84
+ attach(parent, child.__ngt_renderer__[NgtRendererClassId.rawValue], attachProp);
69
85
  }
70
86
  else {
71
87
  attach(parent, child, attachProp);
@@ -79,8 +95,10 @@ export function attachThreeChild(parent, child) {
79
95
  added = true;
80
96
  }
81
97
  pLS.add(child, added ? 'objects' : 'nonObjects');
82
- if (cLS.parent) {
83
- cLS.parent.set(parent);
98
+ if (cLS.parent && cLS.parent() !== parent) {
99
+ untracked(() => {
100
+ cLS.parent.set(parent);
101
+ });
84
102
  }
85
103
  if (cLS.afterAttach)
86
104
  cLS.afterAttach.emit({ parent, node: child });
@@ -91,11 +109,13 @@ export function removeThreeChild(parent, child, dispose) {
91
109
  const pLS = getLocalState(parent);
92
110
  const cLS = getLocalState(child);
93
111
  // clear parent ref
94
- cLS.parent?.set(null);
112
+ untracked(() => {
113
+ cLS.parent?.set(null);
114
+ });
95
115
  // remove child from parent
96
- if (untracked(pLS.objects))
116
+ if (pLS.objects && untracked(pLS.objects))
97
117
  pLS.remove(child, 'objects');
98
- if (untracked(pLS.nonObjects))
118
+ if (pLS.nonObjects && untracked(pLS.nonObjects))
99
119
  pLS.remove(child, 'nonObjects');
100
120
  if (cLS.attach) {
101
121
  detach(parent, child, cLS.attach);
@@ -119,7 +139,15 @@ function removeThreeRecursive(array, parent, dispose) {
119
139
  if (array)
120
140
  [...array].forEach((child) => removeThreeChild(parent, child, dispose));
121
141
  }
122
- export function processThreeEvent(instance, priority, eventName, callback, zone, cdr, targetCdr) {
142
+ export function kebabToPascal(str) {
143
+ // split the string at each hyphen
144
+ const parts = str.split('-');
145
+ // map over the parts, capitalizing the first letter of each part
146
+ const pascalParts = parts.map((part) => part.charAt(0).toUpperCase() + part.slice(1));
147
+ // join the parts together to create the final PascalCase string
148
+ return pascalParts.join('');
149
+ }
150
+ export function processThreeEvent(instance, priority, eventName, callback, zone, rootCdr, targetCdr) {
123
151
  const lS = getLocalState(instance);
124
152
  if (eventName === SPECIAL_EVENTS.BEFORE_RENDER) {
125
153
  return lS.store
@@ -143,8 +171,7 @@ export function processThreeEvent(instance, priority, eventName, callback, zone,
143
171
  previousHandler(event);
144
172
  zone.run(() => {
145
173
  callback(event);
146
- safeDetectChanges(targetCdr);
147
- safeDetectChanges(cdr);
174
+ safeDetectChanges(targetCdr, rootCdr);
148
175
  });
149
176
  };
150
177
  Object.assign(lS.handlers, { [eventName]: updatedCallback });
@@ -158,6 +185,7 @@ export function processThreeEvent(instance, priority, eventName, callback, zone,
158
185
  return () => {
159
186
  const localState = getLocalState(instance);
160
187
  if (localState && localState.eventCount) {
188
+ localState.eventCount -= 1;
161
189
  const index = localState.store
162
190
  .get('internal', 'interaction')
163
191
  .findIndex((obj) => obj.uuid === instance.uuid);
@@ -166,17 +194,4 @@ export function processThreeEvent(instance, priority, eventName, callback, zone,
166
194
  }
167
195
  };
168
196
  }
169
- export function eventToHandler(callback) {
170
- return (event) => {
171
- callback(event);
172
- };
173
- }
174
- export function kebabToPascal(str) {
175
- // split the string at each hyphen
176
- const parts = str.split('-');
177
- // map over the parts, capitalizing the first letter of each part
178
- const pascalParts = parts.map((part) => part.charAt(0).toUpperCase() + part.slice(1));
179
- // join the parts together to create the final PascalCase string
180
- return pascalParts.join('');
181
- }
182
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItdGhyZWUvc3JjL2xpYi9yZW5kZXJlci91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBdUMsTUFBTSxlQUFlLENBQUM7QUFFN0YsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRWhELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDakQsT0FBTyxFQUFFLGFBQWEsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDakMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFHakUsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLGtDQUFrQyxDQUFDO0FBQy9ELE1BQU0sQ0FBQyxNQUFNLDRCQUE0QixHQUFHLDhCQUE4QixDQUFDO0FBRTNFLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRztJQUMzQixVQUFVLEVBQUUsWUFBWTtJQUN4QixhQUFhLEVBQUUsZUFBZTtJQUM5QixTQUFTLEVBQUUsV0FBVztDQUNoQixDQUFDO0FBRVgsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUc7SUFDOUIsUUFBUSxFQUFFLGFBQWE7SUFDdkIsZUFBZSxFQUFFLFVBQVU7SUFDM0IsTUFBTSxFQUFFLFFBQVE7SUFDaEIsS0FBSyxFQUFFLFVBQVU7SUFDakIsR0FBRyxFQUFFLEtBQUs7Q0FDSixDQUFDO0FBRVgsTUFBTSxjQUFjLEdBQUc7SUFDbkIsYUFBYSxFQUFFLGNBQWM7SUFDN0IsWUFBWSxFQUFFLGFBQWE7SUFDM0IsWUFBWSxFQUFFLGFBQWE7Q0FDckIsQ0FBQztBQUVYLE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxNQUF1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QUFDTixDQUFDO0FBRUQsTUFBTSxVQUFVLGFBQWEsQ0FBQyxHQUFXO0lBQ3JDLGtDQUFrQztJQUNsQyxNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRTdCLGlFQUFpRTtJQUNqRSxNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUV0RixnRUFBZ0U7SUFDaEUsT0FBTyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2hDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFdmVudEVtaXR0ZXIsIHVudHJhY2tlZCwgdHlwZSBDaGFuZ2VEZXRlY3RvclJlZiwgdHlwZSBOZ1pvbmUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHN1cHBvcnRlZEV2ZW50cyB9IGZyb20gJy4uL2RvbS9ldmVudHMnO1xuaW1wb3J0IHsgcmVtb3ZlSW50ZXJhY3Rpdml0eSB9IGZyb20gJy4uL2V2ZW50cyc7XG5pbXBvcnQgdHlwZSB7IE5ndEV2ZW50SGFuZGxlcnMsIE5ndEluc3RhbmNlTm9kZSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IGF0dGFjaCwgZGV0YWNoIH0gZnJvbSAnLi4vdXRpbHMvYXR0YWNoJztcbmltcG9ydCB7IGdldExvY2FsU3RhdGUsIGludmFsaWRhdGVJbnN0YW5jZSB9IGZyb20gJy4uL3V0aWxzL2luc3RhbmNlJztcbmltcG9ydCB7IGlzIH0gZnJvbSAnLi4vdXRpbHMvaXMnO1xuaW1wb3J0IHsgc2FmZURldGVjdENoYW5nZXMgfSBmcm9tICcuLi91dGlscy9zYWZlLWRldGVjdC1jaGFuZ2VzJztcbmltcG9ydCB7IE5ndFJlbmRlcmVyQ2xhc3NJZCB9IGZyb20gJy4vZW51bXMnO1xuXG5leHBvcnQgY29uc3QgUk9VVEVEX1NDRU5FID0gJ19fbmd0X3JlbmRlcmVyX2lzX3JvdXRlZF9zY2VuZV9fJztcbmV4cG9ydCBjb25zdCBTUEVDSUFMX0lOVEVSTkFMX0FERF9DT01NRU5UID0gJ19fbmd0X3JlbmRlcmVyX2FkZF9jb21tZW50X18nO1xuXG5leHBvcnQgY29uc3QgU1BFQ0lBTF9ET01fVEFHID0ge1xuICAgIE5HVF9QT1JUQUw6ICduZ3QtcG9ydGFsJyxcbiAgICBOR1RfUFJJTUlUSVZFOiAnbmd0LXByaW1pdGl2ZScsXG4gICAgTkdUX1ZBTFVFOiAnbmd0LXZhbHVlJyxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBTUEVDSUFMX1BST1BFUlRJRVMgPSB7XG4gICAgQ09NUE9VTkQ6ICduZ3RDb21wb3VuZCcsXG4gICAgUkVOREVSX1BSSU9SSVRZOiAncHJpb3JpdHknLFxuICAgIEFUVEFDSDogJ2F0dGFjaCcsXG4gICAgVkFMVUU6ICdyYXdWYWx1ZScsXG4gICAgUkVGOiAncmVmJyxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IFNQRUNJQUxfRVZFTlRTID0ge1xuICAgIEJFRk9SRV9SRU5ERVI6ICdiZWZvcmVSZW5kZXInLFxuICAgIEFGVEVSX1VQREFURTogJ2FmdGVyVXBkYXRlJyxcbiAgICBBRlRFUl9BVFRBQ0g6ICdhZnRlckF0dGFjaCcsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgZnVuY3Rpb24gYXR0YWNoVGhyZWVDaGlsZChwYXJlbnQ6IE5ndEluc3RhbmNlTm9kZSwgY2hpbGQ6IE5ndEluc3RhbmNlTm9kZSkge1xuICAgIGNvbnN0IHBMUyA9IGdldExvY2FsU3RhdGUocGFyZW50KTtcbiAgICBjb25zdCBjTFMgPSBnZXRMb2NhbFN0YXRlKGNoaWxkKTtcblxuICAgIGlmICghcExTIHx8ICFjTFMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBbTkdUXSBUSFJFRSBpbnN0YW5jZXMgbmVlZCB0byBiZSBwcmVwYXJlZCB3aXRoIGxvY2FsIHN0YXRlLmApO1xuICAgIH1cblxuICAgIC8vIHdoZXRoZXIgdGhlIGNoaWxkIGlzIGFkZGVkIHRvIHRoZSBwYXJlbnQgd2l0aCBwYXJlbnQuYWRkKClcbiAgICBsZXQgYWRkZWQgPSBmYWxzZTtcblxuICAgIC8vIGFzc2lnbiBzdG9yZSBvbiBjaGlsZCBpZiBub3QgYWxyZWFkeSBleGlzdFxuICAgIC8vIG9yIGNoaWxkIHN0b3JlIGlzIHRoZSBwYXJlbnQgb2YgcGFyZW50IHN0b3JlXG4gICAgaWYgKCFjTFMuc3RvcmUgfHwgY0xTLnN0b3JlID09PSBwTFMuc3RvcmUuZ2V0KCdwcmV2aW91c1N0b3JlJykpIHtcbiAgICAgICAgY0xTLnN0b3JlID0gcExTLnN0b3JlO1xuICAgIH1cblxuICAgIGlmIChjTFMuYXR0YWNoKSB7XG4gICAgICAgIGNvbnN0IGF0dGFjaFByb3AgPSBjTFMuYXR0YWNoO1xuXG4gICAgICAgIGlmICh0eXBlb2YgYXR0YWNoUHJvcCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY29uc3QgYXR0YWNoQ2xlYW5VcCA9IGF0dGFjaFByb3AocGFyZW50LCBjaGlsZCwgY0xTLnN0b3JlKTtcbiAgICAgICAgICAgIGlmIChhdHRhY2hDbGVhblVwKSBjTFMucHJldmlvdXNBdHRhY2ggPSBhdHRhY2hDbGVhblVwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gd2Ugc2tpcCBhdHRhY2ggbm9uZSBpZiBzZXQgZXhwbGljaXRseVxuICAgICAgICAgICAgaWYgKGF0dGFjaFByb3BbMF0gPT09ICdub25lJykge1xuICAgICAgICAgICAgICAgIGludmFsaWRhdGVJbnN0YW5jZShjaGlsZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBoYW5kbGUgbWF0ZXJpYWwgYXJyYXlcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBhdHRhY2hQcm9wWzBdID09PSAnbWF0ZXJpYWwnICYmXG4gICAgICAgICAgICAgICAgYXR0YWNoUHJvcFsxXSAmJlxuICAgICAgICAgICAgICAgIHR5cGVvZiBOdW1iZXIoYXR0YWNoUHJvcFsxXSkgPT09ICdudW1iZXInICYmXG4gICAgICAgICAgICAgICAgaXMubWF0ZXJpYWwoY2hpbGQpICYmXG4gICAgICAgICAgICAgICAgIUFycmF5LmlzQXJyYXkocGFyZW50WydtYXRlcmlhbCddKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcGFyZW50WydtYXRlcmlhbCddID0gW107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGF0dGFjaFxuICAgICAgICAgICAgaWYgKGNMUy5pc1Jhdykge1xuICAgICAgICAgICAgICAgIGlmIChjTFMucGFyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGNMUy5wYXJlbnQuc2V0KHBhcmVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGF0IHRoaXMgcG9pbnQgd2UgZG9uJ3QgaGF2ZSByYXdWYWx1ZSB5ZXQsIHNvIHdlIGJhaWwgYW5kIHdhaXQgdW50aWwgdGhlIFJlbmRlcmVyIHJlY2FsbHMgYXR0YWNoXG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkLl9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLnJhd1ZhbHVlXSA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgICAgICAgICAgICAgYXR0YWNoKHBhcmVudCwgY2hpbGQuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQucmF3VmFsdWVdLCBhdHRhY2hQcm9wKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYXR0YWNoKHBhcmVudCwgY2hpbGQsIGF0dGFjaFByb3ApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gc2F2ZSB2YWx1ZVxuICAgICAgICAgICAgY0xTLnByZXZpb3VzQXR0YWNoID0gYXR0YWNoUHJvcC5yZWR1Y2UoKHZhbHVlLCBwcm9wZXJ0eSkgPT4gdmFsdWVbcHJvcGVydHldLCBwYXJlbnQpO1xuICAgICAgICB9XG4gICAgfSBlbHNlIGlmIChpcy5vYmplY3QzRChwYXJlbnQpICYmIGlzLm9iamVjdDNEKGNoaWxkKSkge1xuICAgICAgICBwYXJlbnQuYWRkKGNoaWxkKTtcbiAgICAgICAgYWRkZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIHBMUy5hZGQoY2hpbGQsIGFkZGVkID8gJ29iamVjdHMnIDogJ25vbk9iamVjdHMnKTtcblxuICAgIGlmIChjTFMucGFyZW50KSB7XG4gICAgICAgIGNMUy5wYXJlbnQuc2V0KHBhcmVudCk7XG4gICAgfVxuXG4gICAgaWYgKGNMUy5hZnRlckF0dGFjaCkgY0xTLmFmdGVyQXR0YWNoLmVtaXQoeyBwYXJlbnQsIG5vZGU6IGNoaWxkIH0pO1xuXG4gICAgaW52YWxpZGF0ZUluc3RhbmNlKGNoaWxkKTtcbiAgICBpbnZhbGlkYXRlSW5zdGFuY2UocGFyZW50KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZVRocmVlQ2hpbGQocGFyZW50OiBOZ3RJbnN0YW5jZU5vZGUsIGNoaWxkOiBOZ3RJbnN0YW5jZU5vZGUsIGRpc3Bvc2U/OiBib29sZWFuKSB7XG4gICAgY29uc3QgcExTID0gZ2V0TG9jYWxTdGF0ZShwYXJlbnQpO1xuICAgIGNvbnN0IGNMUyA9IGdldExvY2FsU3RhdGUoY2hpbGQpO1xuXG4gICAgLy8gY2xlYXIgcGFyZW50IHJlZlxuICAgIGNMUy5wYXJlbnQ/LnNldChudWxsKTtcblxuICAgIC8vIHJlbW92ZSBjaGlsZCBmcm9tIHBhcmVudFxuICAgIGlmICh1bnRyYWNrZWQocExTLm9iamVjdHMpKSBwTFMucmVtb3ZlKGNoaWxkLCAnb2JqZWN0cycpO1xuICAgIGlmICh1bnRyYWNrZWQocExTLm5vbk9iamVjdHMpKSBwTFMucmVtb3ZlKGNoaWxkLCAnbm9uT2JqZWN0cycpO1xuXG4gICAgaWYgKGNMUy5hdHRhY2gpIHtcbiAgICAgICAgZGV0YWNoKHBhcmVudCwgY2hpbGQsIGNMUy5hdHRhY2gpO1xuICAgIH0gZWxzZSBpZiAoaXMub2JqZWN0M0QocGFyZW50KSAmJiBpcy5vYmplY3QzRChjaGlsZCkpIHtcbiAgICAgICAgcGFyZW50LnJlbW92ZShjaGlsZCk7XG4gICAgICAgIHJlbW92ZUludGVyYWN0aXZpdHkoY0xTLnN0b3JlIHx8IHBMUy5zdG9yZSwgY2hpbGQpO1xuICAgIH1cblxuICAgIGNvbnN0IGlzUHJpbWl0aXZlID0gY0xTLnByaW1pdGl2ZTtcbiAgICBpZiAoIWlzUHJpbWl0aXZlKSB7XG4gICAgICAgIHJlbW92ZVRocmVlUmVjdXJzaXZlKGNMUy5vYmplY3RzID8gdW50cmFja2VkKGNMUy5vYmplY3RzKSA6IFtdLCBjaGlsZCwgISFkaXNwb3NlKTtcbiAgICAgICAgcmVtb3ZlVGhyZWVSZWN1cnNpdmUoY2hpbGQuY2hpbGRyZW4sIGNoaWxkLCAhIWRpc3Bvc2UpO1xuICAgIH1cblxuICAgIC8vIGRpc3Bvc2VcbiAgICBpZiAoIWlzUHJpbWl0aXZlICYmIGNoaWxkWydkaXNwb3NlJ10gJiYgIWlzLnNjZW5lKGNoaWxkKSkge1xuICAgICAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiBjaGlsZFsnZGlzcG9zZSddKCkpO1xuICAgIH1cblxuICAgIGludmFsaWRhdGVJbnN0YW5jZShwYXJlbnQpO1xufVxuXG5mdW5jdGlvbiByZW1vdmVUaHJlZVJlY3Vyc2l2ZShhcnJheTogTmd0SW5zdGFuY2VOb2RlW10sIHBhcmVudDogTmd0SW5zdGFuY2VOb2RlLCBkaXNwb3NlOiBib29sZWFuKSB7XG4gICAgaWYgKGFycmF5KSBbLi4uYXJyYXldLmZvckVhY2goKGNoaWxkKSA9PiByZW1vdmVUaHJlZUNoaWxkKHBhcmVudCwgY2hpbGQsIGRpc3Bvc2UpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByb2Nlc3NUaHJlZUV2ZW50KFxuICAgIGluc3RhbmNlOiBOZ3RJbnN0YW5jZU5vZGUsXG4gICAgcHJpb3JpdHk6IG51bWJlcixcbiAgICBldmVudE5hbWU6IHN0cmluZyxcbiAgICBjYWxsYmFjazogKGV2ZW50OiBhbnkpID0+IHZvaWQsXG4gICAgem9uZTogTmdab25lLFxuICAgIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgdGFyZ2V0Q2RyPzogQ2hhbmdlRGV0ZWN0b3JSZWYgfCBudWxsXG4pOiAoKSA9PiB2b2lkIHtcbiAgICBjb25zdCBsUyA9IGdldExvY2FsU3RhdGUoaW5zdGFuY2UpO1xuICAgIGlmIChldmVudE5hbWUgPT09IFNQRUNJQUxfRVZFTlRTLkJFRk9SRV9SRU5ERVIpIHtcbiAgICAgICAgcmV0dXJuIGxTLnN0b3JlXG4gICAgICAgICAgICAuZ2V0KCdpbnRlcm5hbCcpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChzdGF0ZSkgPT4gY2FsbGJhY2soeyBzdGF0ZSwgb2JqZWN0OiBpbnN0YW5jZSB9KSwgcHJpb3JpdHkgfHwgbFMucHJpb3JpdHkgfHwgMCk7XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50TmFtZSA9PT0gU1BFQ0lBTF9FVkVOVFMuQUZURVJfVVBEQVRFIHx8IGV2ZW50TmFtZSA9PT0gU1BFQ0lBTF9FVkVOVFMuQUZURVJfQVRUQUNIKSB7XG4gICAgICAgIGxldCBlbWl0dGVyID0gbFNbZXZlbnROYW1lXTtcbiAgICAgICAgaWYgKCFlbWl0dGVyKSBlbWl0dGVyID0gbFNbZXZlbnROYW1lXSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAgICAgY29uc3Qgc3ViID0gZW1pdHRlci5zdWJzY3JpYmUoY2FsbGJhY2spO1xuICAgICAgICByZXR1cm4gc3ViLnVuc3Vic2NyaWJlLmJpbmQoc3ViKTtcbiAgICB9XG5cbiAgICBpZiAoIWxTLmhhbmRsZXJzKSBsUy5oYW5kbGVycyA9IHt9O1xuXG4gICAgLy8gdHJ5IHRvIGdldCB0aGUgcHJldmlvdXMgaGFuZGxlci4gY29tcG91bmQgbWlnaHQgaGF2ZSBvbmUsIHRoZSBUSFJFRSBvYmplY3QgbWlnaHQgYWxzbyBoYXZlIG9uZSB3aXRoIHRoZSBzYW1lIG5hbWVcbiAgICBjb25zdCBwcmV2aW91c0hhbmRsZXIgPSBsUy5oYW5kbGVyc1tldmVudE5hbWUgYXMga2V5b2YgdHlwZW9mIGxTLmhhbmRsZXJzXTtcbiAgICAvLyByZWFkanVzdCB0aGUgY2FsbGJhY2tcbiAgICBjb25zdCB1cGRhdGVkQ2FsbGJhY2s6IHR5cGVvZiBjYWxsYmFjayA9IChldmVudCkgPT4ge1xuICAgICAgICBpZiAocHJldmlvdXNIYW5kbGVyKSBwcmV2aW91c0hhbmRsZXIoZXZlbnQpO1xuICAgICAgICB6b25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICBjYWxsYmFjayhldmVudCk7XG4gICAgICAgICAgICBzYWZlRGV0ZWN0Q2hhbmdlcyh0YXJnZXRDZHIpO1xuICAgICAgICAgICAgc2FmZURldGVjdENoYW5nZXMoY2RyKTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIE9iamVjdC5hc3NpZ24obFMuaGFuZGxlcnMsIHsgW2V2ZW50TmFtZV06IHVwZGF0ZWRDYWxsYmFjayB9KTtcblxuICAgIC8vIGluY3JlbWVudCB0aGUgY291bnQgZXZlcnl0aW1lXG4gICAgbFMuZXZlbnRDb3VudCArPSAxO1xuICAgIC8vIGJ1dCBvbmx5IGFkZCB0aGUgaW5zdGFuY2UgKHRhcmdldCkgdG8gdGhlIGludGVyYWN0aW9uIGFycmF5IChzbyB0aGF0IGl0IGlzIGhhbmRsZWQgYnkgdGhlIEV2ZW50TWFuYWdlciB3aXRoIFJheWNhc3QpXG4gICAgLy8gdGhlIGZpcnN0IHRpbWUgZXZlbnRDb3VudCBpcyBpbmNyZW1lbnRlZFxuICAgIGlmIChsUy5ldmVudENvdW50ID09PSAxICYmIGluc3RhbmNlWydyYXljYXN0J10pIGxTLnN0b3JlLmdldCgnaW50ZXJuYWwnLCAnaW50ZXJhY3Rpb24nKS5wdXNoKGluc3RhbmNlKTtcblxuICAgIC8vIGNsZWFuIHVwIHRoZSBldmVudCBsaXN0ZW5lciBieSByZW1vdmluZyB0aGUgdGFyZ2V0IGZyb20gdGhlIGludGVyYWN0aW9uIGFycmF5XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgY29uc3QgbG9jYWxTdGF0ZSA9IGdldExvY2FsU3RhdGUoaW5zdGFuY2UpO1xuICAgICAgICBpZiAobG9jYWxTdGF0ZSAmJiBsb2NhbFN0YXRlLmV2ZW50Q291bnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gbG9jYWxTdGF0ZS5zdG9yZVxuICAgICAgICAgICAgICAgIC5nZXQoJ2ludGVybmFsJywgJ2ludGVyYWN0aW9uJylcbiAgICAgICAgICAgICAgICAuZmluZEluZGV4KChvYmopID0+IG9iai51dWlkID09PSBpbnN0YW5jZS51dWlkKTtcbiAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSBsb2NhbFN0YXRlLnN0b3JlLmdldCgnaW50ZXJuYWwnLCAnaW50ZXJhY3Rpb24nKS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB9XG4gICAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV2ZW50VG9IYW5kbGVyKGNhbGxiYWNrOiAoZXZlbnQ6IGFueSkgPT4gdm9pZCkge1xuICAgIHJldHVybiAoZXZlbnQ6IFBhcmFtZXRlcnM8RXhjbHVkZTxOZ3RFdmVudEhhbmRsZXJzWyh0eXBlb2Ygc3VwcG9ydGVkRXZlbnRzKVtudW1iZXJdXSwgdW5kZWZpbmVkPj5bMF0pID0+IHtcbiAgICAgICAgY2FsbGJhY2soZXZlbnQpO1xuICAgIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBrZWJhYlRvUGFzY2FsKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAvLyBzcGxpdCB0aGUgc3RyaW5nIGF0IGVhY2ggaHlwaGVuXG4gICAgY29uc3QgcGFydHMgPSBzdHIuc3BsaXQoJy0nKTtcblxuICAgIC8vIG1hcCBvdmVyIHRoZSBwYXJ0cywgY2FwaXRhbGl6aW5nIHRoZSBmaXJzdCBsZXR0ZXIgb2YgZWFjaCBwYXJ0XG4gICAgY29uc3QgcGFzY2FsUGFydHMgPSBwYXJ0cy5tYXAoKHBhcnQpID0+IHBhcnQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBwYXJ0LnNsaWNlKDEpKTtcblxuICAgIC8vIGpvaW4gdGhlIHBhcnRzIHRvZ2V0aGVyIHRvIGNyZWF0ZSB0aGUgZmluYWwgUGFzY2FsQ2FzZSBzdHJpbmdcbiAgICByZXR1cm4gcGFzY2FsUGFydHMuam9pbignJyk7XG59XG4iXX0=
197
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvcmUvc3JjL2xpYi9yZW5kZXJlci91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ2hELE9BQU8sRUFBRSxhQUFhLEVBQUUsa0JBQWtCLEVBQXdCLE1BQU0sYUFBYSxDQUFDO0FBQ3RGLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDakQsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNqQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRTdDLFlBQVk7QUFDWixNQUFNLENBQU4sSUFBa0Isa0JBZ0JqQjtBQWhCRCxXQUFrQixrQkFBa0I7SUFDbkMsMkRBQUksQ0FBQTtJQUNKLCtEQUFNLENBQUE7SUFDTiwrRUFBYyxDQUFBO0lBQ2QsbUVBQVEsQ0FBQTtJQUNSLHFFQUFTLENBQUE7SUFDVCxtRUFBUSxDQUFBO0lBQ1IsK0VBQWMsQ0FBQTtJQUNkLHVFQUFVLENBQUE7SUFDVixtRUFBUSxDQUFBO0lBQ1IsdUVBQVUsQ0FBQTtJQUNWLHdFQUFVLENBQUE7SUFDVixvRUFBUSxDQUFBO0lBQ1IsMERBQUcsQ0FBQTtJQUNILGtGQUFlLENBQUE7SUFDZixrRkFBZSxDQUFBO0FBQ2hCLENBQUMsRUFoQmlCLGtCQUFrQixLQUFsQixrQkFBa0IsUUFnQm5DO0FBRUQsWUFBWTtBQUNaLE1BQU0sQ0FBTixJQUFrQixrQkFHakI7QUFIRCxXQUFrQixrQkFBa0I7SUFDbkMsdUVBQVUs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TSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxlQUFlLEVBQUUsQ0FBQyxDQUFDO0lBRTdELGdDQUFnQztJQUNoQyxFQUFFLENBQUMsVUFBVSxJQUFJLENBQUMsQ0FBQztJQUNuQix1SEFBdUg7SUFDdkgsMkNBQTJDO0lBQzNDLElBQUksRUFBRSxDQUFDLFVBQVUsS0FBSyxDQUFDLElBQUksUUFBUSxDQUFDLFNBQVMsQ0FBQztRQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFFdkcsZ0ZBQWdGO0lBQ2hGLE9BQU8sR0FBRyxFQUFFO1FBQ1gsTUFBTSxVQUFVLEdBQUcsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzNDLElBQUksVUFBVSxJQUFJLFVBQVUsQ0FBQyxVQUFVLEVBQUU7WUFDeEMsVUFBVSxDQUFDLFVBQVUsSUFBSSxDQUFDLENBQUM7WUFDM0IsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLEtBQUs7aUJBQzVCLEdBQUcsQ0FBQyxVQUFVLEVBQUUsYUFBYSxDQUFDO2lCQUM5QixTQUFTLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEtBQUssUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2pELElBQUksS0FBSyxJQUFJLENBQUM7Z0JBQUUsVUFBVSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLGFBQWEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDakY7SUFDRixDQUFDLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIEV2ZW50RW1pdHRlciwgTmdab25lLCB1bnRyYWNrZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHJlbW92ZUludGVyYWN0aXZpdHkgfSBmcm9tICcuLi9ldmVudHMnO1xuaW1wb3J0IHsgZ2V0TG9jYWxTdGF0ZSwgaW52YWxpZGF0ZUluc3RhbmNlLCB0eXBlIE5ndEluc3RhbmNlTm9kZSB9IGZyb20gJy4uL2luc3RhbmNlJztcbmltcG9ydCB7IGF0dGFjaCwgZGV0YWNoIH0gZnJvbSAnLi4vdXRpbHMvYXR0YWNoJztcbmltcG9ydCB7IGlzIH0gZnJvbSAnLi4vdXRpbHMvaXMnO1xuaW1wb3J0IHsgc2FmZURldGVjdENoYW5nZXMgfSBmcm9tICcuLi91dGlscy9zYWZlLWRldGVjdC1jaGFuZ2VzJztcbmltcG9ydCB7IFNQRUNJQUxfRVZFTlRTIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuXG4vLyBAaW50ZXJuYWxcbmV4cG9ydCBjb25zdCBlbnVtIE5ndFJlbmRlcmVyQ2xhc3NJZCB7XG5cdHR5cGUsXG5cdHBhcmVudCxcblx0aW5qZWN0ZWRQYXJlbnQsXG5cdGNoaWxkcmVuLFxuXHRkZXN0cm95ZWQsXG5cdGNvbXBvdW5kLFxuXHRjb21wb3VuZFBhcmVudCxcblx0Y29tcG91bmRlZCxcblx0cXVldWVPcHMsXG5cdGF0dHJpYnV0ZXMsXG5cdHByb3BlcnRpZXMsXG5cdHJhd1ZhbHVlLFxuXHRyZWYsXG5cdHBvcnRhbENvbnRhaW5lcixcblx0aW5qZWN0b3JGYWN0b3J5LFxufVxuXG4vLyBAaW50ZXJuYWxcbmV4cG9ydCBjb25zdCBlbnVtIE5ndENvbXBvdW5kQ2xhc3NJZCB7XG5cdGFwcGx5Rmlyc3QsXG5cdHByb3BzLFxufVxuXG4vLyBAaW50ZXJuYWxcbmV4cG9ydCBjb25zdCBlbnVtIE5ndFF1ZXVlT3BDbGFzc0lkIHtcblx0dHlwZSxcblx0b3AsXG5cdGRvbmUsXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhdHRhY2hUaHJlZUNoaWxkKHBhcmVudDogTmd0SW5zdGFuY2VOb2RlLCBjaGlsZDogTmd0SW5zdGFuY2VOb2RlKSB7XG5cdGNvbnN0IHBMUyA9IGdldExvY2FsU3RhdGUocGFyZW50KTtcblx0Y29uc3QgY0xTID0gZ2V0TG9jYWxTdGF0ZShjaGlsZCk7XG5cblx0aWYgKCFwTFMgfHwgIWNMUykge1xuXHRcdHRocm93IG5ldyBFcnJvcihgW05HVF0gVEhSRUUgaW5zdGFuY2VzIG5lZWQgdG8gYmUgcHJlcGFyZWQgd2l0aCBsb2NhbCBzdGF0ZS5gKTtcblx0fVxuXG5cdC8vIHdoZXRoZXIgdGhlIGNoaWxkIGlzIGFkZGVkIHRvIHRoZSBwYXJlbnQgd2l0aCBwYXJlbnQuYWRkKClcblx0bGV0IGFkZGVkID0gZmFsc2U7XG5cblx0Ly8gYXNzaWduIHN0b3JlIG9uIGNoaWxkIGlmIG5vdCBhbHJlYWR5IGV4aXN0XG5cdC8vIG9yIGNoaWxkIHN0b3JlIGlzIHRoZSBwYXJlbnQgb2YgcGFyZW50IHN0b3JlXG5cdGlmICghY0xTLnN0b3JlIHx8IGNMUy5zdG9yZSA9PT0gcExTLnN0b3JlLmdldCgncHJldmlvdXNSb290JykpIHtcblx0XHRjTFMuc3RvcmUgPSBwTFMuc3RvcmU7XG5cdH1cblxuXHRpZiAoY0xTLmF0dGFjaCkge1xuXHRcdGNvbnN0IGF0dGFjaFByb3AgPSBjTFMuYXR0YWNoO1xuXG5cdFx0aWYgKHR5cGVvZiBhdHRhY2hQcm9wID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRjb25zdCBhdHRhY2hDbGVhblVwID0gYXR0YWNoUHJvcChwYXJlbnQsIGNoaWxkLCBjTFMuc3RvcmUpO1xuXHRcdFx0aWYgKGF0dGFjaENsZWFuVXApIGNMUy5wcmV2aW91c0F0dGFjaCA9IGF0dGFjaENsZWFuVXA7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIHdlIHNraXAgYXR0YWNoIG5vbmUgaWYgc2V0IGV4cGxpY2l0bHlcblx0XHRcdGlmIChhdHRhY2hQcm9wWzBdID09PSAnbm9uZScpIHtcblx0XHRcdFx0aW52YWxpZGF0ZUluc3RhbmNlKGNoaWxkKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBoYW5kbGUgbWF0ZXJpYWwgYXJyYXlcblx0XHRcdGlmIChcblx0XHRcdFx0YXR0YWNoUHJvcFswXSA9PT0gJ21hdGVyaWFsJyAmJlxuXHRcdFx0XHRhdHRhY2hQcm9wWzFdICYmXG5cdFx0XHRcdHR5cGVvZiBOdW1iZXIoYXR0YWNoUHJvcFsxXSkgPT09ICdudW1iZXInICYmXG5cdFx0XHRcdGlzLm1hdGVyaWFsKGNoaWxkKSAmJlxuXHRcdFx0XHQhQXJyYXkuaXNBcnJheShwYXJlbnRbJ21hdGVyaWFsJ10pXG5cdFx0XHQpIHtcblx0XHRcdFx0cGFyZW50WydtYXRlcmlhbCddID0gW107XG5cdFx0XHR9XG5cblx0XHRcdC8vIGF0dGFjaFxuXHRcdFx0aWYgKGNMUy5pc1Jhdykge1xuXHRcdFx0XHRpZiAoY0xTLnBhcmVudCAmJiBjTFMucGFyZW50KCkgIT09IHBhcmVudCkge1xuXHRcdFx0XHRcdHVudHJhY2tlZCgoKSA9PiB7XG5cdFx0XHRcdFx0XHRjTFMucGFyZW50LnNldChwYXJlbnQpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIGF0IHRoaXMgcG9pbnQgd2UgZG9uJ3QgaGF2ZSByYXdWYWx1ZSB5ZXQsIHNvIHdlIGJhaWwgYW5kIHdhaXQgdW50aWwgdGhlIFJlbmRlcmVyIHJlY2FsbHMgYXR0YWNoXG5cdFx0XHRcdGlmIChjaGlsZC5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5yYXdWYWx1ZV0gPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuXHRcdFx0XHRhdHRhY2gocGFyZW50LCBjaGlsZC5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5yYXdWYWx1ZV0sIGF0dGFjaFByb3ApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0YXR0YWNoKHBhcmVudCwgY2hpbGQsIGF0dGFjaFByb3ApO1xuXHRcdFx0fVxuXHRcdFx0Ly8gc2F2ZSB2YWx1ZVxuXHRcdFx0Y0xTLnByZXZpb3VzQXR0YWNoID0gYXR0YWNoUHJvcC5yZWR1Y2UoKHZhbHVlLCBwcm9wZXJ0eSkgPT4gdmFsdWVbcHJvcGVydHldLCBwYXJlbnQpO1xuXHRcdH1cblx0fSBlbHNlIGlmIChpcy5vYmplY3QzRChwYXJlbnQpICYmIGlzLm9iamVjdDNEKGNoaWxkKSkge1xuXHRcdHBhcmVudC5hZGQoY2hpbGQpO1xuXHRcdGFkZGVkID0gdHJ1ZTtcblx0fVxuXG5cdHBMUy5hZGQoY2hpbGQsIGFkZGVkID8gJ29iamVjdHMnIDogJ25vbk9iamVjdHMnKTtcblxuXHRpZiAoY0xTLnBhcmVudCAmJiBjTFMucGFyZW50KCkgIT09IHBhcmVudCkge1xuXHRcdHVudHJhY2tlZCgoKSA9PiB7XG5cdFx0XHRjTFMucGFyZW50LnNldChwYXJlbnQpO1xuXHRcdH0pO1xuXHR9XG5cblx0aWYgKGNMUy5hZnRlckF0dGFjaCkgY0xTLmFmdGVyQXR0YWNoLmVtaXQoeyBwYXJlbnQsIG5vZGU6IGNoaWxkIH0pO1xuXG5cdGludmFsaWRhdGVJbnN0YW5jZShjaGlsZCk7XG5cdGludmFsaWRhdGVJbnN0YW5jZShwYXJlbnQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlVGhyZWVDaGlsZChwYXJlbnQ6IE5ndEluc3RhbmNlTm9kZSwgY2hpbGQ6IE5ndEluc3RhbmNlTm9kZSwgZGlzcG9zZT86IGJvb2xlYW4pIHtcblx0Y29uc3QgcExTID0gZ2V0TG9jYWxTdGF0ZShwYXJlbnQpO1xuXHRjb25zdCBjTFMgPSBnZXRMb2NhbFN0YXRlKGNoaWxkKTtcblxuXHQvLyBjbGVhciBwYXJlbnQgcmVmXG5cdHVudHJhY2tlZCgoKSA9PiB7XG5cdFx0Y0xTLnBhcmVudD8uc2V0KG51bGwpO1xuXHR9KTtcblxuXHQvLyByZW1vdmUgY2hpbGQgZnJvbSBwYXJlbnRcblx0aWYgKHBMUy5vYmplY3RzICYmIHVudHJhY2tlZChwTFMub2JqZWN0cykpIHBMUy5yZW1vdmUoY2hpbGQsICdvYmplY3RzJyk7XG5cdGlmIChwTFMubm9uT2JqZWN0cyAmJiB1bnRyYWNrZWQocExTLm5vbk9iamVjdHMpKSBwTFMucmVtb3ZlKGNoaWxkLCAnbm9uT2JqZWN0cycpO1xuXG5cdGlmIChjTFMuYXR0YWNoKSB7XG5cdFx0ZGV0YWNoKHBhcmVudCwgY2hpbGQsIGNMUy5hdHRhY2gpO1xuXHR9IGVsc2UgaWYgKGlzLm9iamVjdDNEKHBhcmVudCkgJiYgaXMub2JqZWN0M0QoY2hpbGQpKSB7XG5cdFx0cGFyZW50LnJlbW92ZShjaGlsZCk7XG5cdFx0cmVtb3ZlSW50ZXJhY3Rpdml0eShjTFMuc3RvcmUgfHwgcExTLnN0b3JlLCBjaGlsZCk7XG5cdH1cblxuXHRjb25zdCBpc1ByaW1pdGl2ZSA9IGNMUy5wcmltaXRpdmU7XG5cdGlmICghaXNQcmltaXRpdmUpIHtcblx0XHRyZW1vdmVUaHJlZVJlY3Vyc2l2ZShjTFMub2JqZWN0cyA/IHVudHJhY2tlZChjTFMub2JqZWN0cykgOiBbXSwgY2hpbGQsICEhZGlzcG9zZSk7XG5cdFx0cmVtb3ZlVGhyZWVSZWN1cnNpdmUoY2hpbGQuY2hpbGRyZW4sIGNoaWxkLCAhIWRpc3Bvc2UpO1xuXHR9XG5cblx0Ly8gZGlzcG9zZVxuXHRpZiAoIWlzUHJpbWl0aXZlICYmIGNoaWxkWydkaXNwb3NlJ10gJiYgIWlzLnNjZW5lKGNoaWxkKSkge1xuXHRcdHF1ZXVlTWljcm90YXNrKCgpID0+IGNoaWxkWydkaXNwb3NlJ10oKSk7XG5cdH1cblxuXHRpbnZhbGlkYXRlSW5zdGFuY2UocGFyZW50KTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlVGhyZWVSZWN1cnNpdmUoYXJyYXk6IE5ndEluc3RhbmNlTm9kZVtdLCBwYXJlbnQ6IE5ndEluc3RhbmNlTm9kZSwgZGlzcG9zZTogYm9vbGVhbikge1xuXHRpZiAoYXJyYXkpIFsuLi5hcnJheV0uZm9yRWFjaCgoY2hpbGQpID0+IHJlbW92ZVRocmVlQ2hpbGQocGFyZW50LCBjaGlsZCwgZGlzcG9zZSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24ga2ViYWJUb1Bhc2NhbChzdHI6IHN0cmluZyk6IHN0cmluZyB7XG5cdC8vIHNwbGl0IHRoZSBzdHJpbmcgYXQgZWFjaCBoeXBoZW5cblx0Y29uc3QgcGFydHMgPSBzdHIuc3BsaXQoJy0nKTtcblxuXHQvLyBtYXAgb3ZlciB0aGUgcGFydHMsIGNhcGl0YWxpemluZyB0aGUgZmlyc3QgbGV0dGVyIG9mIGVhY2ggcGFydFxuXHRjb25zdCBwYXNjYWxQYXJ0cyA9IHBhcnRzLm1hcCgocGFydCkgPT4gcGFydC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHBhcnQuc2xpY2UoMSkpO1xuXG5cdC8vIGpvaW4gdGhlIHBhcnRzIHRvZ2V0aGVyIHRvIGNyZWF0ZSB0aGUgZmluYWwgUGFzY2FsQ2FzZSBzdHJpbmdcblx0cmV0dXJuIHBhc2NhbFBhcnRzLmpvaW4oJycpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJvY2Vzc1RocmVlRXZlbnQoXG5cdGluc3RhbmNlOiBOZ3RJbnN0YW5jZU5vZGUsXG5cdHByaW9yaXR5OiBudW1iZXIsXG5cdGV2ZW50TmFtZTogc3RyaW5nLFxuXHRjYWxsYmFjazogKGV2ZW50OiBhbnkpID0+IHZvaWQsXG5cdHpvbmU6IE5nWm9uZSxcblx0cm9vdENkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG5cdHRhcmdldENkcj86IENoYW5nZURldGVjdG9yUmVmIHwgbnVsbCxcbik6ICgpID0+IHZvaWQge1xuXHRjb25zdCBsUyA9IGdldExvY2FsU3RhdGUoaW5zdGFuY2UpO1xuXHRpZiAoZXZlbnROYW1lID09PSBTUEVDSUFMX0VWRU5UUy5CRUZPUkVfUkVOREVSKSB7XG5cdFx0cmV0dXJuIGxTLnN0b3JlXG5cdFx0XHQuZ2V0KCdpbnRlcm5hbCcpXG5cdFx0XHQuc3Vic2NyaWJlKChzdGF0ZSkgPT4gY2FsbGJhY2soeyBzdGF0ZSwgb2JqZWN0OiBpbnN0YW5jZSB9KSwgcHJpb3JpdHkgfHwgbFMucHJpb3JpdHkgfHwgMCk7XG5cdH1cblxuXHRpZiAoZXZlbnROYW1lID09PSBTUEVDSUFMX0VWRU5UUy5BRlRFUl9VUERBVEUgfHwgZXZlbnROYW1lID09PSBTUEVDSUFMX0VWRU5UUy5BRlRFUl9BVFRBQ0gpIHtcblx0XHRsZXQgZW1pdHRlciA9IGxTW2V2ZW50TmFtZV07XG5cdFx0aWYgKCFlbWl0dGVyKSBlbWl0dGVyID0gbFNbZXZlbnROYW1lXSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblx0XHRjb25zdCBzdWIgPSBlbWl0dGVyLnN1YnNjcmliZShjYWxsYmFjayk7XG5cdFx0cmV0dXJuIHN1Yi51bnN1YnNjcmliZS5iaW5kKHN1Yik7XG5cdH1cblxuXHRpZiAoIWxTLmhhbmRsZXJzKSBsUy5oYW5kbGVycyA9IHt9O1xuXG5cdC8vIHRyeSB0byBnZXQgdGhlIHByZXZpb3VzIGhhbmRsZXIuIGNvbXBvdW5kIG1pZ2h0IGhhdmUgb25lLCB0aGUgVEhSRUUgb2JqZWN0IG1pZ2h0IGFsc28gaGF2ZSBvbmUgd2l0aCB0aGUgc2FtZSBuYW1lXG5cdGNvbnN0IHByZXZpb3VzSGFuZGxlciA9IGxTLmhhbmRsZXJzW2V2ZW50TmFtZSBhcyBrZXlvZiB0eXBlb2YgbFMuaGFuZGxlcnNdO1xuXHQvLyByZWFkanVzdCB0aGUgY2FsbGJhY2tcblx0Y29uc3QgdXBkYXRlZENhbGxiYWNrOiB0eXBlb2YgY2FsbGJhY2sgPSAoZXZlbnQpID0+IHtcblx0XHRpZiAocHJldmlvdXNIYW5kbGVyKSBwcmV2aW91c0hhbmRsZXIoZXZlbnQpO1xuXHRcdHpvbmUucnVuKCgpID0+IHtcblx0XHRcdGNhbGxiYWNrKGV2ZW50KTtcblx0XHRcdHNhZmVEZXRlY3RDaGFuZ2VzKHRhcmdldENkciwgcm9vdENkcik7XG5cdFx0fSk7XG5cdH07XG5cblx0T2JqZWN0LmFzc2lnbihsUy5oYW5kbGVycywgeyBbZXZlbnROYW1lXTogdXBkYXRlZENhbGxiYWNrIH0pO1xuXG5cdC8vIGluY3JlbWVudCB0aGUgY291bnQgZXZlcnl0aW1lXG5cdGxTLmV2ZW50Q291bnQgKz0gMTtcblx0Ly8gYnV0IG9ubHkgYWRkIHRoZSBpbnN0YW5jZSAodGFyZ2V0KSB0byB0aGUgaW50ZXJhY3Rpb24gYXJyYXkgKHNvIHRoYXQgaXQgaXMgaGFuZGxlZCBieSB0aGUgRXZlbnRNYW5hZ2VyIHdpdGggUmF5Y2FzdClcblx0Ly8gdGhlIGZpcnN0IHRpbWUgZXZlbnRDb3VudCBpcyBpbmNyZW1lbnRlZFxuXHRpZiAobFMuZXZlbnRDb3VudCA9PT0gMSAmJiBpbnN0YW5jZVsncmF5Y2FzdCddKSBsUy5zdG9yZS5nZXQoJ2ludGVybmFsJywgJ2ludGVyYWN0aW9uJykucHVzaChpbnN0YW5jZSk7XG5cblx0Ly8gY2xlYW4gdXAgdGhlIGV2ZW50IGxpc3RlbmVyIGJ5IHJlbW92aW5nIHRoZSB0YXJnZXQgZnJvbSB0aGUgaW50ZXJhY3Rpb24gYXJyYXlcblx0cmV0dXJuICgpID0+IHtcblx0XHRjb25zdCBsb2NhbFN0YXRlID0gZ2V0TG9jYWxTdGF0ZShpbnN0YW5jZSk7XG5cdFx0aWYgKGxvY2FsU3RhdGUgJiYgbG9jYWxTdGF0ZS5ldmVudENvdW50KSB7XG5cdFx0XHRsb2NhbFN0YXRlLmV2ZW50Q291bnQgLT0gMTtcblx0XHRcdGNvbnN0IGluZGV4ID0gbG9jYWxTdGF0ZS5zdG9yZVxuXHRcdFx0XHQuZ2V0KCdpbnRlcm5hbCcsICdpbnRlcmFjdGlvbicpXG5cdFx0XHRcdC5maW5kSW5kZXgoKG9iaikgPT4gb2JqLnV1aWQgPT09IGluc3RhbmNlLnV1aWQpO1xuXHRcdFx0aWYgKGluZGV4ID49IDApIGxvY2FsU3RhdGUuc3RvcmUuZ2V0KCdpbnRlcm5hbCcsICdpbnRlcmFjdGlvbicpLnNwbGljZShpbmRleCwgMSk7XG5cdFx0fVxuXHR9O1xufVxuIl19
@@ -0,0 +1,249 @@
1
+ import { DestroyRef, effect, inject, runInInjectionContext } from '@angular/core';
2
+ import { assertInjector } from 'ngxtension/assert-injector';
3
+ import * as THREE from 'three';
4
+ import { prepare } from './instance';
5
+ import { injectNgtLoop } from './loop';
6
+ import { injectNgtStore } from './store';
7
+ import { applyProps } from './utils/apply-props';
8
+ import { is } from './utils/is';
9
+ import { makeDefaultCamera, makeDefaultRenderer, makeDpr } from './utils/make';
10
+ import { checkNeedsUpdate } from './utils/update';
11
+ const shallowLoose = { objects: 'shallow', strict: false };
12
+ export const roots = new Map();
13
+ export function injectCanvasRootInitializer(injector) {
14
+ injector = assertInjector(injectCanvasRootInitializer, injector);
15
+ return runInInjectionContext(injector, () => {
16
+ const injectedStore = injectNgtStore();
17
+ const loop = injectNgtLoop();
18
+ const destroyRef = inject(DestroyRef);
19
+ return (canvas) => {
20
+ const exist = roots.has(canvas);
21
+ let store = roots.get(canvas);
22
+ if (store) {
23
+ console.warn('[NGT] Same canvas root is being created twice');
24
+ }
25
+ store ||= injectedStore;
26
+ if (!store) {
27
+ throw new Error('[NGT] No store initialized');
28
+ }
29
+ if (!exist) {
30
+ roots.set(canvas, store);
31
+ }
32
+ let isConfigured = false;
33
+ let invalidateRef;
34
+ destroyRef.onDestroy(() => invalidateRef?.destroy());
35
+ return {
36
+ isConfigured,
37
+ destroy: (timeout = 500) => {
38
+ const root = roots.get(canvas);
39
+ if (root) {
40
+ root.set((state) => ({ internal: { ...state.internal, active: false } }));
41
+ setTimeout(() => {
42
+ try {
43
+ const state = root.get();
44
+ state.events.disconnect?.();
45
+ state.gl?.renderLists?.dispose?.();
46
+ state.gl?.forceContextLoss?.();
47
+ if (state.gl?.xr)
48
+ state.xr.disconnect();
49
+ dispose(state);
50
+ roots.delete(canvas);
51
+ }
52
+ catch (e) {
53
+ console.error('[NGT] Unexpected error while destroying Canvas Root', e);
54
+ }
55
+ }, timeout);
56
+ }
57
+ },
58
+ configure: (inputs) => {
59
+ const { gl: glOptions, size: sizeOptions, camera: cameraOptions, raycaster: raycasterOptions, scene: sceneOptions, events, orthographic, lookAt, shadows, linear, legacy, flat, dpr, frameloop, performance, } = inputs;
60
+ const state = store.get();
61
+ const stateToUpdate = {};
62
+ // setup renderer
63
+ let gl = state.gl;
64
+ if (!state.gl)
65
+ stateToUpdate.gl = gl = makeDefaultRenderer(glOptions, canvas);
66
+ // setup raycaster
67
+ let raycaster = state.raycaster;
68
+ if (!raycaster)
69
+ stateToUpdate.raycaster = raycaster = new THREE.Raycaster();
70
+ // set raycaster options
71
+ const { params, ...options } = raycasterOptions || {};
72
+ if (!is.equ(options, raycaster, shallowLoose))
73
+ applyProps(raycaster, { ...options });
74
+ if (!is.equ(params, raycaster.params, shallowLoose)) {
75
+ applyProps(raycaster, { params: { ...raycaster.params, ...(params || {}) } });
76
+ }
77
+ // create default camera
78
+ if (!state.camera) {
79
+ const isCamera = is.camera(cameraOptions);
80
+ let camera = isCamera ? cameraOptions : makeDefaultCamera(orthographic || false, state.size);
81
+ if (!isCamera) {
82
+ if (cameraOptions)
83
+ applyProps(camera, cameraOptions);
84
+ // set position.z
85
+ if (!cameraOptions?.position)
86
+ camera.position.z = 5;
87
+ // always look at center or passed-in lookAt by default
88
+ if (!cameraOptions?.rotation && !cameraOptions?.quaternion) {
89
+ if (Array.isArray(lookAt))
90
+ camera.lookAt(lookAt[0], lookAt[1], lookAt[2]);
91
+ else if (lookAt instanceof THREE.Vector3)
92
+ camera.lookAt(lookAt);
93
+ else
94
+ camera.lookAt(0, 0, 0);
95
+ }
96
+ // update projection matrix after applyprops
97
+ camera.updateProjectionMatrix?.();
98
+ }
99
+ if (!is.instance(camera))
100
+ camera = prepare(camera, { store });
101
+ stateToUpdate.camera = camera;
102
+ }
103
+ // Set up scene (one time only!)
104
+ if (!state.scene) {
105
+ let scene;
106
+ if (sceneOptions instanceof THREE.Scene) {
107
+ scene = prepare(sceneOptions, { store });
108
+ }
109
+ else {
110
+ scene = prepare(new THREE.Scene(), { store });
111
+ if (sceneOptions)
112
+ applyProps(scene, sceneOptions);
113
+ }
114
+ stateToUpdate.scene = scene;
115
+ }
116
+ // Set up XR (one time only!)
117
+ if (!state.xr) {
118
+ // Handle frame behavior in WebXR
119
+ const handleXRFrame = (timestamp, frame) => {
120
+ const state = store.get();
121
+ if (state.frameloop === 'never')
122
+ return;
123
+ loop.advance(timestamp, true, store, frame);
124
+ };
125
+ // Toggle render switching on session
126
+ const handleSessionChange = () => {
127
+ const state = store.get();
128
+ state.gl.xr.enabled = state.gl.xr.isPresenting;
129
+ state.gl.xr.setAnimationLoop(state.gl.xr.isPresenting ? handleXRFrame : null);
130
+ if (!state.gl.xr.isPresenting)
131
+ loop.invalidate(store);
132
+ };
133
+ // WebXR session manager
134
+ const xr = {
135
+ connect: () => {
136
+ gl.xr.addEventListener('sessionstart', handleSessionChange);
137
+ gl.xr.addEventListener('sessionend', handleSessionChange);
138
+ },
139
+ disconnect: () => {
140
+ gl.xr.removeEventListener('sessionstart', handleSessionChange);
141
+ gl.xr.removeEventListener('sessionend', handleSessionChange);
142
+ },
143
+ };
144
+ // Subscribe to WebXR session events
145
+ if (gl.xr && typeof gl.xr.addEventListener === 'function')
146
+ xr.connect();
147
+ stateToUpdate.xr = xr;
148
+ }
149
+ // Set shadowmap
150
+ if (gl.shadowMap) {
151
+ const oldEnabled = gl.shadowMap.enabled;
152
+ const oldType = gl.shadowMap.type;
153
+ gl.shadowMap.enabled = !!shadows;
154
+ if (typeof shadows === 'boolean') {
155
+ gl.shadowMap.type = THREE.PCFSoftShadowMap;
156
+ }
157
+ else if (typeof shadows === 'string') {
158
+ const types = {
159
+ basic: THREE.BasicShadowMap,
160
+ percentage: THREE.PCFShadowMap,
161
+ soft: THREE.PCFSoftShadowMap,
162
+ variance: THREE.VSMShadowMap,
163
+ };
164
+ gl.shadowMap.type = types[shadows] ?? THREE.PCFSoftShadowMap;
165
+ }
166
+ else if (is.obj(shadows)) {
167
+ Object.assign(gl.shadowMap, shadows);
168
+ }
169
+ if (oldEnabled !== gl.shadowMap.enabled || oldType !== gl.shadowMap.type)
170
+ checkNeedsUpdate(gl.shadowMap);
171
+ }
172
+ // Safely set color management if available.
173
+ // Avoid accessing THREE.ColorManagement to play nice with older versions
174
+ if (THREE.ColorManagement) {
175
+ const ColorManagement = THREE.ColorManagement;
176
+ if ('enabled' in ColorManagement)
177
+ ColorManagement['enabled'] = !legacy ?? false;
178
+ else if ('legacyMode' in ColorManagement)
179
+ ColorManagement['legacyMode'] = legacy ?? true;
180
+ }
181
+ // set color space and tonemapping preferences
182
+ const LinearEncoding = 3000;
183
+ const sRGBEncoding = 3001;
184
+ applyProps(gl, {
185
+ outputEncoding: linear ? LinearEncoding : sRGBEncoding,
186
+ toneMapping: flat ? THREE.NoToneMapping : THREE.ACESFilmicToneMapping,
187
+ });
188
+ // Update color management state
189
+ if (state.legacy !== legacy)
190
+ stateToUpdate.legacy = legacy;
191
+ if (state.linear !== linear)
192
+ stateToUpdate.linear = linear;
193
+ if (state.flat !== flat)
194
+ stateToUpdate.flat = flat;
195
+ // Set gl props
196
+ gl.setClearAlpha(0);
197
+ gl.setPixelRatio(makeDpr(state.viewport.dpr));
198
+ gl.setSize(state.size.width, state.size.height);
199
+ if (is.obj(glOptions) &&
200
+ !(typeof glOptions === 'function') &&
201
+ !is.renderer(glOptions) &&
202
+ !is.equ(glOptions, gl, shallowLoose)) {
203
+ applyProps(gl, glOptions);
204
+ }
205
+ // Store events internally
206
+ if (events && !state.events.handlers)
207
+ stateToUpdate.events = events(store);
208
+ // Check performance
209
+ if (performance && !is.equ(performance, state.performance, shallowLoose)) {
210
+ stateToUpdate.performance = { ...state.performance, ...performance };
211
+ }
212
+ store.set(stateToUpdate);
213
+ // Check size, allow it to take on container bounds initially
214
+ const size = computeInitialSize(canvas, sizeOptions);
215
+ if (!is.equ(size, state.size, shallowLoose)) {
216
+ state.setSize(size.width, size.height, size.top, size.left);
217
+ }
218
+ // Check pixelratio
219
+ if (dpr && state.viewport.dpr !== makeDpr(dpr))
220
+ state.setDpr(dpr);
221
+ // Check frameloop
222
+ if (state.frameloop !== frameloop)
223
+ state.setFrameloop(frameloop);
224
+ isConfigured = true;
225
+ invalidateRef?.destroy();
226
+ invalidateRef = effect(() => void store.state().invalidate(), { manualCleanup: true, injector });
227
+ },
228
+ };
229
+ };
230
+ });
231
+ }
232
+ function computeInitialSize(canvas, defaultSize) {
233
+ if (defaultSize)
234
+ return defaultSize;
235
+ if (canvas instanceof HTMLCanvasElement && canvas.parentElement) {
236
+ return canvas.parentElement.getBoundingClientRect();
237
+ }
238
+ return { width: 0, height: 0, top: 0, left: 0 };
239
+ }
240
+ // Disposes an object and all its properties
241
+ function dispose(obj) {
242
+ if (obj.dispose && obj.type !== 'Scene')
243
+ obj.dispose();
244
+ for (const p in obj) {
245
+ p.dispose?.();
246
+ delete obj[p];
247
+ }
248
+ }
249
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm9vdHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2NvcmUvc3JjL2xpYi9yb290cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUscUJBQXFCLEVBQWlDLE1BQU0sZUFBZSxDQUFDO0FBQ2pILE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM1RCxPQUFPLEtBQUssS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUUvQixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDdkMsT0FBTyxFQUFFLGNBQWMsRUFBK0IsTUFBTSxTQUFTLENBQUM7QUFFdEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDaEMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLG1CQUFtQixFQUFFLE9BQU8sRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUUvRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVsRCxNQUFNLFlBQVksR0FBRyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBa0IsQ0FBQztBQUUzRSxNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxHQUFHLEVBQStDLENBQUM7QUFFNUUsTUFBTSxVQUFVLDJCQUEyQixDQUFDLFFBQW1CO0lBQzlELFFBQVEsR0FBRyxjQUFjLENBQUMsMkJBQTJCLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFFakUsT0FBTyxxQkFBcUIsQ0FBQyxRQUFRLEVBQUUsR0FBRyxFQUFFO1FBQzNDLE1BQU0sYUFBYSxHQUFHLGNBQWMsRUFBRSxDQUFDO1FBQ3ZDLE1BQU0sSUFB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QUFhLEdBQUcsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDLFVBQVUsRUFBRSxFQUFFLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO2dCQUNsRyxDQUFDO2FBQ0QsQ0FBQztRQUNILENBQUMsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQUlELFNBQVMsa0JBQWtCLENBQUMsTUFBaUQsRUFBRSxXQUFxQjtJQUNuRyxJQUFJLFdBQVc7UUFBRSxPQUFPLFdBQVcsQ0FBQztJQUVwQyxJQUFJLE1BQU0sWUFBWSxpQkFBaUIsSUFBSSxNQUFNLENBQUMsYUFBYSxFQUFFO1FBQ2hFLE9BQU8sTUFBTSxDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO0tBQ3BEO0lBRUQsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQztBQUNqRCxDQUFDO0FBRUQsNENBQTRDO0FBQzVDLFNBQVMsT0FBTyxDQUEyRSxHQUFTO0lBQ25HLElBQUksR0FBRyxDQUFDLE9BQU8sSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLE9BQU87UUFBRSxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDdkQsS0FBSyxNQUFNLENBQUMsSUFBSSxHQUFHLEVBQUU7UUFDbkIsQ0FBUyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7UUFDdkIsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDZDtBQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEZXN0cm95UmVmLCBlZmZlY3QsIGluamVjdCwgcnVuSW5JbmplY3Rpb25Db250ZXh0LCB0eXBlIEVmZmVjdFJlZiwgdHlwZSBJbmplY3RvciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgYXNzZXJ0SW5qZWN0b3IgfSBmcm9tICduZ3h0ZW5zaW9uL2Fzc2VydC1pbmplY3Rvcic7XG5pbXBvcnQgKiBhcyBUSFJFRSBmcm9tICd0aHJlZSc7XG5pbXBvcnQgdHlwZSB7IE5ndENhbnZhc0lucHV0cyB9IGZyb20gJy4vY2FudmFzJztcbmltcG9ydCB7IHByZXBhcmUgfSBmcm9tICcuL2luc3RhbmNlJztcbmltcG9ydCB7IGluamVjdE5ndExvb3AgfSBmcm9tICcuL2xvb3AnO1xuaW1wb3J0IHsgaW5qZWN0Tmd0U3RvcmUsIHR5cGUgTmd0U2l6ZSwgdHlwZSBOZ3RTdGF0ZSB9IGZyb20gJy4vc3RvcmUnO1xuaW1wb3J0IHR5cGUgeyBOZ3RBbnlSZWNvcmQsIE5ndEVxdUNvbmZpZyB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgYXBwbHlQcm9wcyB9IGZyb20gJy4vdXRpbHMvYXBwbHktcHJvcHMnO1xuaW1wb3J0IHsgaXMgfSBmcm9tICcuL3V0aWxzL2lzJztcbmltcG9ydCB7IG1ha2VEZWZhdWx0Q2FtZXJhLCBtYWtlRGVmYXVsdFJlbmRlcmVyLCBtYWtlRHByIH0gZnJvbSAnLi91dGlscy9tYWtlJztcbmltcG9ydCB0eXBlIHsgTmd0U2lnbmFsU3RvcmUgfSBmcm9tICcuL3V0aWxzL3NpZ25hbC1zdG9yZSc7XG5pbXBvcnQgeyBjaGVja05lZWRzVXBkYXRlIH0gZnJvbSAnLi91dGlscy91cGRhdGUnO1xuXG5jb25zdCBzaGFsbG93TG9vc2UgPSB7IG9iamVjdHM6ICdzaGFsbG93Jywgc3RyaWN0OiBmYWxzZSB9IGFzIE5ndEVxdUNvbmZpZztcblxuZXhwb3J0IGNvbnN0IHJvb3RzID0gbmV3IE1hcDxIVE1MQ2FudmFzRWxlbWVudCwgTmd0U2lnbmFsU3RvcmU8Tmd0U3RhdGU+PigpO1xuXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0Q2FudmFzUm9vdEluaXRpYWxpemVyKGluamVjdG9yPzogSW5qZWN0b3IpIHtcblx0aW5qZWN0b3IgPSBhc3NlcnRJbmplY3RvcihpbmplY3RDYW52YXNSb290SW5pdGlhbGl6ZXIsIGluamVjdG9yKTtcblxuXHRyZXR1cm4gcnVuSW5JbmplY3Rpb25Db250ZXh0KGluamVjdG9yLCAoKSA9PiB7XG5cdFx0Y29uc3QgaW5qZWN0ZWRTdG9yZSA9IGluamVjdE5ndFN0b3JlKCk7XG5cdFx0Y29uc3QgbG9vcCA9IGluamVjdE5ndExvb3AoKTtcblx0XHRjb25zdCBkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuXG5cdFx0cmV0dXJuIChjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50KSA9PiB7XG5cdFx0XHRjb25zdCBleGlzdCA9IHJvb3RzLmhhcyhjYW52YXMpO1xuXHRcdFx0bGV0IHN0b3JlID0gcm9vdHMuZ2V0KGNhbnZhcykgYXMgTmd0U2lnbmFsU3RvcmU8Tmd0U3RhdGU+O1xuXG5cdFx0XHRpZiAoc3RvcmUpIHtcblx0XHRcdFx0Y29uc29sZS53YXJuKCdbTkdUXSBTYW1lIGNhbnZhcyByb290IGlzIGJlaW5nIGNyZWF0ZWQgdHdpY2UnKTtcblx0XHRcdH1cblxuXHRcdFx0c3RvcmUgfHw9IGluamVjdGVkU3RvcmU7XG5cblx0XHRcdGlmICghc3RvcmUpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCdbTkdUXSBObyBzdG9yZSBpbml0aWFsaXplZCcpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIWV4aXN0KSB7XG5cdFx0XHRcdHJvb3RzLnNldChjYW52YXMsIHN0b3JlKTtcblx0XHRcdH1cblxuXHRcdFx0bGV0IGlzQ29uZmlndXJlZCA9IGZhbHNlO1xuXHRcdFx0bGV0IGludmFsaWRhdGVSZWY6IEVmZmVjdFJlZjtcblxuXHRcdFx0ZGVzdHJveVJlZi5vbkRlc3Ryb3koKCkgPT4gaW52YWxpZGF0ZVJlZj8uZGVzdHJveSgpKTtcblxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0aXNDb25maWd1cmVkLFxuXHRcdFx0XHRkZXN0cm95OiAodGltZW91dCA9IDUwMCkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IHJvb3QgPSByb290cy5nZXQoY2FudmFzKTtcblx0XHRcdFx0XHRpZiAocm9vdCkge1xuXHRcdFx0XHRcdFx0cm9vdC5zZXQoKHN0YXRlKSA9PiAoeyBpbnRlcm5hbDogeyAuLi5zdGF0ZS5pbnRlcm5hbCwgYWN0aXZlOiBmYWxzZSB9IH0pKTtcblx0XHRcdFx0XHRcdHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IHN0YXRlID0gcm9vdC5nZXQoKTtcblx0XHRcdFx0XHRcdFx0XHRzdGF0ZS5ldmVudHMuZGlzY29ubmVjdD8uKCk7XG5cdFx0XHRcdFx0XHRcdFx0c3RhdGUuZ2w/LnJlbmRlckxpc3RzPy5kaXNwb3NlPy4oKTtcblx0XHRcdFx0XHRcdFx0XHRzdGF0ZS5nbD8uZm9yY2VDb250ZXh0TG9zcz8uKCk7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKHN0YXRlLmdsPy54cikgc3RhdGUueHIuZGlzY29ubmVjdCgpO1xuXHRcdFx0XHRcdFx0XHRcdGRpc3Bvc2Uoc3RhdGUpO1xuXHRcdFx0XHRcdFx0XHRcdHJvb3RzLmRlbGV0ZShjYW52YXMpO1xuXHRcdFx0XHRcdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc29sZS5lcnJvcignW05HVF0gVW5leHBlY3RlZCBlcnJvciB3aGlsZSBkZXN0cm95aW5nIENhbnZhcyBSb290JywgZSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0sIHRpbWVvdXQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSxcblx0XHRcdFx0Y29uZmlndXJlOiAoaW5wdXRzOiBOZ3RDYW52YXNJbnB1dHMpID0+IHtcblx0XHRcdFx0XHRjb25zdCB7XG5cdFx0XHRcdFx0XHRnbDogZ2xPcHRpb25zLFxuXHRcdFx0XHRcdFx0c2l6ZTogc2l6ZU9wdGlvbnMsXG5cdFx0XHRcdFx0XHRjYW1lcmE6IGNhbWVyYU9wdGlvbnMsXG5cdFx0XHRcdFx0XHRyYXljYXN0ZXI6IHJheWNhc3Rlck9wdGlvbnMsXG5cdFx0XHRcdFx0XHRzY2VuZTogc2NlbmVPcHRpb25zLFxuXHRcdFx0XHRcdFx0ZXZlbnRzLFxuXHRcdFx0XHRcdFx0b3J0aG9ncmFwaGljLFxuXHRcdFx0XHRcdFx0bG9va0F0LFxuXHRcdFx0XHRcdFx0c2hhZG93cyxcblx0XHRcdFx0XHRcdGxpbmVhcixcblx0XHRcdFx0XHRcdGxlZ2FjeSxcblx0XHRcdFx0XHRcdGZsYXQsXG5cdFx0XHRcdFx0XHRkcHIsXG5cdFx0XHRcdFx0XHRmcmFtZWxvb3AsXG5cdFx0XHRcdFx0XHRwZXJmb3JtYW5jZSxcblx0XHRcdFx0XHR9ID0gaW5wdXRzO1xuXG5cdFx0XHRcdFx0Y29uc3Qgc3RhdGUgPSBzdG9yZS5nZXQoKTtcblx0XHRcdFx0XHRjb25zdCBzdGF0ZVRvVXBkYXRlOiBQYXJ0aWFsPE5ndFN0YXRlPiA9IHt9O1xuXG5cdFx0XHRcdFx0Ly8gc2V0dXAgcmVuZGVyZXJcblx0XHRcdFx0XHRsZXQgZ2wgPSBzdGF0ZS5nbDtcblx0XHRcdFx0XHRpZiAoIXN0YXRlLmdsKSBzdGF0ZVRvVXBkYXRlLmdsID0gZ2wgPSBtYWtlRGVmYXVsdFJlbmRlcmVyKGdsT3B0aW9ucywgY2FudmFzKTtcblxuXHRcdFx0XHRcdC8vIHNldHVwIHJheWNhc3RlclxuXHRcdFx0XHRcdGxldCByYXljYXN0ZXIgPSBzdGF0ZS5yYXljYXN0ZXI7XG5cdFx0XHRcdFx0aWYgKCFyYXljYXN0ZXIpIHN0YXRlVG9VcGRhdGUucmF5Y2FzdGVyID0gcmF5Y2FzdGVyID0gbmV3IFRIUkVFLlJheWNhc3RlcigpO1xuXG5cdFx0XHRcdFx0Ly8gc2V0IHJheWNhc3RlciBvcHRpb25zXG5cdFx0XHRcdFx0Y29uc3QgeyBwYXJhbXMsIC4uLm9wdGlvbnMgfSA9IHJheWNhc3Rlck9wdGlvbnMgfHwge307XG5cdFx0XHRcdFx0aWYgKCFpcy5lcXUob3B0aW9ucywgcmF5Y2FzdGVyLCBzaGFsbG93TG9vc2UpKSBhcHBseVByb3BzKHJheWNhc3RlciwgeyAuLi5vcHRpb25zIH0pO1xuXHRcdFx0XHRcdGlmICghaXMuZXF1KHBhcmFtcywgcmF5Y2FzdGVyLnBhcmFtcywgc2hhbGxvd0xvb3NlKSkge1xuXHRcdFx0XHRcdFx0YXBwbHlQcm9wcyhyYXljYXN0ZXIsIHsgcGFyYW1zOiB7IC4uLnJheWNhc3Rlci5wYXJhbXMsIC4uLihwYXJhbXMgfHwge30pIH0gfSk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gY3JlYXRlIGRlZmF1bHQgY2FtZXJhXG5cdFx0XHRcdFx0aWYgKCFzdGF0ZS5jYW1lcmEpIHtcblx0XHRcdFx0XHRcdGNvbnN0IGlzQ2FtZXJhID0gaXMuY2FtZXJhKGNhbWVyYU9wdGlvbnMpO1xuXHRcdFx0XHRcdFx0bGV0IGNhbWVyYSA9IGlzQ2FtZXJhID8gY2FtZXJhT3B0aW9ucyA6IG1ha2VEZWZhdWx0Q2FtZXJhKG9ydGhvZ3JhcGhpYyB8fCBmYWxzZSwgc3RhdGUuc2l6ZSk7XG5cblx0XHRcdFx0XHRcdGlmICghaXNDYW1lcmEpIHtcblx0XHRcdFx0XHRcdFx0aWYgKGNhbWVyYU9wdGlvbnMpIGFwcGx5UHJvcHMoY2FtZXJhLCBjYW1lcmFPcHRpb25zKTtcblxuXHRcdFx0XHRcdFx0XHQvLyBzZXQgcG9zaXRpb24uelxuXHRcdFx0XHRcdFx0XHRpZiAoIWNhbWVyYU9wdGlvbnM/LnBvc2l0aW9uKSBjYW1lcmEucG9zaXRpb24ueiA9IDU7XG5cblx0XHRcdFx0XHRcdFx0Ly8gYWx3YXlzIGxvb2sgYXQgY2VudGVyIG9yIHBhc3NlZC1pbiBsb29rQXQgYnkgZGVmYXVsdFxuXHRcdFx0XHRcdFx0XHRpZiAoIWNhbWVyYU9wdGlvbnM/LnJvdGF0aW9uICYmICFjYW1lcmFPcHRpb25zPy5xdWF0ZXJuaW9uKSB7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKEFycmF5LmlzQXJyYXkobG9va0F0KSkgY2FtZXJhLmxvb2tBdChsb29rQXRbMF0sIGxvb2tBdFsxXSwgbG9va0F0WzJdKTtcblx0XHRcdFx0XHRcdFx0XHRlbHNlIGlmIChsb29rQXQgaW5zdGFuY2VvZiBUSFJFRS5WZWN0b3IzKSBjYW1lcmEubG9va0F0KGxvb2tBdCk7XG5cdFx0XHRcdFx0XHRcdFx0ZWxzZSBjYW1lcmEubG9va0F0KDAsIDAsIDApO1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0Ly8gdXBkYXRlIHByb2plY3Rpb24gbWF0cml4IGFmdGVyIGFwcGx5cHJvcHNcblx0XHRcdFx0XHRcdFx0Y2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXg/LigpO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAoIWlzLmluc3RhbmNlKGNhbWVyYSkpIGNhbWVyYSA9IHByZXBhcmUoY2FtZXJhLCB7IHN0b3JlIH0pO1xuXG5cdFx0XHRcdFx0XHRzdGF0ZVRvVXBkYXRlLmNhbWVyYSA9IGNhbWVyYTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBTZXQgdXAgc2NlbmUgKG9uZSB0aW1lIG9ubHkhKVxuXHRcdFx0XHRcdGlmICghc3RhdGUuc2NlbmUpIHtcblx0XHRcdFx0XHRcdGxldCBzY2VuZTogVEhSRUUuU2NlbmU7XG5cblx0XHRcdFx0XHRcdGlmIChzY2VuZU9wdGlvbnMgaW5zdGFuY2VvZiBUSFJFRS5TY2VuZSkge1xuXHRcdFx0XHRcdFx0XHRzY2VuZSA9IHByZXBhcmUoc2NlbmVPcHRpb25zLCB7IHN0b3JlIH0pO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0c2NlbmUgPSBwcmVwYXJlKG5ldyBUSFJFRS5TY2VuZSgpLCB7IHN0b3JlIH0pO1xuXHRcdFx0XHRcdFx0XHRpZiAoc2NlbmVPcHRpb25zKSBhcHBseVByb3BzKHNjZW5lLCBzY2VuZU9wdGlvbnMpO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRzdGF0ZVRvVXBkYXRlLnNjZW5lID0gc2NlbmU7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gU2V0IHVwIFhSIChvbmUgdGltZSBvbmx5ISlcblx0XHRcdFx0XHRpZiAoIXN0YXRlLnhyKSB7XG5cdFx0XHRcdFx0XHQvLyBIYW5kbGUgZnJhbWUgYmVoYXZpb3IgaW4gV2ViWFJcblx0XHRcdFx0XHRcdGNvbnN0IGhhbmRsZVhSRnJhbWU6IFhSRnJhbWVSZXF1ZXN0Q2FsbGJhY2sgPSAodGltZXN0YW1wOiBudW1iZXIsIGZyYW1lPzogWFJGcmFtZSkgPT4ge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBzdGF0ZSA9IHN0b3JlLmdldCgpO1xuXHRcdFx0XHRcdFx0XHRpZiAoc3RhdGUuZnJhbWVsb29wID09PSAnbmV2ZXInKSByZXR1cm47XG5cdFx0XHRcdFx0XHRcdGxvb3AuYWR2YW5jZSh0aW1lc3RhbXAsIHRydWUsIHN0b3JlLCBmcmFtZSk7XG5cdFx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0XHQvLyBUb2dnbGUgcmVuZGVyIHN3aXRjaGluZyBvbiBzZXNzaW9uXG5cdFx0XHRcdFx0XHRjb25zdCBoYW5kbGVTZXNzaW9uQ2hhbmdlID0gKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBzdGF0ZSA9IHN0b3JlLmdldCgpO1xuXHRcdFx0XHRcdFx0XHRzdGF0ZS5nbC54ci5lbmFibGVkID0gc3RhdGUuZ2wueHIuaXNQcmVzZW50aW5nO1xuXG5cdFx0XHRcdFx0XHRcdHN0YXRlLmdsLnhyLnNldEFuaW1hdGlvbkxvb3Aoc3RhdGUuZ2wueHIuaXNQcmVzZW50aW5nID8gaGFuZGxlWFJGcmFtZSA6IG51bGwpO1xuXHRcdFx0XHRcdFx0XHRpZiAoIXN0YXRlLmdsLnhyLmlzUHJlc2VudGluZykgbG9vcC5pbnZhbGlkYXRlKHN0b3JlKTtcblx0XHRcdFx0XHRcdH07XG5cblx0XHRcdFx0XHRcdC8vIFdlYlhSIHNlc3Npb24gbWFuYWdlclxuXHRcdFx0XHRcdFx0Y29uc3QgeHIgPSB7XG5cdFx0XHRcdFx0XHRcdGNvbm5lY3Q6ICgpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRnbC54ci5hZGRFdmVudExpc3RlbmVyKCdzZXNzaW9uc3RhcnQnLCBoYW5kbGVTZXNzaW9uQ2hhbmdlKTtcblx0XHRcdFx0XHRcdFx0XHRnbC54ci5hZGRFdmVudExpc3RlbmVyKCdzZXNzaW9uZW5kJywgaGFuZGxlU2Vzc2lvbkNoYW5nZSk7XG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdGRpc2Nvbm5lY3Q6ICgpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRnbC54ci5yZW1vdmVFdmVudExpc3RlbmVyKCdzZXNzaW9uc3RhcnQnLCBoYW5kbGVTZXNzaW9uQ2hhbmdlKTtcblx0XHRcdFx0XHRcdFx0XHRnbC54ci5yZW1vdmVFdmVudExpc3RlbmVyKCdzZXNzaW9uZW5kJywgaGFuZGxlU2Vzc2lvbkNoYW5nZSk7XG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0XHQvLyBTdWJzY3JpYmUgdG8gV2ViWFIgc2Vzc2lvbiBldmVudHNcblx0XHRcdFx0XHRcdGlmIChnbC54ciAmJiB0eXBlb2YgZ2wueHIuYWRkRXZlbnRMaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJykgeHIuY29ubmVjdCgpO1xuXHRcdFx0XHRcdFx0c3RhdGVUb1VwZGF0ZS54ciA9IHhyO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIFNldCBzaGFkb3dtYXBcblx0XHRcdFx0XHRpZiAoZ2wuc2hhZG93TWFwKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBvbGRFbmFibGVkID0gZ2wuc2hhZG93TWFwLmVuYWJsZWQ7XG5cdFx0XHRcdFx0XHRjb25zdCBvbGRUeXBlID0gZ2wuc2hhZG93TWFwLnR5cGU7XG5cdFx0XHRcdFx0XHRnbC5zaGFkb3dNYXAuZW5hYmxlZCA9ICEhc2hhZG93cztcblxuXHRcdFx0XHRcdFx0aWYgKHR5cGVvZiBzaGFkb3dzID09PSAnYm9vbGVhbicpIHtcblx0XHRcdFx0XHRcdFx0Z2wuc2hhZG93TWFwLnR5cGUgPSBUSFJFRS5QQ0ZTb2Z0U2hhZG93TWFwO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmICh0eXBlb2Ygc2hhZG93cyA9PT0gJ3N0cmluZycpIHtcblx0XHRcdFx0XHRcdFx0Y29uc3QgdHlwZXMgPSB7XG5cdFx0XHRcdFx0XHRcdFx0YmFzaWM6IFRIUkVFLkJhc2ljU2hhZG93TWFwLFxuXHRcdFx0XHRcdFx0XHRcdHBlcmNlbnRhZ2U6IFRIUkVFLlBDRlNoYWRvd01hcCxcblx0XHRcdFx0XHRcdFx0XHRzb2Z0OiBUSFJFRS5QQ0ZTb2Z0U2hhZG93TWFwLFxuXHRcdFx0XHRcdFx0XHRcdHZhcmlhbmNlOiBUSFJFRS5WU01TaGFkb3dNYXAsXG5cdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRcdGdsLnNoYWRvd01hcC50eXBlID0gdHlwZXNbc2hhZG93c10gPz8gVEhSRUUuUENGU29mdFNoYWRvd01hcDtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoaXMub2JqKHNoYWRvd3MpKSB7XG5cdFx0XHRcdFx0XHRcdE9iamVjdC5hc3NpZ24oZ2wuc2hhZG93TWFwLCBzaGFkb3dzKTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKG9sZEVuYWJsZWQgIT09IGdsLnNoYWRvd01hcC5lbmFibGVkIHx8IG9sZFR5cGUgIT09IGdsLnNoYWRvd01hcC50eXBlKVxuXHRcdFx0XHRcdFx0XHRjaGVja05lZWRzVXBkYXRlKGdsLnNoYWRvd01hcCk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gU2FmZWx5IHNldCBjb2xvciBtYW5hZ2VtZW50IGlmIGF2YWlsYWJsZS5cblx0XHRcdFx0XHQvLyBBdm9pZCBhY2Nlc3NpbmcgVEhSRUUuQ29sb3JNYW5hZ2VtZW50IHRvIHBsYXkgbmljZSB3aXRoIG9sZGVyIHZlcnNpb25zXG5cdFx0XHRcdFx0aWYgKFRIUkVFLkNvbG9yTWFuYWdlbWVudCkge1xuXHRcdFx0XHRcdFx0Y29uc3QgQ29sb3JNYW5hZ2VtZW50ID0gVEhSRUUuQ29sb3JNYW5hZ2VtZW50IGFzIE5ndEFueVJlY29yZDtcblx0XHRcdFx0XHRcdGlmICgnZW5hYmxlZCcgaW4gQ29sb3JNYW5hZ2VtZW50KSBDb2xvck1hbmFnZW1lbnRbJ2VuYWJsZWQnXSA9ICFsZWdhY3kgPz8gZmFsc2U7XG5cdFx0XHRcdFx0XHRlbHNlIGlmICgnbGVnYWN5TW9kZScgaW4gQ29sb3JNYW5hZ2VtZW50KSBDb2xvck1hbmFnZW1lbnRbJ2xlZ2FjeU1vZGUnXSA9IGxlZ2FjeSA/PyB0cnVlO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIHNldCBjb2xvciBzcGFjZSBhbmQgdG9uZW1hcHBpbmcgcHJlZmVyZW5jZXNcblx0XHRcdFx0XHRjb25zdCBMaW5lYXJFbmNvZGluZyA9IDMwMDA7XG5cdFx0XHRcdFx0Y29uc3Qgc1JHQkVuY29kaW5nID0gMzAwMTtcblx0XHRcdFx0XHRhcHBseVByb3BzKGdsLCB7XG5cdFx0XHRcdFx0XHRvdXRwdXRFbmNvZGluZzogbGluZWFyID8gTGluZWFyRW5jb2RpbmcgOiBzUkdCRW5jb2RpbmcsXG5cdFx0XHRcdFx0XHR0b25lTWFwcGluZzogZmxhdCA/IFRIUkVFLk5vVG9uZU1hcHBpbmcgOiBUSFJFRS5BQ0VTRmlsbWljVG9uZU1hcHBpbmcsXG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHQvLyBVcGRhdGUgY29sb3IgbWFuYWdlbWVudCBzdGF0ZVxuXHRcdFx0XHRcdGlmIChzdGF0ZS5sZWdhY3kgIT09IGxlZ2FjeSkgc3RhdGVUb1VwZGF0ZS5sZWdhY3kgPSBsZWdhY3k7XG5cdFx0XHRcdFx0aWYgKHN0YXRlLmxpbmVhciAhPT0gbGluZWFyKSBzdGF0ZVRvVXBkYXRlLmxpbmVhciA9IGxpbmVhcjtcblx0XHRcdFx0XHRpZiAoc3RhdGUuZmxhdCAhPT0gZmxhdCkgc3RhdGVUb1VwZGF0ZS5mbGF0ID0gZmxhdDtcblxuXHRcdFx0XHRcdC8vIFNldCBnbCBwcm9wc1xuXHRcdFx0XHRcdGdsLnNldENsZWFyQWxwaGEoMCk7XG5cdFx0XHRcdFx0Z2wuc2V0UGl4ZWxSYXRpbyhtYWtlRHByKHN0YXRlLnZpZXdwb3J0LmRwcikpO1xuXHRcdFx0XHRcdGdsLnNldFNpemUoc3RhdGUuc2l6ZS53aWR0aCwgc3RhdGUuc2l6ZS5oZWlnaHQpO1xuXG5cdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0aXMub2JqKGdsT3B0aW9ucykgJiZcblx0XHRcdFx0XHRcdCEodHlwZW9mIGdsT3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykgJiZcblx0XHRcdFx0XHRcdCFpcy5yZW5kZXJlcihnbE9wdGlvbnMpICYmXG5cdFx0XHRcdFx0XHQhaXMuZXF1KGdsT3B0aW9ucywgZ2wsIHNoYWxsb3dMb29zZSlcblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdGFwcGx5UHJvcHMoZ2wsIGdsT3B0aW9ucyk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gU3RvcmUgZXZlbnRzIGludGVybmFsbHlcblx0XHRcdFx0XHRpZiAoZXZlbnRzICYmICFzdGF0ZS5ldmVudHMuaGFuZGxlcnMpIHN0YXRlVG9VcGRhdGUuZXZlbnRzID0gZXZlbnRzKHN0b3JlKTtcblxuXHRcdFx0XHRcdC8vIENoZWNrIHBlcmZvcm1hbmNlXG5cdFx0XHRcdFx0aWYgKHBlcmZvcm1hbmNlICYmICFpcy5lcXUocGVyZm9ybWFuY2UsIHN0YXRlLnBlcmZvcm1hbmNlLCBzaGFsbG93TG9vc2UpKSB7XG5cdFx0XHRcdFx0XHRzdGF0ZVRvVXBkYXRlLnBlcmZvcm1hbmNlID0geyAuLi5zdGF0ZS5wZXJmb3JtYW5jZSwgLi4ucGVyZm9ybWFuY2UgfTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRzdG9yZS5zZXQoc3RhdGVUb1VwZGF0ZSk7XG5cblx0XHRcdFx0XHQvLyBDaGVjayBzaXplLCBhbGxvdyBpdCB0byB0YWtlIG9uIGNvbnRhaW5lciBib3VuZHMgaW5pdGlhbGx5XG5cdFx0XHRcdFx0Y29uc3Qgc2l6ZSA9IGNvbXB1dGVJbml0aWFsU2l6ZShjYW52YXMsIHNpemVPcHRpb25zKTtcblx0XHRcdFx0XHRpZiAoIWlzLmVxdShzaXplLCBzdGF0ZS5zaXplLCBzaGFsbG93TG9vc2UpKSB7XG5cdFx0XHRcdFx0XHRzdGF0ZS5zZXRTaXplKHNpemUud2lkdGgsIHNpemUuaGVpZ2h0LCBzaXplLnRvcCwgc2l6ZS5sZWZ0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Ly8gQ2hlY2sgcGl4ZWxyYXRpb1xuXHRcdFx0XHRcdGlmIChkcHIgJiYgc3RhdGUudmlld3BvcnQuZHByICE9PSBtYWtlRHByKGRwcikpIHN0YXRlLnNldERwcihkcHIpO1xuXHRcdFx0XHRcdC8vIENoZWNrIGZyYW1lbG9vcFxuXHRcdFx0XHRcdGlmIChzdGF0ZS5mcmFtZWxvb3AgIT09IGZyYW1lbG9vcCkgc3RhdGUuc2V0RnJhbWVsb29wKGZyYW1lbG9vcCk7XG5cblx0XHRcdFx0XHRpc0NvbmZpZ3VyZWQgPSB0cnVlO1xuXG5cdFx0XHRcdFx0aW52YWxpZGF0ZVJlZj8uZGVzdHJveSgpO1xuXHRcdFx0XHRcdGludmFsaWRhdGVSZWYgPSBlZmZlY3QoKCkgPT4gdm9pZCBzdG9yZS5zdGF0ZSgpLmludmFsaWRhdGUoKSwgeyBtYW51YWxDbGVhbnVwOiB0cnVlLCBpbmplY3RvciB9KTtcblx0XHRcdFx0fSxcblx0XHRcdH07XG5cdFx0fTtcblx0fSk7XG59XG5cbmV4cG9ydCB0eXBlIE5ndENhbnZhc0NvbmZpZ3VyYXRvciA9IFJldHVyblR5cGU8UmV0dXJuVHlwZTx0eXBlb2YgaW5qZWN0Q2FudmFzUm9vdEluaXRpYWxpemVyPj47XG5cbmZ1bmN0aW9uIGNvbXB1dGVJbml0aWFsU2l6ZShjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50IHwgVEhSRUUuT2Zmc2NyZWVuQ2FudmFzLCBkZWZhdWx0U2l6ZT86IE5ndFNpemUpOiBOZ3RTaXplIHtcblx0aWYgKGRlZmF1bHRTaXplKSByZXR1cm4gZGVmYXVsdFNpemU7XG5cblx0aWYgKGNhbnZhcyBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50ICYmIGNhbnZhcy5wYXJlbnRFbGVtZW50KSB7XG5cdFx0cmV0dXJuIGNhbnZhcy5wYXJlbnRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXHR9XG5cblx0cmV0dXJuIHsgd2lkdGg6IDAsIGhlaWdodDogMCwgdG9wOiAwLCBsZWZ0OiAwIH07XG59XG5cbi8vIERpc3Bvc2VzIGFuIG9iamVjdCBhbmQgYWxsIGl0cyBwcm9wZXJ0aWVzXG5mdW5jdGlvbiBkaXNwb3NlPFRPYmogZXh0ZW5kcyB7IGRpc3Bvc2U/OiAoKSA9PiB2b2lkOyB0eXBlPzogc3RyaW5nOyBba2V5OiBzdHJpbmddOiBhbnkgfT4ob2JqOiBUT2JqKSB7XG5cdGlmIChvYmouZGlzcG9zZSAmJiBvYmoudHlwZSAhPT0gJ1NjZW5lJykgb2JqLmRpc3Bvc2UoKTtcblx0Zm9yIChjb25zdCBwIGluIG9iaikge1xuXHRcdChwIGFzIGFueSkuZGlzcG9zZT8uKCk7XG5cdFx0ZGVsZXRlIG9ialtwXTtcblx0fVxufVxuIl19
@@ -3,11 +3,11 @@ import { ChangeDetectorRef, Component } from '@angular/core';
3
3
  import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
4
4
  import { ActivationEnd, Router, RouterOutlet } from '@angular/router';
5
5
  import { filter } from 'rxjs';
6
- import { ROUTED_SCENE } from './renderer/utils';
6
+ import { ROUTED_SCENE } from './renderer/constants';
7
7
  import { safeDetectChanges } from './utils/safe-detect-changes';
8
8
  import * as i0 from "@angular/core";
9
9
  import * as i1 from "@angular/router";
10
- class NgtRoutedScene {
10
+ export class NgtRoutedScene {
11
11
  static { _a = ROUTED_SCENE; }
12
12
  static { this[_a] = true; }
13
13
  constructor(router, cdr) {
@@ -15,17 +15,20 @@ class NgtRoutedScene {
15
15
  .pipe(filter((event) => event instanceof ActivationEnd), takeUntilDestroyed())
16
16
  .subscribe(() => safeDetectChanges(cdr));
17
17
  }
18
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgtRoutedScene, deps: [{ token: i1.Router }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
19
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.0", type: NgtRoutedScene, isStandalone: true, selector: "ngt-routed-scene", ngImport: i0, template: `<router-outlet />`, isInline: true, dependencies: [{ kind: "directive", type: RouterOutlet, selector: "router-outlet", inputs: ["name"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }] }); }
18
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.3", ngImport: i0, type: NgtRoutedScene, deps: [{ token: i1.Router }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
19
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.3", type: NgtRoutedScene, isStandalone: true, selector: "ngt-routed-scene", ngImport: i0, template: `
20
+ <router-outlet />
21
+ `, isInline: true, dependencies: [{ kind: "directive", type: RouterOutlet, selector: "router-outlet", inputs: ["name"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }] }); }
20
22
  }
21
- export { NgtRoutedScene };
22
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgtRoutedScene, decorators: [{
23
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.3", ngImport: i0, type: NgtRoutedScene, decorators: [{
23
24
  type: Component,
24
25
  args: [{
25
26
  standalone: true,
26
27
  selector: 'ngt-routed-scene',
27
- template: `<router-outlet />`,
28
+ template: `
29
+ <router-outlet />
30
+ `,
28
31
  imports: [RouterOutlet],
29
32
  }]
30
33
  }], ctorParameters: function () { return [{ type: i1.Router }, { type: i0.ChangeDetectorRef }]; } });
31
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGVkLXNjZW5lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyLXRocmVlL3NyYy9saWIvcm91dGVkLXNjZW5lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDOUIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDOzs7QUFFaEUsTUFNYSxjQUFjO2tCQUNmLFlBQVk7YUFBYixRQUFjLEdBQUcsSUFBSSxBQUFQLENBQVE7SUFFN0IsWUFBWSxNQUFjLEVBQUUsR0FBc0I7UUFDOUMsTUFBTSxDQUFDLE1BQU07YUFDUixJQUFJLENBQ0QsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLFlBQVksYUFBYSxDQUFDLEVBQ2pELGtCQUFrQixFQUFFLENBQ3ZCO2FBQ0EsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDakQsQ0FBQzs4R0FWUSxjQUFjO2tHQUFkLGNBQWMsNEVBSGIsbUJBQW1CLDREQUNuQixZQUFZOztTQUViLGNBQWM7MkZBQWQsY0FBYztrQkFOMUIsU0FBUzttQkFBQztvQkFDUCxVQUFVLEVBQUUsSUFBSTtvQkFDaEIsUUFBUSxFQUFFLGtCQUFrQjtvQkFDNUIsUUFBUSxFQUFFLG1CQUFtQjtvQkFDN0IsT0FBTyxFQUFFLENBQUMsWUFBWSxDQUFDO2lCQUMxQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IEFjdGl2YXRpb25FbmQsIFJvdXRlciwgUm91dGVyT3V0bGV0IH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IGZpbHRlciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgUk9VVEVEX1NDRU5FIH0gZnJvbSAnLi9yZW5kZXJlci91dGlscyc7XG5pbXBvcnQgeyBzYWZlRGV0ZWN0Q2hhbmdlcyB9IGZyb20gJy4vdXRpbHMvc2FmZS1kZXRlY3QtY2hhbmdlcyc7XG5cbkBDb21wb25lbnQoe1xuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgc2VsZWN0b3I6ICduZ3Qtcm91dGVkLXNjZW5lJyxcbiAgICB0ZW1wbGF0ZTogYDxyb3V0ZXItb3V0bGV0IC8+YCxcbiAgICBpbXBvcnRzOiBbUm91dGVyT3V0bGV0XSxcbn0pXG5leHBvcnQgY2xhc3MgTmd0Um91dGVkU2NlbmUge1xuICAgIHN0YXRpYyBbUk9VVEVEX1NDRU5FXSA9IHRydWU7XG5cbiAgICBjb25zdHJ1Y3Rvcihyb3V0ZXI6IFJvdXRlciwgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZikge1xuICAgICAgICByb3V0ZXIuZXZlbnRzXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBmaWx0ZXIoKGV2ZW50KSA9PiBldmVudCBpbnN0YW5jZW9mIEFjdGl2YXRpb25FbmQpLFxuICAgICAgICAgICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCgpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHNhZmVEZXRlY3RDaGFuZ2VzKGNkcikpO1xuICAgIH1cbn1cbiJdfQ==
34
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGVkLXNjZW5lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvcm91dGVkLXNjZW5lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDOUIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDOzs7QUFVaEUsTUFBTSxPQUFPLGNBQWM7a0JBQ2xCLFlBQVk7YUFBYixRQUFjLEdBQUcsSUFBSSxBQUFQLENBQVE7SUFFN0IsWUFBWSxNQUFjLEVBQUUsR0FBc0I7UUFDakQsTUFBTSxDQUFDLE1BQU07YUFDWCxJQUFJLENBQ0osTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLFlBQVksYUFBYSxDQUFDLEVBQ2pELGtCQUFrQixFQUFFLENBQ3BCO2FBQ0EsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDM0MsQ0FBQzs4R0FWVyxjQUFjO2tHQUFkLGNBQWMsNEVBTGhCOztFQUVULDREQUNTLFlBQVk7OzJGQUVWLGNBQWM7a0JBUjFCLFNBQVM7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLFFBQVEsRUFBRSxrQkFBa0I7b0JBQzVCLFFBQVEsRUFBRTs7RUFFVDtvQkFDRCxPQUFPLEVBQUUsQ0FBQyxZQUFZLENBQUM7aUJBQ3ZCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgQWN0aXZhdGlvbkVuZCwgUm91dGVyLCBSb3V0ZXJPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgZmlsdGVyIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBST1VURURfU0NFTkUgfSBmcm9tICcuL3JlbmRlcmVyL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBzYWZlRGV0ZWN0Q2hhbmdlcyB9IGZyb20gJy4vdXRpbHMvc2FmZS1kZXRlY3QtY2hhbmdlcyc7XG5cbkBDb21wb25lbnQoe1xuXHRzdGFuZGFsb25lOiB0cnVlLFxuXHRzZWxlY3RvcjogJ25ndC1yb3V0ZWQtc2NlbmUnLFxuXHR0ZW1wbGF0ZTogYFxuXHRcdDxyb3V0ZXItb3V0bGV0IC8+XG5cdGAsXG5cdGltcG9ydHM6IFtSb3V0ZXJPdXRsZXRdLFxufSlcbmV4cG9ydCBjbGFzcyBOZ3RSb3V0ZWRTY2VuZSB7XG5cdHN0YXRpYyBbUk9VVEVEX1NDRU5FXSA9IHRydWU7XG5cblx0Y29uc3RydWN0b3Iocm91dGVyOiBSb3V0ZXIsIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHtcblx0XHRyb3V0ZXIuZXZlbnRzXG5cdFx0XHQucGlwZShcblx0XHRcdFx0ZmlsdGVyKChldmVudCkgPT4gZXZlbnQgaW5zdGFuY2VvZiBBY3RpdmF0aW9uRW5kKSxcblx0XHRcdFx0dGFrZVVudGlsRGVzdHJveWVkKCksXG5cdFx0XHQpXG5cdFx0XHQuc3Vic2NyaWJlKCgpID0+IHNhZmVEZXRlY3RDaGFuZ2VzKGNkcikpO1xuXHR9XG59XG4iXX0=