@decohere/crucible 0.0.1-dev.3 → 0.0.1-dev.31

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 (45) hide show
  1. package/commonjs/src/const.js +33 -0
  2. package/commonjs/src/decorators/index.js +21 -0
  3. package/commonjs/src/decorators/inject.decorator.js +27 -0
  4. package/commonjs/src/decorators/injectable.dectorator.js +16 -0
  5. package/commonjs/src/index.js +22 -0
  6. package/commonjs/src/models/registration-key.model.js +31 -0
  7. package/commonjs/src/models/service-registration.model.js +30 -0
  8. package/commonjs/src/services/crucible-builder.js +68 -0
  9. package/commonjs/src/services/crucible.js +165 -0
  10. package/commonjs/src/services/index.js +21 -0
  11. package/commonjs/src/services/service-registry.js +50 -0
  12. package/commonjs/src/types/errors.js +29 -0
  13. package/commonjs/src/types/index.js +20 -0
  14. package/commonjs/src/types/types.js +6 -0
  15. package/{src → es6/src}/decorators/inject.decorator.js +2 -2
  16. package/es6/src/services/crucible.js +155 -0
  17. package/package.json +3 -3
  18. package/types/src/const.d.ts +9 -0
  19. package/types/src/decorators/index.d.ts +2 -0
  20. package/types/src/decorators/inject.decorator.d.ts +5 -0
  21. package/types/src/decorators/injectable.dectorator.d.ts +1 -0
  22. package/types/src/index.d.ts +3 -0
  23. package/types/src/models/registration-key.model.d.ts +7 -0
  24. package/types/src/models/service-registration.model.d.ts +11 -0
  25. package/types/src/services/crucible-builder.d.ts +26 -0
  26. package/types/src/services/crucible.d.ts +31 -0
  27. package/types/src/services/index.d.ts +2 -0
  28. package/types/src/services/service-registry.d.ts +16 -0
  29. package/types/src/types/errors.d.ts +6 -0
  30. package/types/src/types/index.d.ts +1 -0
  31. package/types/src/types/types.d.ts +1 -0
  32. package/src/services/crucible.js +0 -133
  33. package/tests/container.spec.js +0 -259
  34. /package/{src → es6/src}/const.js +0 -0
  35. /package/{src → es6/src}/decorators/index.js +0 -0
  36. /package/{src → es6/src}/decorators/injectable.dectorator.js +0 -0
  37. /package/{src → es6/src}/index.js +0 -0
  38. /package/{src → es6/src}/models/registration-key.model.js +0 -0
  39. /package/{src → es6/src}/models/service-registration.model.js +0 -0
  40. /package/{src → es6/src}/services/crucible-builder.js +0 -0
  41. /package/{src → es6/src}/services/index.js +0 -0
  42. /package/{src → es6/src}/services/service-registry.js +0 -0
  43. /package/{src → es6/src}/types/errors.js +0 -0
  44. /package/{src → es6/src}/types/index.js +0 -0
  45. /package/{src → es6/src}/types/types.js +0 -0
@@ -1,259 +0,0 @@
1
- function _ts_add_disposable_resource(env, value, async) {
2
- if (value !== null && value !== void 0) {
3
- if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
4
- var dispose, inner;
5
- if (async) {
6
- if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
7
- dispose = value[Symbol.asyncDispose];
8
- }
9
- if (dispose === void 0) {
10
- if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
11
- dispose = value[Symbol.dispose];
12
- if (async) inner = dispose;
13
- }
14
- if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
15
- if (inner) dispose = function() {
16
- try {
17
- inner.call(this);
18
- } catch (e) {
19
- return Promise.reject(e);
20
- }
21
- };
22
- env.stack.push({
23
- value: value,
24
- dispose: dispose,
25
- async: async
26
- });
27
- } else if (async) {
28
- env.stack.push({
29
- async: true
30
- });
31
- }
32
- return value;
33
- }
34
- function _ts_dispose_resources(env) {
35
- var _SuppressedError = typeof SuppressedError === "function" ? SuppressedError : function(error, suppressed, message) {
36
- var e = new Error(message);
37
- return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
38
- };
39
- return (_ts_dispose_resources = function _ts_dispose_resources(env) {
40
- function fail(e) {
41
- env.error = env.hasError ? new _SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
42
- env.hasError = true;
43
- }
44
- var r, s = 0;
45
- function next() {
46
- while(r = env.stack.pop()){
47
- try {
48
- if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);
49
- if (r.dispose) {
50
- var result = r.dispose.call(r.value);
51
- if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) {
52
- fail(e);
53
- return next();
54
- });
55
- } else s |= 1;
56
- } catch (e) {
57
- fail(e);
58
- }
59
- }
60
- if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
61
- if (env.hasError) throw env.error;
62
- }
63
- return next();
64
- })(env);
65
- }
66
- import { CrucibleBuilder } from "../src/index.js";
67
- import { beforeEach, describe, expect, it, vi } from "vitest";
68
- class Disposable {
69
- [Symbol.dispose]() {
70
- this.dispose();
71
- }
72
- dispose() {}
73
- }
74
- class Singleton {
75
- nonce;
76
- constructor(){
77
- this.nonce = getRandomInt();
78
- }
79
- }
80
- describe("CrucibleBuilder", ()=>{
81
- let builder;
82
- beforeEach(()=>{
83
- vi.clearAllMocks();
84
- builder = new CrucibleBuilder();
85
- });
86
- describe("Factories", ()=>{
87
- const FACTORY_KEY = "MY_FACTORY";
88
- // using a spy for the factory changes the type
89
- // this is the only way to ensure the factory is actually called
90
- it("should support arrow functions", ()=>{
91
- const builder = new CrucibleBuilder();
92
- const expected = {
93
- field: "fieldValue"
94
- };
95
- const factory = ()=>expected;
96
- builder.registerRequestScoped(FACTORY_KEY, factory);
97
- const container = builder.build();
98
- const actual = container.resolve(FACTORY_KEY);
99
- expect(actual).toEqual(expected);
100
- });
101
- });
102
- describe("Dispose", ()=>{
103
- const dispose = vi.spyOn(Disposable.prototype, "dispose");
104
- it("should dispose the child scope", ()=>{
105
- {
106
- const env = {
107
- stack: [],
108
- error: void 0,
109
- hasError: false
110
- };
111
- try {
112
- const builder = new CrucibleBuilder();
113
- builder.registerRequestScoped(Disposable);
114
- const container = builder.build();
115
- const scope = _ts_add_disposable_resource(env, container.beginScope(), false);
116
- scope.resolve(Disposable);
117
- } catch (e) {
118
- env.error = e;
119
- env.hasError = true;
120
- } finally{
121
- _ts_dispose_resources(env);
122
- }
123
- }
124
- expect(dispose).toHaveBeenCalled();
125
- });
126
- it("should dispose root container without recursive self-disposal", ()=>{
127
- const builder = new CrucibleBuilder();
128
- const container = builder.build();
129
- container.resolve("LIFETIME_SCOPE");
130
- expect(()=>container[Symbol.dispose]()).not.toThrow();
131
- });
132
- // it("should support n level scoped?", () => {
133
- // const builder = new CrucibleBuilder();
134
- // builder.registerRequestScoped(Disposable);
135
- // const container = builder.build();
136
- // using scope = container.beginScope();
137
- // });
138
- });
139
- describe("Singletons", ()=>{
140
- it("should resolve singleton from the root scope", ()=>{
141
- // this checks that the same singleton is resolved in all child scopes
142
- const builder = new CrucibleBuilder();
143
- builder.registerSingleton(Singleton);
144
- const container = builder.build();
145
- const child = container.beginScope();
146
- const inst1 = container.resolve(Singleton);
147
- const inst2 = child.resolve(Singleton);
148
- const manualInst = new Singleton();
149
- expect(inst1).toBe(inst2);
150
- expect(manualInst).not.toEqual(inst1);
151
- expect(manualInst).not.toEqual(inst2);
152
- });
153
- });
154
- describe("registerRequestScoped", ()=>{
155
- it("should resolve the same instance in the same scope", ()=>{
156
- builder.registerRequestScoped(Disposable);
157
- const container = builder.build();
158
- const childA = container.beginScope(getRandomInt().toString());
159
- const serviceA = childA.resolve(Disposable);
160
- const serviceB = childA.resolve(Disposable);
161
- expect(serviceA).toBe(serviceB);
162
- });
163
- it("should resolve a new instance per scope", ()=>{
164
- builder.registerRequestScoped(Disposable);
165
- const container = builder.build();
166
- const childA = container.beginScope(generateScopeId());
167
- const serviceA = childA.resolve(Disposable);
168
- const childB = container.beginScope(generateScopeId());
169
- const serviceB = childB.resolve(Disposable);
170
- expect(serviceA).not.toBe(serviceB);
171
- });
172
- });
173
- describe("beginScope", ()=>{
174
- it("should support n level isolated scopes", ()=>{
175
- builder.registerRequestScoped(Disposable);
176
- const container = builder.build();
177
- const childA = container.beginScope(generateScopeId());
178
- const gandchildA = childA.beginScope(generateScopeId());
179
- const serviceChildA = childA.resolve(Disposable);
180
- const serviceGandchildA = gandchildA.resolve(Disposable);
181
- expect(serviceChildA).not.toBe(serviceGandchildA);
182
- });
183
- it("should not dispose the child scope if parent is disposed", ()=>{
184
- builder.registerRequestScoped(Disposable);
185
- const container = builder.build();
186
- let grandChild;
187
- {
188
- const env = {
189
- stack: [],
190
- error: void 0,
191
- hasError: false
192
- };
193
- try {
194
- const child = _ts_add_disposable_resource(env, container.beginScope(generateScopeId()), false);
195
- grandChild = child.beginScope(generateScopeId());
196
- } catch (e) {
197
- env.error = e;
198
- env.hasError = true;
199
- } finally{
200
- _ts_dispose_resources(env);
201
- }
202
- }
203
- expect(()=>grandChild.resolve(Disposable)).not.toThrow();
204
- });
205
- it("should throw if resolving singleton owned by root if roto scope disposed", ()=>{
206
- builder.registerSingleton(Singleton);
207
- let child;
208
- {
209
- const env = {
210
- stack: [],
211
- error: void 0,
212
- hasError: false
213
- };
214
- try {
215
- const container = _ts_add_disposable_resource(env, builder.build(), false);
216
- child = container.beginScope(generateScopeId());
217
- } catch (e) {
218
- env.error = e;
219
- env.hasError = true;
220
- } finally{
221
- _ts_dispose_resources(env);
222
- }
223
- }
224
- expect(()=>child.resolve(Singleton)).toThrow();
225
- });
226
- it("should dispose if exception is throw", ()=>{
227
- builder.registerRequestScoped(Disposable);
228
- let containerRef;
229
- try {
230
- const env = {
231
- stack: [],
232
- error: void 0,
233
- hasError: false
234
- };
235
- try {
236
- const container = _ts_add_disposable_resource(env, builder.build(), false);
237
- containerRef = container;
238
- throw "ERROR";
239
- } catch (e) {
240
- env.error = e;
241
- env.hasError = true;
242
- } finally{
243
- _ts_dispose_resources(env);
244
- }
245
- } catch {}
246
- expect(()=>containerRef.resolve(Disposable)).toThrow();
247
- });
248
- });
249
- });
250
- function generateScopeId() {
251
- return getRandomInt().toString();
252
- }
253
- function getRandomInt() {
254
- const min = Math.ceil(0);
255
- const max = Math.floor(10_000);
256
- return Math.floor(Math.random() * (max - min + 1)) + min;
257
- }
258
-
259
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NydWNpYmxlL3Rlc3RzL2NvbnRhaW5lci5zcGVjLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHR5cGUgQ3J1Y2libGUsIENydWNpYmxlQnVpbGRlciwgdHlwZSBMaWZldGltZVNjb3BlIH0gZnJvbSBcIkBkZWNvaGVyZS9jcnVjaWJsZVwiO1xuaW1wb3J0IHsgYmVmb3JlRWFjaCwgZGVzY3JpYmUsIGV4cGVjdCwgaXQsIHZpIH0gZnJvbSBcInZpdGVzdFwiO1xuXG5jbGFzcyBEaXNwb3NhYmxlIHtcblx0cHVibGljIFtTeW1ib2wuZGlzcG9zZV0oKSB7XG5cdFx0dGhpcy5kaXNwb3NlKCk7XG5cdH1cblx0cHVibGljIGRpc3Bvc2UoKSB7fVxufVxuXG5jbGFzcyBTaW5nbGV0b24ge1xuXHRwdWJsaWMgbm9uY2U6IG51bWJlcjtcblx0cHVibGljIGNvbnN0cnVjdG9yKCkge1xuXHRcdHRoaXMubm9uY2UgPSBnZXRSYW5kb21JbnQoKTtcblx0fVxufVxuXG5kZXNjcmliZShcIkNydWNpYmxlQnVpbGRlclwiLCAoKSA9PiB7XG5cdGxldCBidWlsZGVyOiBDcnVjaWJsZUJ1aWxkZXI7XG5cdGJlZm9yZUVhY2goKCkgPT4ge1xuXHRcdHZpLmNsZWFyQWxsTW9ja3MoKTtcblx0XHRidWlsZGVyID0gbmV3IENydWNpYmxlQnVpbGRlcigpO1xuXHR9KTtcblxuXHRkZXNjcmliZShcIkZhY3Rvcmllc1wiLCAoKSA9PiB7XG5cdFx0dHlwZSBGYWN0b3J5UmVzcG9uc2UgPSB7IGZpZWxkOiBcImZpZWxkVmFsdWVcIiB9O1xuXHRcdGNvbnN0IEZBQ1RPUllfS0VZID0gXCJNWV9GQUNUT1JZXCI7XG5cdFx0Ly8gdXNpbmcgYSBzcHkgZm9yIHRoZSBmYWN0b3J5IGNoYW5nZXMgdGhlIHR5cGVcblx0XHQvLyB0aGlzIGlzIHRoZSBvbmx5IHdheSB0byBlbnN1cmUgdGhlIGZhY3RvcnkgaXMgYWN0dWFsbHkgY2FsbGVkXG5cdFx0aXQoXCJzaG91bGQgc3VwcG9ydCBhcnJvdyBmdW5jdGlvbnNcIiwgKCkgPT4ge1xuXHRcdFx0Y29uc3QgYnVpbGRlciA9IG5ldyBDcnVjaWJsZUJ1aWxkZXIoKTtcblx0XHRcdGNvbnN0IGV4cGVjdGVkOiBGYWN0b3J5UmVzcG9uc2UgPSB7IGZpZWxkOiBcImZpZWxkVmFsdWVcIiB9O1xuXHRcdFx0Y29uc3QgZmFjdG9yeSA9ICgpID0+IGV4cGVjdGVkO1xuXHRcdFx0YnVpbGRlci5yZWdpc3RlclJlcXVlc3RTY29wZWQ8RmFjdG9yeVJlc3BvbnNlPihGQUNUT1JZX0tFWSwgZmFjdG9yeSk7XG5cdFx0XHRjb25zdCBjb250YWluZXIgPSBidWlsZGVyLmJ1aWxkKCk7XG5cdFx0XHRjb25zdCBhY3R1YWwgPSBjb250YWluZXIucmVzb2x2ZShGQUNUT1JZX0tFWSk7XG5cdFx0XHRleHBlY3QoYWN0dWFsKS50b0VxdWFsKGV4cGVjdGVkKTtcblx0XHR9KTtcblx0fSk7XG5cblx0ZGVzY3JpYmUoXCJEaXNwb3NlXCIsICgpID0+IHtcblx0XHRjb25zdCBkaXNwb3NlID0gdmkuc3B5T24oRGlzcG9zYWJsZS5wcm90b3R5cGUsIFwiZGlzcG9zZVwiKTtcblxuXHRcdGl0KFwic2hvdWxkIGRpc3Bvc2UgdGhlIGNoaWxkIHNjb3BlXCIsICgpID0+IHtcblx0XHRcdHtcblx0XHRcdFx0Y29uc3QgYnVpbGRlciA9IG5ldyBDcnVjaWJsZUJ1aWxkZXIoKTtcblx0XHRcdFx0YnVpbGRlci5yZWdpc3RlclJlcXVlc3RTY29wZWQoRGlzcG9zYWJsZSk7XG5cdFx0XHRcdGNvbnN0IGNvbnRhaW5lciA9IGJ1aWxkZXIuYnVpbGQoKTtcblx0XHRcdFx0dXNpbmcgc2NvcGUgPSBjb250YWluZXIuYmVnaW5TY29wZSgpO1xuXHRcdFx0XHRzY29wZS5yZXNvbHZlKERpc3Bvc2FibGUpO1xuXHRcdFx0fVxuXG5cdFx0XHRleHBlY3QoZGlzcG9zZSkudG9IYXZlQmVlbkNhbGxlZCgpO1xuXHRcdH0pO1xuXG5cdFx0aXQoXCJzaG91bGQgZGlzcG9zZSByb290IGNvbnRhaW5lciB3aXRob3V0IHJlY3Vyc2l2ZSBzZWxmLWRpc3Bvc2FsXCIsICgpID0+IHtcblx0XHRcdGNvbnN0IGJ1aWxkZXIgPSBuZXcgQ3J1Y2libGVCdWlsZGVyKCk7XG5cdFx0XHRjb25zdCBjb250YWluZXIgPSBidWlsZGVyLmJ1aWxkKCk7XG5cdFx0XHRjb250YWluZXIucmVzb2x2ZShcIkxJRkVUSU1FX1NDT1BFXCIpO1xuXG5cdFx0XHRleHBlY3QoKCkgPT4gY29udGFpbmVyW1N5bWJvbC5kaXNwb3NlXSgpKS5ub3QudG9UaHJvdygpO1xuXHRcdH0pO1xuXG5cdFx0Ly8gaXQoXCJzaG91bGQgc3VwcG9ydCBuIGxldmVsIHNjb3BlZD9cIiwgKCkgPT4ge1xuXHRcdC8vIFx0Y29uc3QgYnVpbGRlciA9IG5ldyBDcnVjaWJsZUJ1aWxkZXIoKTtcblx0XHQvLyBcdGJ1aWxkZXIucmVnaXN0ZXJSZXF1ZXN0U2NvcGVkKERpc3Bvc2FibGUpO1xuXHRcdC8vIFx0Y29uc3QgY29udGFpbmVyID0gYnVpbGRlci5idWlsZCgpO1xuXHRcdC8vIFx0dXNpbmcgc2NvcGUgPSBjb250YWluZXIuYmVnaW5TY29wZSgpO1xuXG5cdFx0Ly8gfSk7XG5cdH0pO1xuXG5cdGRlc2NyaWJlKFwiU2luZ2xldG9uc1wiLCAoKSA9PiB7XG5cdFx0aXQoXCJzaG91bGQgcmVzb2x2ZSBzaW5nbGV0b24gZnJvbSB0aGUgcm9vdCBzY29wZVwiLCAoKSA9PiB7XG5cdFx0XHQvLyB0aGlzIGNoZWNrcyB0aGF0IHRoZSBzYW1lIHNpbmdsZXRvbiBpcyByZXNvbHZlZCBpbiBhbGwgY2hpbGQgc2NvcGVzXG5cdFx0XHRjb25zdCBidWlsZGVyID0gbmV3IENydWNpYmxlQnVpbGRlcigpO1xuXHRcdFx0YnVpbGRlci5yZWdpc3RlclNpbmdsZXRvbihTaW5nbGV0b24pO1xuXHRcdFx0Y29uc3QgY29udGFpbmVyID0gYnVpbGRlci5idWlsZCgpO1xuXHRcdFx0Y29uc3QgY2hpbGQgPSBjb250YWluZXIuYmVnaW5TY29wZSgpO1xuXHRcdFx0Y29uc3QgaW5zdDEgPSBjb250YWluZXIucmVzb2x2ZShTaW5nbGV0b24pO1xuXHRcdFx0Y29uc3QgaW5zdDIgPSBjaGlsZC5yZXNvbHZlKFNpbmdsZXRvbik7XG5cdFx0XHRjb25zdCBtYW51YWxJbnN0ID0gbmV3IFNpbmdsZXRvbigpO1xuXHRcdFx0ZXhwZWN0KGluc3QxKS50b0JlKGluc3QyKTtcblx0XHRcdGV4cGVjdChtYW51YWxJbnN0KS5ub3QudG9FcXVhbChpbnN0MSk7XG5cdFx0XHRleHBlY3QobWFudWFsSW5zdCkubm90LnRvRXF1YWwoaW5zdDIpO1xuXHRcdH0pO1xuXHR9KTtcblxuXHRkZXNjcmliZShcInJlZ2lzdGVyUmVxdWVzdFNjb3BlZFwiLCAoKSA9PiB7XG5cdFx0aXQoXCJzaG91bGQgcmVzb2x2ZSB0aGUgc2FtZSBpbnN0YW5jZSBpbiB0aGUgc2FtZSBzY29wZVwiLCAoKSA9PiB7XG5cdFx0XHRidWlsZGVyLnJlZ2lzdGVyUmVxdWVzdFNjb3BlZChEaXNwb3NhYmxlKTtcblx0XHRcdGNvbnN0IGNvbnRhaW5lciA9IGJ1aWxkZXIuYnVpbGQoKTtcblx0XHRcdGNvbnN0IGNoaWxkQSA9IGNvbnRhaW5lci5iZWdpblNjb3BlKGdldFJhbmRvbUludCgpLnRvU3RyaW5nKCkpO1xuXHRcdFx0Y29uc3Qgc2VydmljZUEgPSBjaGlsZEEucmVzb2x2ZShEaXNwb3NhYmxlKTtcblx0XHRcdGNvbnN0IHNlcnZpY2VCID0gY2hpbGRBLnJlc29sdmUoRGlzcG9zYWJsZSk7XG5cdFx0XHRleHBlY3Qoc2VydmljZUEpLnRvQmUoc2VydmljZUIpO1xuXHRcdH0pO1xuXG5cdFx0aXQoXCJzaG91bGQgcmVzb2x2ZSBhIG5ldyBpbnN0YW5jZSBwZXIgc2NvcGVcIiwgKCkgPT4ge1xuXHRcdFx0YnVpbGRlci5yZWdpc3RlclJlcXVlc3RTY29wZWQoRGlzcG9zYWJsZSk7XG5cdFx0XHRjb25zdCBjb250YWluZXIgPSBidWlsZGVyLmJ1aWxkKCk7XG5cdFx0XHRjb25zdCBjaGlsZEEgPSBjb250YWluZXIuYmVnaW5TY29wZShnZW5lcmF0ZVNjb3BlSWQoKSk7XG5cdFx0XHRjb25zdCBzZXJ2aWNlQSA9IGNoaWxkQS5yZXNvbHZlKERpc3Bvc2FibGUpO1xuXHRcdFx0Y29uc3QgY2hpbGRCID0gY29udGFpbmVyLmJlZ2luU2NvcGUoZ2VuZXJhdGVTY29wZUlkKCkpO1xuXHRcdFx0Y29uc3Qgc2VydmljZUIgPSBjaGlsZEIucmVzb2x2ZShEaXNwb3NhYmxlKTtcblx0XHRcdGV4cGVjdChzZXJ2aWNlQSkubm90LnRvQmUoc2VydmljZUIpO1xuXHRcdH0pO1xuXHR9KTtcblxuXHRkZXNjcmliZShcImJlZ2luU2NvcGVcIiwgKCkgPT4ge1xuXHRcdGl0KFwic2hvdWxkIHN1cHBvcnQgbiBsZXZlbCBpc29sYXRlZCBzY29wZXNcIiwgKCkgPT4ge1xuXHRcdFx0YnVpbGRlci5yZWdpc3RlclJlcXVlc3RTY29wZWQoRGlzcG9zYWJsZSk7XG5cdFx0XHRjb25zdCBjb250YWluZXIgPSBidWlsZGVyLmJ1aWxkKCk7XG5cdFx0XHRjb25zdCBjaGlsZEEgPSBjb250YWluZXIuYmVnaW5TY29wZShnZW5lcmF0ZVNjb3BlSWQoKSk7XG5cdFx0XHRjb25zdCBnYW5kY2hpbGRBID0gY2hpbGRBLmJlZ2luU2NvcGUoZ2VuZXJhdGVTY29wZUlkKCkpO1xuXHRcdFx0Y29uc3Qgc2VydmljZUNoaWxkQSA9IGNoaWxkQS5yZXNvbHZlKERpc3Bvc2FibGUpO1xuXHRcdFx0Y29uc3Qgc2VydmljZUdhbmRjaGlsZEEgPSBnYW5kY2hpbGRBLnJlc29sdmUoRGlzcG9zYWJsZSk7XG5cdFx0XHRleHBlY3Qoc2VydmljZUNoaWxkQSkubm90LnRvQmUoc2VydmljZUdhbmRjaGlsZEEpO1xuXHRcdH0pO1xuXG5cdFx0aXQoXCJzaG91bGQgbm90IGRpc3Bvc2UgdGhlIGNoaWxkIHNjb3BlIGlmIHBhcmVudCBpcyBkaXNwb3NlZFwiLCAoKSA9PiB7XG5cdFx0XHRidWlsZGVyLnJlZ2lzdGVyUmVxdWVzdFNjb3BlZChEaXNwb3NhYmxlKTtcblx0XHRcdGNvbnN0IGNvbnRhaW5lciA9IGJ1aWxkZXIuYnVpbGQoKTtcblx0XHRcdGxldCBncmFuZENoaWxkOiBDcnVjaWJsZTtcblx0XHRcdHtcblx0XHRcdFx0dXNpbmcgY2hpbGQgPSBjb250YWluZXIuYmVnaW5TY29wZShnZW5lcmF0ZVNjb3BlSWQoKSk7XG5cdFx0XHRcdGdyYW5kQ2hpbGQgPSBjaGlsZC5iZWdpblNjb3BlKGdlbmVyYXRlU2NvcGVJZCgpKTtcblx0XHRcdH1cblx0XHRcdGV4cGVjdCgoKSA9PiBncmFuZENoaWxkLnJlc29sdmUoRGlzcG9zYWJsZSkpLm5vdC50b1Rocm93KCk7XG5cdFx0fSk7XG5cblx0XHRpdChcInNob3VsZCB0aHJvdyBpZiByZXNvbHZpbmcgc2luZ2xldG9uIG93bmVkIGJ5IHJvb3QgaWYgcm90byBzY29wZSBkaXNwb3NlZFwiLCAoKSA9PiB7XG5cdFx0XHRidWlsZGVyLnJlZ2lzdGVyU2luZ2xldG9uKFNpbmdsZXRvbik7XG5cdFx0XHRsZXQgY2hpbGQ6IExpZmV0aW1lU2NvcGU7XG5cdFx0XHR7XG5cdFx0XHRcdHVzaW5nIGNvbnRhaW5lciA9IGJ1aWxkZXIuYnVpbGQoKTtcblx0XHRcdFx0Y2hpbGQgPSBjb250YWluZXIuYmVnaW5TY29wZShnZW5lcmF0ZVNjb3BlSWQoKSk7XG5cdFx0XHR9XG5cblx0XHRcdGV4cGVjdCgoKSA9PiBjaGlsZC5yZXNvbHZlKFNpbmdsZXRvbikpLnRvVGhyb3coKTtcblx0XHR9KTtcblxuXHRcdGl0KFwic2hvdWxkIGRpc3Bvc2UgaWYgZXhjZXB0aW9uIGlzIHRocm93XCIsICgpID0+IHtcblx0XHRcdGJ1aWxkZXIucmVnaXN0ZXJSZXF1ZXN0U2NvcGVkKERpc3Bvc2FibGUpO1xuXHRcdFx0bGV0IGNvbnRhaW5lclJlZjogQ3J1Y2libGU7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHR1c2luZyBjb250YWluZXIgPSBidWlsZGVyLmJ1aWxkKCk7XG5cdFx0XHRcdGNvbnRhaW5lclJlZiA9IGNvbnRhaW5lcjtcblx0XHRcdFx0dGhyb3cgXCJFUlJPUlwiO1xuXHRcdFx0fSBjYXRjaCB7fVxuXG5cdFx0XHRleHBlY3QoKCkgPT4gY29udGFpbmVyUmVmLnJlc29sdmUoRGlzcG9zYWJsZSkpLnRvVGhyb3coKTtcblx0XHR9KTtcblx0fSk7XG59KTtcblxuZnVuY3Rpb24gZ2VuZXJhdGVTY29wZUlkKCkge1xuXHRyZXR1cm4gZ2V0UmFuZG9tSW50KCkudG9TdHJpbmcoKTtcbn1cblxuZnVuY3Rpb24gZ2V0UmFuZG9tSW50KCkge1xuXHRjb25zdCBtaW4gPSBNYXRoLmNlaWwoMCk7XG5cdGNvbnN0IG1heCA9IE1hdGguZmxvb3IoMTBfMDAwKTtcblx0cmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChtYXggLSBtaW4gKyAxKSkgKyBtaW47XG59XG4iXSwibmFtZXMiOlsiQ3J1Y2libGVCdWlsZGVyIiwiYmVmb3JlRWFjaCIsImRlc2NyaWJlIiwiZXhwZWN0IiwiaXQiLCJ2aSIsIkRpc3Bvc2FibGUiLCJTeW1ib2wiLCJkaXNwb3NlIiwiU2luZ2xldG9uIiwibm9uY2UiLCJnZXRSYW5kb21JbnQiLCJidWlsZGVyIiwiY2xlYXJBbGxNb2NrcyIsIkZBQ1RPUllfS0VZIiwiZXhwZWN0ZWQiLCJmaWVsZCIsImZhY3RvcnkiLCJyZWdpc3RlclJlcXVlc3RTY29wZWQiLCJjb250YWluZXIiLCJidWlsZCIsImFjdHVhbCIsInJlc29sdmUiLCJ0b0VxdWFsIiwic3B5T24iLCJwcm90b3R5cGUiLCJzY29wZSIsImJlZ2luU2NvcGUiLCJ0b0hhdmVCZWVuQ2FsbGVkIiwibm90IiwidG9UaHJvdyIsInJlZ2lzdGVyU2luZ2xldG9uIiwiY2hpbGQiLCJpbnN0MSIsImluc3QyIiwibWFudWFsSW5zdCIsInRvQmUiLCJjaGlsZEEiLCJ0b1N0cmluZyIsInNlcnZpY2VBIiwic2VydmljZUIiLCJnZW5lcmF0ZVNjb3BlSWQiLCJjaGlsZEIiLCJnYW5kY2hpbGRBIiwic2VydmljZUNoaWxkQSIsInNlcnZpY2VHYW5kY2hpbGRBIiwiZ3JhbmRDaGlsZCIsImNvbnRhaW5lclJlZiIsIm1pbiIsIk1hdGgiLCJjZWlsIiwibWF4IiwiZmxvb3IiLCJyYW5kb20iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsU0FBd0JBLGVBQWUsUUFBNEIsa0JBQXFCO0FBQ3hGLFNBQVNDLFVBQVUsRUFBRUMsUUFBUSxFQUFFQyxNQUFNLEVBQUVDLEVBQUUsRUFBRUMsRUFBRSxRQUFRLFNBQVM7QUFFOUQsTUFBTUM7SUFDRSxDQUFDQyxPQUFPQyxPQUFPLENBQUMsR0FBRztRQUN6QixJQUFJLENBQUNBLE9BQU87SUFDYjtJQUNPQSxVQUFVLENBQUM7QUFDbkI7QUFFQSxNQUFNQztJQUNFQyxNQUFjO0lBQ3JCLGFBQXFCO1FBQ3BCLElBQUksQ0FBQ0EsS0FBSyxHQUFHQztJQUNkO0FBQ0Q7QUFFQVQsU0FBUyxtQkFBbUI7SUFDM0IsSUFBSVU7SUFDSlgsV0FBVztRQUNWSSxHQUFHUSxhQUFhO1FBQ2hCRCxVQUFVLElBQUlaO0lBQ2Y7SUFFQUUsU0FBUyxhQUFhO1FBRXJCLE1BQU1ZLGNBQWM7UUFDcEIsK0NBQStDO1FBQy9DLGdFQUFnRTtRQUNoRVYsR0FBRyxrQ0FBa0M7WUFDcEMsTUFBTVEsVUFBVSxJQUFJWjtZQUNwQixNQUFNZSxXQUE0QjtnQkFBRUMsT0FBTztZQUFhO1lBQ3hELE1BQU1DLFVBQVUsSUFBTUY7WUFDdEJILFFBQVFNLHFCQUFxQixDQUFrQkosYUFBYUc7WUFDNUQsTUFBTUUsWUFBWVAsUUFBUVEsS0FBSztZQUMvQixNQUFNQyxTQUFTRixVQUFVRyxPQUFPLENBQUNSO1lBQ2pDWCxPQUFPa0IsUUFBUUUsT0FBTyxDQUFDUjtRQUN4QjtJQUNEO0lBRUFiLFNBQVMsV0FBVztRQUNuQixNQUFNTSxVQUFVSCxHQUFHbUIsS0FBSyxDQUFDbEIsV0FBV21CLFNBQVMsRUFBRTtRQUUv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
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes