@omujs/omu 0.9.47 → 0.9.49

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 (202) hide show
  1. package/dist/dts/api/asset/extension.d.ts +25 -0
  2. package/dist/dts/api/asset/index.d.ts +2 -0
  3. package/dist/dts/api/dashboard/extension.d.ts +183 -0
  4. package/{src/api/dashboard/handler.ts → dist/dts/api/dashboard/handler.d.ts} +0 -2
  5. package/dist/dts/api/dashboard/index.d.ts +3 -0
  6. package/dist/dts/api/dashboard/packets.d.ts +73 -0
  7. package/dist/dts/api/endpoint/endpoint.d.ts +21 -0
  8. package/dist/dts/api/endpoint/extension.d.ts +17 -0
  9. package/{src/api/endpoint/index.ts → dist/dts/api/endpoint/index.d.ts} +0 -1
  10. package/dist/dts/api/endpoint/packets.d.ts +51 -0
  11. package/dist/dts/api/extension-registry.d.ts +8 -0
  12. package/dist/dts/api/extension.d.ts +11 -0
  13. package/dist/dts/api/http/extension.d.ts +41 -0
  14. package/dist/dts/api/http/http.d.ts +36 -0
  15. package/{src/api/http/index.ts → dist/dts/api/http/index.d.ts} +0 -1
  16. package/dist/dts/api/http/websocket.d.ts +125 -0
  17. package/dist/dts/api/i18n/extension.d.ts +19 -0
  18. package/{src/api/i18n/index.ts → dist/dts/api/i18n/index.d.ts} +0 -1
  19. package/{src/api/index.ts → dist/dts/api/index.d.ts} +0 -1
  20. package/dist/dts/api/logger/extension.d.ts +25 -0
  21. package/dist/dts/api/logger/index.d.ts +1 -0
  22. package/dist/dts/api/logger/packets.d.ts +18 -0
  23. package/dist/dts/api/permission/extension.d.ts +19 -0
  24. package/{src/api/permission/index.ts → dist/dts/api/permission/index.d.ts} +0 -1
  25. package/dist/dts/api/permission/permission.d.ts +25 -0
  26. package/dist/dts/api/plugin/extension.d.ts +43 -0
  27. package/{src/api/plugin/index.ts → dist/dts/api/plugin/index.d.ts} +0 -1
  28. package/{src/api/plugin/package-info.ts → dist/dts/api/plugin/package-info.d.ts} +0 -7
  29. package/dist/dts/api/registry/extension.d.ts +23 -0
  30. package/{src/api/registry/index.ts → dist/dts/api/registry/index.d.ts} +0 -1
  31. package/dist/dts/api/registry/packets.d.ts +20 -0
  32. package/{src/api/registry/registry.ts → dist/dts/api/registry/registry.d.ts} +11 -53
  33. package/dist/dts/api/server/extension.d.ts +61 -0
  34. package/dist/dts/api/server/index.d.ts +1 -0
  35. package/dist/dts/api/session/extension.d.ts +52 -0
  36. package/dist/dts/api/session/index.d.ts +1 -0
  37. package/dist/dts/api/signal/extension.d.ts +19 -0
  38. package/dist/dts/api/signal/packets.d.ts +21 -0
  39. package/dist/dts/api/signal/signal.d.ts +33 -0
  40. package/dist/dts/api/table/extension.d.ts +26 -0
  41. package/{src/api/table/index.ts → dist/dts/api/table/index.d.ts} +0 -1
  42. package/dist/dts/api/table/packets.d.ts +65 -0
  43. package/dist/dts/api/table/table.d.ts +75 -0
  44. package/dist/dts/app.d.ts +49 -0
  45. package/dist/dts/const.d.ts +2 -0
  46. package/dist/dts/errors.d.ts +36 -0
  47. package/dist/dts/event/index.d.ts +6 -0
  48. package/dist/dts/helper.d.ts +10 -0
  49. package/dist/dts/identifier.d.ts +51 -0
  50. package/dist/dts/index.d.ts +36 -0
  51. package/{src/localization/index.ts → dist/dts/localization/index.d.ts} +0 -1
  52. package/dist/dts/localization/locale.d.ts +735 -0
  53. package/{src/localization/localization.ts → dist/dts/localization/localization.d.ts} +0 -2
  54. package/dist/dts/lock.d.ts +6 -0
  55. package/dist/dts/network/connection.d.ts +17 -0
  56. package/dist/dts/network/encryption.d.ts +38 -0
  57. package/dist/dts/network/frame-transport.d.ts +22 -0
  58. package/{src/network/index.ts → dist/dts/network/index.d.ts} +0 -1
  59. package/dist/dts/network/network.d.ts +59 -0
  60. package/{src/network/packet/index.ts → dist/dts/network/packet/index.d.ts} +0 -1
  61. package/dist/dts/network/packet/packet-types.d.ts +84 -0
  62. package/dist/dts/network/packet/packet.d.ts +25 -0
  63. package/dist/dts/network/websocket-transport.d.ts +24 -0
  64. package/dist/dts/omu.d.ts +61 -0
  65. package/dist/dts/result.d.ts +26 -0
  66. package/dist/dts/serialize/bytebuffer.d.ts +73 -0
  67. package/dist/dts/serialize/serializer.d.ts +26 -0
  68. package/dist/dts/token.d.ts +14 -0
  69. package/dist/dts/version.d.ts +2 -0
  70. package/dist/esm/address.js +4 -0
  71. package/dist/esm/api/asset/extension.js +911 -0
  72. package/dist/esm/api/asset/index.js +909 -0
  73. package/dist/esm/api/dashboard/extension.js +1362 -0
  74. package/dist/esm/api/dashboard/handler.js +4 -0
  75. package/dist/esm/api/dashboard/index.js +1361 -0
  76. package/dist/esm/api/dashboard/packets.js +419 -0
  77. package/dist/esm/api/endpoint/endpoint.js +383 -0
  78. package/dist/esm/api/endpoint/extension.js +1096 -0
  79. package/dist/esm/api/endpoint/index.js +383 -0
  80. package/dist/esm/api/endpoint/packets.js +799 -0
  81. package/dist/esm/api/extension-registry.js +23 -0
  82. package/dist/esm/api/extension.js +278 -0
  83. package/dist/esm/api/http/extension.js +1420 -0
  84. package/dist/esm/api/http/http.js +448 -0
  85. package/dist/esm/api/http/index.js +1419 -0
  86. package/dist/esm/api/http/websocket.js +220 -0
  87. package/dist/esm/api/i18n/extension.js +1339 -0
  88. package/dist/esm/api/i18n/index.js +1337 -0
  89. package/dist/esm/api/index.js +295 -0
  90. package/dist/esm/api/logger/extension.js +856 -0
  91. package/dist/esm/api/logger/index.js +852 -0
  92. package/dist/esm/api/logger/packets.js +673 -0
  93. package/dist/esm/api/permission/extension.js +535 -0
  94. package/dist/esm/api/permission/index.js +294 -0
  95. package/dist/esm/api/permission/permission.js +294 -0
  96. package/dist/esm/api/plugin/extension.js +531 -0
  97. package/dist/esm/api/plugin/index.js +529 -0
  98. package/dist/esm/api/plugin/package-info.js +4 -0
  99. package/dist/esm/api/registry/extension.js +1286 -0
  100. package/dist/esm/api/registry/index.js +1285 -0
  101. package/dist/esm/api/registry/packets.js +694 -0
  102. package/dist/esm/api/registry/registry.js +383 -0
  103. package/dist/esm/api/server/extension.js +2140 -0
  104. package/dist/esm/api/server/index.js +2118 -0
  105. package/dist/esm/api/session/extension.js +2235 -0
  106. package/dist/esm/api/session/index.js +2235 -0
  107. package/dist/esm/api/signal/extension.js +1031 -0
  108. package/dist/esm/api/signal/index.js +379 -0
  109. package/dist/esm/api/signal/packets.js +690 -0
  110. package/dist/esm/api/signal/signal.js +379 -0
  111. package/dist/esm/api/table/extension.js +1553 -0
  112. package/dist/esm/api/table/index.js +1552 -0
  113. package/dist/esm/api/table/packets.js +904 -0
  114. package/dist/esm/api/table/table.js +383 -0
  115. package/dist/esm/app.js +264 -0
  116. package/dist/esm/const.js +11 -0
  117. package/dist/esm/errors.js +548 -0
  118. package/dist/esm/event/index.js +22 -0
  119. package/dist/esm/helper.js +15 -0
  120. package/dist/esm/identifier.js +266 -0
  121. package/dist/esm/index.js +5186 -0
  122. package/dist/esm/localization/index.js +742 -0
  123. package/dist/esm/localization/locale.js +742 -0
  124. package/dist/esm/localization/localization.js +4 -0
  125. package/dist/esm/lock.js +46 -0
  126. package/dist/esm/network/connection.js +293 -0
  127. package/dist/esm/network/encryption.js +986 -0
  128. package/dist/esm/network/frame-transport.js +531 -0
  129. package/dist/esm/network/index.js +1627 -0
  130. package/dist/esm/network/network.js +1368 -0
  131. package/dist/esm/network/packet/index.js +485 -0
  132. package/dist/esm/network/packet/packet-types.js +486 -0
  133. package/dist/esm/network/packet/packet.js +126 -0
  134. package/dist/esm/network/websocket-transport.js +493 -0
  135. package/dist/esm/omu.js +4945 -0
  136. package/dist/esm/result.js +68 -0
  137. package/dist/esm/serialize/bytebuffer.js +384 -0
  138. package/dist/esm/serialize/index.js +471 -0
  139. package/dist/esm/serialize/serializer.js +97 -0
  140. package/dist/esm/token.js +42 -0
  141. package/dist/esm/version.js +11 -0
  142. package/dist/tsconfig.tsbuildinfo +1 -0
  143. package/package.json +4 -1
  144. package/CHANGELOG.md +0 -1837
  145. package/src/api/asset/extension.ts +0 -193
  146. package/src/api/asset/index.ts +0 -5
  147. package/src/api/dashboard/extension.ts +0 -651
  148. package/src/api/dashboard/index.ts +0 -38
  149. package/src/api/dashboard/packets.ts +0 -126
  150. package/src/api/endpoint/endpoint.ts +0 -56
  151. package/src/api/endpoint/extension.ts +0 -133
  152. package/src/api/endpoint/packets.ts +0 -176
  153. package/src/api/extension-registry.ts +0 -17
  154. package/src/api/extension.ts +0 -19
  155. package/src/api/http/extension.ts +0 -401
  156. package/src/api/http/http.ts +0 -79
  157. package/src/api/http/websocket.ts +0 -283
  158. package/src/api/i18n/extension.ts +0 -65
  159. package/src/api/logger/extension.ts +0 -75
  160. package/src/api/logger/index.ts +0 -4
  161. package/src/api/logger/packets.ts +0 -38
  162. package/src/api/permission/extension.ts +0 -107
  163. package/src/api/permission/permission.ts +0 -53
  164. package/src/api/plugin/extension.ts +0 -100
  165. package/src/api/registry/extension.ts +0 -326
  166. package/src/api/registry/packets.ts +0 -64
  167. package/src/api/server/extension.ts +0 -155
  168. package/src/api/server/index.ts +0 -11
  169. package/src/api/session/extension.ts +0 -205
  170. package/src/api/session/index.ts +0 -7
  171. package/src/api/signal/extension.ts +0 -125
  172. package/src/api/signal/packets.ts +0 -61
  173. package/src/api/signal/signal.ts +0 -67
  174. package/src/api/table/extension.ts +0 -554
  175. package/src/api/table/packets.ts +0 -252
  176. package/src/api/table/table.ts +0 -113
  177. package/src/app.ts +0 -95
  178. package/src/const.ts +0 -2
  179. package/src/errors.ts +0 -70
  180. package/src/event/index.ts +0 -18
  181. package/src/helper.ts +0 -16
  182. package/src/identifier.ts +0 -256
  183. package/src/index.ts +0 -87
  184. package/src/localization/locale.ts +0 -737
  185. package/src/lock.ts +0 -43
  186. package/src/network/connection.ts +0 -45
  187. package/src/network/encryption.ts +0 -221
  188. package/src/network/frame-transport.ts +0 -186
  189. package/src/network/network.ts +0 -322
  190. package/src/network/packet/packet-types.ts +0 -164
  191. package/src/network/packet/packet.ts +0 -55
  192. package/src/network/websocket-transport.ts +0 -123
  193. package/src/omu.ts +0 -156
  194. package/src/result.ts +0 -78
  195. package/src/serialize/bytebuffer.ts +0 -432
  196. package/src/serialize/serializer.ts +0 -149
  197. package/src/token.ts +0 -39
  198. package/src/version.ts +0 -2
  199. package/tsconfig.json +0 -18
  200. /package/{src/address.ts → dist/dts/address.d.ts} +0 -0
  201. /package/{src/api/signal/index.ts → dist/dts/api/signal/index.d.ts} +0 -0
  202. /package/{src/serialize/index.ts → dist/dts/serialize/index.d.ts} +0 -0
@@ -0,0 +1,485 @@
1
+ // @bun
2
+ // src/identifier.ts
3
+ var NAMESPACE_REGEX = /^(\.[^/:.]|[\w-])+$/;
4
+ var NAME_REGEX = /^[^/:]+$/;
5
+
6
+ class Identifier {
7
+ namespace;
8
+ path;
9
+ constructor(namespace, ...path) {
10
+ Identifier.validate(namespace, path);
11
+ this.namespace = namespace;
12
+ this.path = path;
13
+ }
14
+ static serialize(identifier) {
15
+ return identifier.key();
16
+ }
17
+ static deserialize(json) {
18
+ return Identifier.fromJson(json);
19
+ }
20
+ static from(id) {
21
+ if (id instanceof Identifier) {
22
+ return id;
23
+ } else if (id instanceof App) {
24
+ return id.id;
25
+ } else if (typeof id === "string") {
26
+ return Identifier.fromKey(id);
27
+ } else {
28
+ const idCasted = id;
29
+ if (typeof idCasted.namespace === "string" && Array.isArray(idCasted.path) && idCasted.path.every((p) => typeof p === "string")) {
30
+ return new Identifier(idCasted.namespace, ...idCasted.path);
31
+ }
32
+ const idWithId = id;
33
+ if (typeof idWithId.id !== "undefined") {
34
+ return Identifier.from(idWithId.id);
35
+ }
36
+ throw new Error(`Cannot convert to Identifier: ${id}`);
37
+ }
38
+ }
39
+ static fromOptional(id) {
40
+ if (id === undefined || id === null) {
41
+ return;
42
+ }
43
+ return Identifier.from(id);
44
+ }
45
+ static validate(namespace, path) {
46
+ if (!namespace) {
47
+ throw new Error("Invalid namespace: Namespace cannot be empty");
48
+ }
49
+ if (path.length === 0) {
50
+ throw new Error("Invalid path: Path must have at least one name");
51
+ }
52
+ if (!NAMESPACE_REGEX.test(namespace)) {
53
+ throw new Error(`Invalid namespace: Namespace must match ${NAMESPACE_REGEX}`);
54
+ }
55
+ for (const name of path) {
56
+ if (!NAME_REGEX.test(name)) {
57
+ throw new Error(`Invalid path: Name must match ${NAME_REGEX} but got ${name}`);
58
+ }
59
+ }
60
+ }
61
+ static format(namespace, ...path) {
62
+ Identifier.validate(namespace, path);
63
+ return `${namespace}:${path.join("/")}`;
64
+ }
65
+ static fromKey(key) {
66
+ const separator = key.indexOf(":");
67
+ if (separator === -1) {
68
+ throw new Error(`Invalid key: No separator found in ${key}`);
69
+ }
70
+ if (key.indexOf(":", separator + 1) !== -1) {
71
+ throw new Error(`Invalid key: Multiple separators found in ${key}`);
72
+ }
73
+ const namespace = key.slice(0, separator);
74
+ const path = key.slice(separator + 1);
75
+ if (!namespace || !path) {
76
+ throw new Error("Invalid key: Namespace and path cannot be empty");
77
+ }
78
+ return new Identifier(namespace, ...path.split("/"));
79
+ }
80
+ static fromUrl(url) {
81
+ const parsedUrl = new URL(url);
82
+ const namespace = Identifier.namespaceFromUrl(parsedUrl.href);
83
+ const path = parsedUrl.pathname.slice(1).split("/");
84
+ return new Identifier(namespace, ...path);
85
+ }
86
+ static namespaceFromUrl(url) {
87
+ const parsed = new URL(url);
88
+ return parsed.hostname.split(".").reverse().join(".");
89
+ }
90
+ get base() {
91
+ return new Identifier(this.namespace, this.path[0]);
92
+ }
93
+ toJson() {
94
+ return this.key();
95
+ }
96
+ static fromJson(json) {
97
+ return Identifier.fromKey(json);
98
+ }
99
+ key() {
100
+ return Identifier.format(this.namespace, ...this.path);
101
+ }
102
+ isEqual(other) {
103
+ return this.key() === other.key();
104
+ }
105
+ isNamespaceEqual(other) {
106
+ return this.namespace === other.namespace;
107
+ }
108
+ isSubpathOf(other) {
109
+ if (this.namespace !== other.namespace) {
110
+ return false;
111
+ }
112
+ if (this.path.length < other.path.length) {
113
+ return false;
114
+ }
115
+ for (let i = 0;i < other.path.length; i++) {
116
+ if (this.path[i] !== other.path[i]) {
117
+ return false;
118
+ }
119
+ }
120
+ return true;
121
+ }
122
+ join(...path) {
123
+ return new Identifier(this.namespace, ...this.path, ...path);
124
+ }
125
+ }
126
+
127
+ class IdentifierMap {
128
+ map = new Map;
129
+ constructor(entries) {
130
+ if (!entries)
131
+ return;
132
+ for (const [id, value] of entries) {
133
+ this.map.set(id.key(), value);
134
+ }
135
+ }
136
+ get size() {
137
+ return this.map.size;
138
+ }
139
+ set(identifier, value) {
140
+ this.map.set(identifier.key(), value);
141
+ }
142
+ get(identifier) {
143
+ return this.map.get(identifier.key());
144
+ }
145
+ has(identifier) {
146
+ return this.map.has(identifier.key());
147
+ }
148
+ delete(identifier) {
149
+ this.map.delete(identifier.key());
150
+ }
151
+ clear() {
152
+ this.map.clear();
153
+ }
154
+ *keys() {
155
+ for (const key of this.map.keys()) {
156
+ yield Identifier.fromKey(key);
157
+ }
158
+ }
159
+ values() {
160
+ return this.map.values();
161
+ }
162
+ *entries() {
163
+ for (const [key, value] of this.map.entries()) {
164
+ yield [Identifier.fromKey(key), value];
165
+ }
166
+ }
167
+ [Symbol.iterator]() {
168
+ return this.entries();
169
+ }
170
+ }
171
+
172
+ class IdentifierSet {
173
+ set = new Set;
174
+ get size() {
175
+ return this.set.size;
176
+ }
177
+ add(identifier) {
178
+ this.set.add(identifier.key());
179
+ }
180
+ has(identifier) {
181
+ return this.set.has(identifier.key());
182
+ }
183
+ delete(identifier) {
184
+ this.set.delete(identifier.key());
185
+ }
186
+ clear() {
187
+ this.set.clear();
188
+ }
189
+ *keys() {
190
+ for (const key of this.set.keys()) {
191
+ yield Identifier.fromKey(key);
192
+ }
193
+ }
194
+ values() {
195
+ return this.keys();
196
+ }
197
+ *entries() {
198
+ for (const key of this.set.keys()) {
199
+ const identifier = Identifier.fromKey(key);
200
+ yield [identifier, identifier];
201
+ }
202
+ }
203
+ [Symbol.iterator]() {
204
+ return this.entries();
205
+ }
206
+ }
207
+
208
+ // src/app.ts
209
+ class App {
210
+ id;
211
+ type;
212
+ parentId;
213
+ version;
214
+ url;
215
+ metadata;
216
+ dependencies;
217
+ constructor(id, options) {
218
+ this.id = Identifier.from(id);
219
+ this.parentId = Identifier.fromOptional(options.parentId);
220
+ this.version = options.version;
221
+ this.url = options.url;
222
+ this.metadata = options.metadata;
223
+ this.type = options.type ?? "app";
224
+ this.dependencies = options.dependencies ?? {};
225
+ }
226
+ static deserialize(info) {
227
+ const id = Identifier.fromKey(info.id);
228
+ return new App(id, {
229
+ parentId: Identifier.fromOptional(info.parent_id),
230
+ version: info.version,
231
+ url: info.url,
232
+ type: info.type,
233
+ metadata: info.metadata,
234
+ dependencies: info.dependencies ?? {}
235
+ });
236
+ }
237
+ static serialize(data) {
238
+ return {
239
+ id: data.id.key(),
240
+ type: data.type,
241
+ parent_id: data.parentId?.key(),
242
+ version: data.version,
243
+ url: data.url,
244
+ metadata: data.metadata,
245
+ dependencies: data.dependencies
246
+ };
247
+ }
248
+ join(...paths) {
249
+ return new App(this.id.join(...paths), {
250
+ parentId: this.parentId,
251
+ version: this.version,
252
+ url: this.url,
253
+ type: this.type,
254
+ metadata: this.metadata,
255
+ dependencies: this.dependencies
256
+ });
257
+ }
258
+ }
259
+
260
+ // src/const.ts
261
+ var textEncoder = new TextEncoder;
262
+ var textDecoder = new TextDecoder;
263
+
264
+ // src/serialize/serializer.ts
265
+ class Serializer {
266
+ serialize;
267
+ deserialize;
268
+ constructor(serialize, deserialize) {
269
+ this.serialize = serialize;
270
+ this.deserialize = deserialize;
271
+ }
272
+ static of(serializer) {
273
+ return new Serializer(serializer.serialize, serializer.deserialize);
274
+ }
275
+ static pipe(ser1, ser2) {
276
+ return new Serializer((data) => ser2.serialize(ser1.serialize(data)), (data) => ser1.deserialize(ser2.deserialize(data)));
277
+ }
278
+ static transform(func) {
279
+ return new Serializer(func, func);
280
+ }
281
+ static noop() {
282
+ return new Serializer((data) => data, (data) => data);
283
+ }
284
+ field(key, serializer) {
285
+ return new Serializer((data) => {
286
+ const serialized = this.serialize(data);
287
+ return {
288
+ ...serialized,
289
+ [key]: serializer.serialize(serialized[key])
290
+ };
291
+ }, (data) => {
292
+ return this.deserialize({
293
+ ...data,
294
+ [key]: serializer.deserialize(data[key])
295
+ });
296
+ });
297
+ }
298
+ static json() {
299
+ return new Serializer((data) => textEncoder.encode(JSON.stringify(data)), (data) => {
300
+ const text = textDecoder.decode(data);
301
+ return JSON.parse(text);
302
+ });
303
+ }
304
+ toJson() {
305
+ return new Serializer((data) => textEncoder.encode(JSON.stringify(this.serialize(data))), (data) => {
306
+ const text = textDecoder.decode(data);
307
+ return this.deserialize(JSON.parse(text));
308
+ });
309
+ }
310
+ toArray() {
311
+ return new Serializer((data) => data.map((item) => this.serialize(item)), (data) => data.map((item) => this.deserialize(item)));
312
+ }
313
+ toMap() {
314
+ return new Serializer((data) => {
315
+ const result = new Map;
316
+ data.forEach((value, key) => {
317
+ result.set(key, this.serialize(value));
318
+ });
319
+ return result;
320
+ }, (data) => {
321
+ const result = new Map;
322
+ data.forEach((value, key) => {
323
+ result.set(key, this.deserialize(value));
324
+ });
325
+ return result;
326
+ });
327
+ }
328
+ fallback(fallback) {
329
+ return new Serializer((data) => this.serialize(data), (data) => {
330
+ try {
331
+ return this.deserialize(data);
332
+ } catch {
333
+ return fallback;
334
+ }
335
+ });
336
+ }
337
+ fallbackMap(fallback) {
338
+ return new Serializer((data) => this.serialize(data), (data) => {
339
+ try {
340
+ return this.deserialize(data);
341
+ } catch (error) {
342
+ return fallback(data, error);
343
+ }
344
+ });
345
+ }
346
+ pipe(serializer) {
347
+ return new Serializer((data) => serializer.serialize(this.serialize(data)), (data) => this.deserialize(serializer.deserialize(data)));
348
+ }
349
+ }
350
+ // src/network/packet/packet.ts
351
+ class PacketType {
352
+ id;
353
+ serializer;
354
+ constructor(id, serializer) {
355
+ this.id = id;
356
+ this.serializer = serializer;
357
+ }
358
+ new(data) {
359
+ return {
360
+ type: this,
361
+ data
362
+ };
363
+ }
364
+ match(packet) {
365
+ return packet.type === this;
366
+ }
367
+ static createJson(identifier, {
368
+ name,
369
+ serializer
370
+ }) {
371
+ return new PacketType(identifier.join(name), Serializer.pipe(serializer ?? Serializer.noop(), Serializer.json()));
372
+ }
373
+ static createSerialized(identifier, {
374
+ name,
375
+ serializer
376
+ }) {
377
+ return new PacketType(identifier.join(name), serializer);
378
+ }
379
+ }
380
+
381
+ // src/network/packet/packet-types.ts
382
+ var IDENTIFIER = new Identifier("core", "packet");
383
+
384
+ class ConnectPacket {
385
+ protocol;
386
+ app;
387
+ token;
388
+ encryption;
389
+ constructor(options) {
390
+ this.protocol = options.protocol;
391
+ this.app = options.app;
392
+ this.token = options.token;
393
+ this.encryption = options.encryption ?? null;
394
+ }
395
+ static deserialize(data) {
396
+ return new ConnectPacket({
397
+ protocol: data.protocol,
398
+ app: App.deserialize(data.app),
399
+ encryption: data.encryption,
400
+ token: data.token
401
+ });
402
+ }
403
+ static serialize(data) {
404
+ return {
405
+ protocol: data.protocol,
406
+ app: App.serialize(data.app),
407
+ encryption: data.encryption,
408
+ token: data.token
409
+ };
410
+ }
411
+ }
412
+ var DisconnectType;
413
+ ((DisconnectType2) => {
414
+ DisconnectType2["INVALID_TOKEN"] = "invalid_token";
415
+ DisconnectType2["INVALID_ORIGIN"] = "invalid_origin";
416
+ DisconnectType2["INVALID_VERSION"] = "invalid_version";
417
+ DisconnectType2["INVALID_PACKET_TYPE"] = "invalid_packet_type";
418
+ DisconnectType2["INVALID_PACKET_DATA"] = "invalid_packet_data";
419
+ DisconnectType2["INVALID_PACKET"] = "invalid_packet";
420
+ DisconnectType2["INTERNAL_ERROR"] = "internal_error";
421
+ DisconnectType2["ANOTHER_CONNECTION"] = "another_connection";
422
+ DisconnectType2["PERMISSION_DENIED"] = "permission_denied";
423
+ DisconnectType2["APP_REMOVED"] = "app_removed";
424
+ DisconnectType2["SERVER_RESTART"] = "server_restart";
425
+ DisconnectType2["SHUTDOWN"] = "shutdown";
426
+ DisconnectType2["CLOSE"] = "close";
427
+ })(DisconnectType ||= {});
428
+
429
+ class DisconnectPacket {
430
+ type;
431
+ message;
432
+ constructor(options) {
433
+ this.type = options.type;
434
+ this.message = options.message ?? null;
435
+ }
436
+ static serialize(data) {
437
+ return data.toJson();
438
+ }
439
+ static deserialize(data) {
440
+ return DisconnectPacket.fromJson(data);
441
+ }
442
+ static fromJson(data) {
443
+ return new DisconnectPacket({
444
+ type: data.type,
445
+ message: data.message
446
+ });
447
+ }
448
+ toJson() {
449
+ return {
450
+ type: this.type,
451
+ message: this.message
452
+ };
453
+ }
454
+ }
455
+ var PACKET_TYPES = {
456
+ SERVER_META: PacketType.createJson(IDENTIFIER, {
457
+ name: "server_meta"
458
+ }),
459
+ CONNECT: PacketType.createJson(IDENTIFIER, {
460
+ name: "connect",
461
+ serializer: ConnectPacket
462
+ }),
463
+ DISCONNECT: PacketType.createJson(IDENTIFIER, {
464
+ name: "disconnect",
465
+ serializer: DisconnectPacket
466
+ }),
467
+ TOKEN: PacketType.createJson(IDENTIFIER, {
468
+ name: "token"
469
+ }),
470
+ READY: PacketType.createJson(IDENTIFIER, {
471
+ name: "ready"
472
+ }),
473
+ ENCRYPTED_PACKET: PacketType.createSerialized(IDENTIFIER, {
474
+ name: "e",
475
+ serializer: Serializer.noop()
476
+ })
477
+ };
478
+ export {
479
+ PacketType,
480
+ DisconnectType,
481
+ DisconnectPacket
482
+ };
483
+
484
+ //# debugId=645828F32380D4B764756E2164756E21
485
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2lkZW50aWZpZXIudHMiLCAiLi4vLi4vc3JjL2FwcC50cyIsICIuLi8uLi9zcmMvY29uc3QudHMiLCAiLi4vLi4vc3JjL3NlcmlhbGl6ZS9zZXJpYWxpemVyLnRzIiwgIi4uLy4uL3NyYy9uZXR3b3JrL3BhY2tldC9wYWNrZXQudHMiLCAiLi4vLi4vc3JjL25ldHdvcmsvcGFja2V0L3BhY2tldC10eXBlcy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICJpbXBvcnQgdHlwZSB7IEV4dGVuc2lvblR5cGUgfSBmcm9tICcuL2FwaSc7XG5pbXBvcnQgeyBBcHAgfSBmcm9tICcuL2FwcCc7XG5cbmNvbnN0IE5BTUVTUEFDRV9SRUdFWCA9IC9eKFxcLlteLzouXXxbXFx3LV0pKyQvO1xuY29uc3QgTkFNRV9SRUdFWCA9IC9eW14vOl0rJC87XG5cbmV4cG9ydCB0eXBlIEludG9JZCA9IElkZW50aWZpZXIgfCBzdHJpbmcgfCBFeHRlbnNpb25UeXBlIHwgQXBwO1xuXG5leHBvcnQgY2xhc3MgSWRlbnRpZmllciB7XG4gICAgcHVibGljIHJlYWRvbmx5IG5hbWVzcGFjZTogc3RyaW5nO1xuICAgIHB1YmxpYyByZWFkb25seSBwYXRoOiBzdHJpbmdbXTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBuYW1lc3BhY2U6IHN0cmluZyxcbiAgICAgICAgLi4ucGF0aDogc3RyaW5nW11cbiAgICApIHtcbiAgICAgICAgSWRlbnRpZmllci52YWxpZGF0ZShuYW1lc3BhY2UsIHBhdGgpO1xuICAgICAgICB0aGlzLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTtcbiAgICAgICAgdGhpcy5wYXRoID0gcGF0aDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZShpZGVudGlmaWVyOiBJZGVudGlmaWVyKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGlkZW50aWZpZXIua2V5KCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZXNlcmlhbGl6ZShqc29uOiBzdHJpbmcpOiBJZGVudGlmaWVyIHtcbiAgICAgICAgcmV0dXJuIElkZW50aWZpZXIuZnJvbUpzb24oanNvbik7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBmcm9tKGlkOiBJbnRvSWQpOiBJZGVudGlmaWVyIHtcbiAgICAgICAgaWYgKGlkIGluc3RhbmNlb2YgSWRlbnRpZmllcikge1xuICAgICAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgICB9IGVsc2UgaWYgKGlkIGluc3RhbmNlb2YgQXBwKSB7XG4gICAgICAgICAgICByZXR1cm4gaWQuaWQ7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGlkID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIElkZW50aWZpZXIuZnJvbUtleShpZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBUcnkgdG8gaW5mZXJcbiAgICAgICAgICAgIC8vIFZpdGUgZG9lcyBub3QgcHJlc2VydmUgY2xhc3MgaW5mb3JtYXRpb24gd2hlbiBpbXBvcnRpbmcgZnJvbSBkaWZmZXJlbnQgcGFja2FnZXNcbiAgICAgICAgICAgIGNvbnN0IGlkQ2FzdGVkID0gaWQgYXMgeyBuYW1lc3BhY2U6IHN0cmluZzsgcGF0aDogc3RyaW5nW10gfTtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0eXBlb2YgaWRDYXN0ZWQubmFtZXNwYWNlID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkoaWRDYXN0ZWQucGF0aCkgJiZcbiAgICAgICAgICAgICAgICBpZENhc3RlZC5wYXRoLmV2ZXJ5KChwKSA9PiB0eXBlb2YgcCA9PT0gJ3N0cmluZycpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IElkZW50aWZpZXIoaWRDYXN0ZWQubmFtZXNwYWNlLCAuLi5pZENhc3RlZC5wYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGlkV2l0aElkID0gaWQgYXMgeyBpZDogSW50b0lkIHwgdW5kZWZpbmVkIH07XG4gICAgICAgICAgICBpZiAodHlwZW9mIGlkV2l0aElkLmlkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBJZGVudGlmaWVyLmZyb20oaWRXaXRoSWQuaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY29udmVydCB0byBJZGVudGlmaWVyOiAke2lkfWApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBmcm9tT3B0aW9uYWwoaWQ6IEludG9JZCB8IHVuZGVmaW5lZCB8IG51bGwpOiBJZGVudGlmaWVyIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgaWYgKGlkID09PSB1bmRlZmluZWQgfHwgaWQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIElkZW50aWZpZXIuZnJvbShpZCk7XG4gICAgfVxuXG4gICAgc3RhdGljIHZhbGlkYXRlKG5hbWVzcGFjZTogc3RyaW5nLCBwYXRoOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgICAgICBpZiAoIW5hbWVzcGFjZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIG5hbWVzcGFjZTogTmFtZXNwYWNlIGNhbm5vdCBiZSBlbXB0eScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXRoLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHBhdGg6IFBhdGggbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBuYW1lJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFOQU1FU1BBQ0VfUkVHRVgudGVzdChuYW1lc3BhY2UpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgbmFtZXNwYWNlOiBOYW1lc3BhY2UgbXVzdCBtYXRjaCAke05BTUVTUEFDRV9SRUdFWH1gKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgcGF0aCkge1xuICAgICAgICAgICAgaWYgKCFOQU1FX1JFR0VYLnRlc3QobmFtZSkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcGF0aDogTmFtZSBtdXN0IG1hdGNoICR7TkFNRV9SRUdFWH0gYnV0IGdvdCAke25hbWV9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgZm9ybWF0KG5hbWVzcGFjZTogc3RyaW5nLCAuLi5wYXRoOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gICAgICAgIElkZW50aWZpZXIudmFsaWRhdGUobmFtZXNwYWNlLCBwYXRoKTtcbiAgICAgICAgcmV0dXJuIGAke25hbWVzcGFjZX06JHtwYXRoLmpvaW4oJy8nKX1gO1xuICAgIH1cblxuICAgIHN0YXRpYyBmcm9tS2V5KGtleTogc3RyaW5nKTogSWRlbnRpZmllciB7XG4gICAgICAgIGNvbnN0IHNlcGFyYXRvciA9IGtleS5pbmRleE9mKCc6Jyk7XG4gICAgICAgIGlmIChzZXBhcmF0b3IgPT09IC0xKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQga2V5OiBObyBzZXBhcmF0b3IgZm91bmQgaW4gJHtrZXl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGtleS5pbmRleE9mKCc6Jywgc2VwYXJhdG9yICsgMSkgIT09IC0xKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQga2V5OiBNdWx0aXBsZSBzZXBhcmF0b3JzIGZvdW5kIGluICR7a2V5fWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5hbWVzcGFjZSA9IGtleS5zbGljZSgwLCBzZXBhcmF0b3IpO1xuICAgICAgICBjb25zdCBwYXRoID0ga2V5LnNsaWNlKHNlcGFyYXRvciArIDEpO1xuICAgICAgICBpZiAoIW5hbWVzcGFjZSB8fCAhcGF0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGtleTogTmFtZXNwYWNlIGFuZCBwYXRoIGNhbm5vdCBiZSBlbXB0eScpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgSWRlbnRpZmllcihuYW1lc3BhY2UsIC4uLnBhdGguc3BsaXQoJy8nKSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBmcm9tVXJsKHVybDogc3RyaW5nIHwgVVJMKTogSWRlbnRpZmllciB7XG4gICAgICAgIGNvbnN0IHBhcnNlZFVybCA9IG5ldyBVUkwodXJsKTtcbiAgICAgICAgY29uc3QgbmFtZXNwYWNlID0gSWRlbnRpZmllci5uYW1lc3BhY2VGcm9tVXJsKHBhcnNlZFVybC5ocmVmKTtcbiAgICAgICAgY29uc3QgcGF0aCA9IHBhcnNlZFVybC5wYXRobmFtZS5zbGljZSgxKS5zcGxpdCgnLycpO1xuICAgICAgICByZXR1cm4gbmV3IElkZW50aWZpZXIobmFtZXNwYWNlLCAuLi5wYXRoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIG5hbWVzcGFjZUZyb21VcmwodXJsOiBzdHJpbmcgfCBVUkwpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBwYXJzZWQgPSBuZXcgVVJMKHVybCk7XG4gICAgICAgIHJldHVybiBwYXJzZWQuaG9zdG5hbWUuc3BsaXQoJy4nKS5yZXZlcnNlKCkuam9pbignLicpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgYmFzZSgpOiBJZGVudGlmaWVyIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJZGVudGlmaWVyKHRoaXMubmFtZXNwYWNlLCB0aGlzLnBhdGhbMF0pO1xuICAgIH1cblxuICAgIHB1YmxpYyB0b0pzb24oKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMua2V5KCk7XG4gICAgfVxuXG4gICAgc3RhdGljIGZyb21Kc29uKGpzb246IHN0cmluZyk6IElkZW50aWZpZXIge1xuICAgICAgICByZXR1cm4gSWRlbnRpZmllci5mcm9tS2V5KGpzb24pO1xuICAgIH1cblxuICAgIHB1YmxpYyBrZXkoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIElkZW50aWZpZXIuZm9ybWF0KHRoaXMubmFtZXNwYWNlLCAuLi50aGlzLnBhdGgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0VxdWFsKG90aGVyOiBJZGVudGlmaWVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmtleSgpID09PSBvdGhlci5rZXkoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNOYW1lc3BhY2VFcXVhbChvdGhlcjogSWRlbnRpZmllcik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5uYW1lc3BhY2UgPT09IG90aGVyLm5hbWVzcGFjZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNTdWJwYXRoT2Yob3RoZXI6IElkZW50aWZpZXIpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMubmFtZXNwYWNlICE9PSBvdGhlci5uYW1lc3BhY2UpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wYXRoLmxlbmd0aCA8IG90aGVyLnBhdGgubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvdGhlci5wYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wYXRoW2ldICE9PSBvdGhlci5wYXRoW2ldKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBqb2luKC4uLnBhdGg6IHN0cmluZ1tdKTogSWRlbnRpZmllciB7XG4gICAgICAgIHJldHVybiBuZXcgSWRlbnRpZmllcih0aGlzLm5hbWVzcGFjZSwgLi4udGhpcy5wYXRoLCAuLi5wYXRoKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJZGVudGlmaWVyTWFwPFQ+IHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IG1hcDogTWFwPHN0cmluZywgVD4gPSBuZXcgTWFwKCk7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIGVudHJpZXM/OiBJdGVyYWJsZTxbSWRlbnRpZmllciwgVF0+LFxuICAgICkge1xuICAgICAgICBpZiAoIWVudHJpZXMpIHJldHVybjtcbiAgICAgICAgZm9yIChjb25zdCBbaWQsIHZhbHVlXSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgICB0aGlzLm1hcC5zZXQoaWQua2V5KCksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgc2l6ZSgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5tYXAuc2l6ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0KGlkZW50aWZpZXI6IElkZW50aWZpZXIsIHZhbHVlOiBUKTogdm9pZCB7XG4gICAgICAgIHRoaXMubWFwLnNldChpZGVudGlmaWVyLmtleSgpLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldChpZGVudGlmaWVyOiBJZGVudGlmaWVyKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hcC5nZXQoaWRlbnRpZmllci5rZXkoKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGhhcyhpZGVudGlmaWVyOiBJZGVudGlmaWVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hcC5oYXMoaWRlbnRpZmllci5rZXkoKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGRlbGV0ZShpZGVudGlmaWVyOiBJZGVudGlmaWVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMubWFwLmRlbGV0ZShpZGVudGlmaWVyLmtleSgpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgICAgIHRoaXMubWFwLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgcHVibGljICprZXlzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8SWRlbnRpZmllcj4ge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiB0aGlzLm1hcC5rZXlzKCkpIHtcbiAgICAgICAgICAgIHlpZWxkIElkZW50aWZpZXIuZnJvbUtleShrZXkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHZhbHVlcygpOiBJdGVyYWJsZUl0ZXJhdG9yPFQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWFwLnZhbHVlcygpO1xuICAgIH1cblxuICAgIHB1YmxpYyAqZW50cmllcygpOiBJdGVyYWJsZUl0ZXJhdG9yPFtJZGVudGlmaWVyLCBUXT4ge1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB0aGlzLm1hcC5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIHlpZWxkIFtJZGVudGlmaWVyLmZyb21LZXkoa2V5KSwgdmFsdWVdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIFtTeW1ib2wuaXRlcmF0b3JdKCk6IEl0ZXJhYmxlSXRlcmF0b3I8W0lkZW50aWZpZXIsIFRdPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVudHJpZXMoKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJZGVudGlmaWVyU2V0IHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNldDogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG5cbiAgICBwdWJsaWMgZ2V0IHNpemUoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0LnNpemU7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZChpZGVudGlmaWVyOiBJZGVudGlmaWVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2V0LmFkZChpZGVudGlmaWVyLmtleSgpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaGFzKGlkZW50aWZpZXI6IElkZW50aWZpZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0LmhhcyhpZGVudGlmaWVyLmtleSgpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZGVsZXRlKGlkZW50aWZpZXI6IElkZW50aWZpZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZXQuZGVsZXRlKGlkZW50aWZpZXIua2V5KCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZXQuY2xlYXIoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgKmtleXMoKTogSXRlcmFibGVJdGVyYXRvcjxJZGVudGlmaWVyPiB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIHRoaXMuc2V0LmtleXMoKSkge1xuICAgICAgICAgICAgeWllbGQgSWRlbnRpZmllci5mcm9tS2V5KGtleSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgdmFsdWVzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8SWRlbnRpZmllcj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5rZXlzKCk7XG4gICAgfVxuXG4gICAgcHVibGljICplbnRyaWVzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8W0lkZW50aWZpZXIsIElkZW50aWZpZXJdPiB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIHRoaXMuc2V0LmtleXMoKSkge1xuICAgICAgICAgICAgY29uc3QgaWRlbnRpZmllciA9IElkZW50aWZpZXIuZnJvbUtleShrZXkpO1xuICAgICAgICAgICAgeWllbGQgW2lkZW50aWZpZXIsIGlkZW50aWZpZXJdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIFtTeW1ib2wuaXRlcmF0b3JdKCk6IEl0ZXJhYmxlSXRlcmF0b3I8W0lkZW50aWZpZXIsIElkZW50aWZpZXJdPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVudHJpZXMoKTtcbiAgICB9XG59XG4iLAogICAgImltcG9ydCB7IElkZW50aWZpZXIsIEludG9JZCB9IGZyb20gJy4vaWRlbnRpZmllcic7XG5pbXBvcnQgdHlwZSB7IExvY2FsZSB9IGZyb20gJy4vbG9jYWxpemF0aW9uL2xvY2FsZS5qcyc7XG5pbXBvcnQgdHlwZSB7IExvY2FsaXplZFRleHQgfSBmcm9tICcuL2xvY2FsaXphdGlvbi9sb2NhbGl6YXRpb24uanMnO1xuXG5leHBvcnQgdHlwZSBBcHBNZXRhZGF0YSA9IHtcbiAgICBsb2NhbGU6IExvY2FsZTtcbiAgICBuYW1lPzogTG9jYWxpemVkVGV4dDtcbiAgICBpY29uPzogTG9jYWxpemVkVGV4dDtcbiAgICBkZXNjcmlwdGlvbj86IExvY2FsaXplZFRleHQ7XG4gICAgaW1hZ2U/OiBMb2NhbGl6ZWRUZXh0O1xuICAgIHNpdGU/OiBMb2NhbGl6ZWRUZXh0O1xuICAgIHJlcG9zaXRvcnk/OiBMb2NhbGl6ZWRUZXh0O1xuICAgIGF1dGhvcnM/OiBMb2NhbGl6ZWRUZXh0O1xuICAgIGxpY2Vuc2U/OiBMb2NhbGl6ZWRUZXh0O1xuICAgIHRhZ3M/OiBzdHJpbmdbXTtcbn07XG5cbmV4cG9ydCB0eXBlIEFwcFR5cGUgPSAnYXBwJyB8ICdzZXJ2aWNlJyB8ICdyZW1vdGUnIHwgJ3BsdWdpbicgfCAnZGFzaGJvYXJkJztcblxuZXhwb3J0IHR5cGUgRGVwZW5kZW5jeVNwZWNpZmllciA9IHtcbiAgICB2ZXJzaW9uOiBzdHJpbmc7XG4gICAgaW5kZXg/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBBcHBKc29uID0ge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgdHlwZTogQXBwVHlwZTtcbiAgICBwYXJlbnRfaWQ/OiBzdHJpbmc7XG4gICAgdmVyc2lvbj86IHN0cmluZztcbiAgICB1cmw/OiBzdHJpbmc7XG4gICAgbWV0YWRhdGE/OiBBcHBNZXRhZGF0YTtcbiAgICBkZXBlbmRlbmNpZXM/OiBSZWNvcmQ8c3RyaW5nLCBEZXBlbmRlbmN5U3BlY2lmaWVyIHwgc3RyaW5nPjtcbn07XG5cbmV4cG9ydCBjbGFzcyBBcHAge1xuICAgIHB1YmxpYyByZWFkb25seSBpZDogSWRlbnRpZmllcjtcbiAgICBwdWJsaWMgcmVhZG9ubHkgdHlwZTogQXBwVHlwZTtcbiAgICBwdWJsaWMgcmVhZG9ubHkgcGFyZW50SWQ/OiBJZGVudGlmaWVyO1xuICAgIHB1YmxpYyByZWFkb25seSB2ZXJzaW9uPzogc3RyaW5nO1xuICAgIHB1YmxpYyByZWFkb25seSB1cmw/OiBzdHJpbmc7XG4gICAgcHVibGljIHJlYWRvbmx5IG1ldGFkYXRhPzogQXBwTWV0YWRhdGE7XG4gICAgcHVibGljIHJlYWRvbmx5IGRlcGVuZGVuY2llczogUmVjb3JkPHN0cmluZywgRGVwZW5kZW5jeVNwZWNpZmllciB8IHN0cmluZz47XG5cbiAgICBjb25zdHJ1Y3RvcihpZDogSW50b0lkLCBvcHRpb25zOiB7XG4gICAgICAgIHR5cGU/OiBBcHBUeXBlO1xuICAgICAgICBwYXJlbnRJZD86IEludG9JZDtcbiAgICAgICAgdmVyc2lvbj86IHN0cmluZztcbiAgICAgICAgdXJsPzogc3RyaW5nO1xuICAgICAgICBtZXRhZGF0YT86IEFwcE1ldGFkYXRhO1xuICAgICAgICBkZXBlbmRlbmNpZXM/OiBSZWNvcmQ8c3RyaW5nLCBEZXBlbmRlbmN5U3BlY2lmaWVyIHwgc3RyaW5nPjtcbiAgICB9KSB7XG4gICAgICAgIHRoaXMuaWQgPSBJZGVudGlmaWVyLmZyb20oaWQpO1xuICAgICAgICB0aGlzLnBhcmVudElkID0gSWRlbnRpZmllci5mcm9tT3B0aW9uYWwob3B0aW9ucy5wYXJlbnRJZCk7XG4gICAgICAgIHRoaXMudmVyc2lvbiA9IG9wdGlvbnMudmVyc2lvbjtcbiAgICAgICAgdGhpcy51cmwgPSBvcHRpb25zLnVybDtcbiAgICAgICAgdGhpcy5tZXRhZGF0YSA9IG9wdGlvbnMubWV0YWRhdGE7XG4gICAgICAgIHRoaXMudHlwZSA9IG9wdGlvbnMudHlwZSA/PyAnYXBwJztcbiAgICAgICAgdGhpcy5kZXBlbmRlbmNpZXMgPSBvcHRpb25zLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGRlc2VyaWFsaXplKGluZm86IEFwcEpzb24pOiBBcHAge1xuICAgICAgICBjb25zdCBpZCA9IElkZW50aWZpZXIuZnJvbUtleShpbmZvLmlkKTtcbiAgICAgICAgcmV0dXJuIG5ldyBBcHAoaWQsIHtcbiAgICAgICAgICAgIHBhcmVudElkOiBJZGVudGlmaWVyLmZyb21PcHRpb25hbChpbmZvLnBhcmVudF9pZCksXG4gICAgICAgICAgICB2ZXJzaW9uOiBpbmZvLnZlcnNpb24sXG4gICAgICAgICAgICB1cmw6IGluZm8udXJsLFxuICAgICAgICAgICAgdHlwZTogaW5mby50eXBlLFxuICAgICAgICAgICAgbWV0YWRhdGE6IGluZm8ubWV0YWRhdGEsXG4gICAgICAgICAgICBkZXBlbmRlbmNpZXM6IGluZm8uZGVwZW5kZW5jaWVzID8/IHt9LFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZShkYXRhOiBBcHApOiBBcHBKc29uIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGlkOiBkYXRhLmlkLmtleSgpLFxuICAgICAgICAgICAgdHlwZTogZGF0YS50eXBlLFxuICAgICAgICAgICAgcGFyZW50X2lkOiBkYXRhLnBhcmVudElkPy5rZXkoKSxcbiAgICAgICAgICAgIHZlcnNpb246IGRhdGEudmVyc2lvbixcbiAgICAgICAgICAgIHVybDogZGF0YS51cmwsXG4gICAgICAgICAgICBtZXRhZGF0YTogZGF0YS5tZXRhZGF0YSxcbiAgICAgICAgICAgIGRlcGVuZGVuY2llczogZGF0YS5kZXBlbmRlbmNpZXMsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHVibGljIGpvaW4oLi4ucGF0aHM6IHN0cmluZ1tdKTogQXBwIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBcHAodGhpcy5pZC5qb2luKC4uLnBhdGhzKSwge1xuICAgICAgICAgICAgcGFyZW50SWQ6IHRoaXMucGFyZW50SWQsXG4gICAgICAgICAgICB2ZXJzaW9uOiB0aGlzLnZlcnNpb24sXG4gICAgICAgICAgICB1cmw6IHRoaXMudXJsLFxuICAgICAgICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgICAgICAgbWV0YWRhdGE6IHRoaXMubWV0YWRhdGEsXG4gICAgICAgICAgICBkZXBlbmRlbmNpZXM6IHRoaXMuZGVwZW5kZW5jaWVzLFxuICAgICAgICB9KTtcbiAgICB9XG59XG4iLAogICAgImV4cG9ydCBjb25zdCB0ZXh0RW5jb2RlcjogVGV4dEVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbmV4cG9ydCBjb25zdCB0ZXh0RGVjb2RlcjogVGV4dERlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoKTtcbiIsCiAgICAiaW1wb3J0IHsgdGV4dERlY29kZXIsIHRleHRFbmNvZGVyIH0gZnJvbSAnLi4vY29uc3QuanMnO1xuXG5leHBvcnQgdHlwZSBKc29uVHlwZSA9IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBudWxsIHwgdW5kZWZpbmVkIHwgeyBba2V5IGluIG5ldmVyXT86IEpzb25UeXBlIH0gfCBKc29uVHlwZVtdO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNlcmlhbGl6YWJsZTxULCBEPiB7XG4gICAgc2VyaWFsaXplKGRhdGE6IFQpOiBEO1xuICAgIGRlc2VyaWFsaXplKGRhdGE6IEQpOiBUO1xufVxuXG5leHBvcnQgY2xhc3MgU2VyaWFsaXplcjxULCBEPiB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBzZXJpYWxpemU6IChkYXRhOiBUKSA9PiBELFxuICAgICAgICBwdWJsaWMgZGVzZXJpYWxpemU6IChkYXRhOiBEKSA9PiBULFxuICAgICkgeyB9XG5cbiAgICBwdWJsaWMgc3RhdGljIG9mPFQsIEQ+KHNlcmlhbGl6ZXI6IFNlcmlhbGl6YWJsZTxULCBEPik6IFNlcmlhbGl6ZXI8VCwgRD4ge1xuICAgICAgICByZXR1cm4gbmV3IFNlcmlhbGl6ZXI8VCwgRD4oc2VyaWFsaXplci5zZXJpYWxpemUsIHNlcmlhbGl6ZXIuZGVzZXJpYWxpemUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgcGlwZTxULCBSLCBEPihzZXIxOiBTZXJpYWxpemFibGU8VCwgUj4sIHNlcjI6IFNlcmlhbGl6YWJsZTxSLCBEPik6IFNlcmlhbGl6YWJsZTxULCBEPiB7XG4gICAgICAgIHJldHVybiBuZXcgU2VyaWFsaXplcjxULCBEPihcbiAgICAgICAgICAgIChkYXRhKSA9PiBzZXIyLnNlcmlhbGl6ZShzZXIxLnNlcmlhbGl6ZShkYXRhKSksXG4gICAgICAgICAgICAoZGF0YSkgPT4gc2VyMS5kZXNlcmlhbGl6ZShzZXIyLmRlc2VyaWFsaXplKGRhdGEpKSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHRyYW5zZm9ybTxUPihmdW5jOiAodmFsdWU6IFQpID0+IFQpOiBTZXJpYWxpemVyPFQsIFQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZXJpYWxpemVyPFQsIFQ+KFxuICAgICAgICAgICAgZnVuYyxcbiAgICAgICAgICAgIGZ1bmMsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBub29wPFQ+KCk6IFNlcmlhbGl6ZXI8VCwgVD4ge1xuICAgICAgICByZXR1cm4gbmV3IFNlcmlhbGl6ZXI8VCwgVD4oXG4gICAgICAgICAgICAoZGF0YSkgPT4gZGF0YSxcbiAgICAgICAgICAgIChkYXRhKSA9PiBkYXRhLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBmaWVsZDxcbiAgICAgICAgSyBleHRlbmRzIGtleW9mIEQsXG4gICAgICAgIFIsXG4gICAgPihcbiAgICAgICAga2V5OiBLLFxuICAgICAgICBzZXJpYWxpemVyOiBTZXJpYWxpemFibGU8RFtLXSwgUj4sXG4gICAgKTogU2VyaWFsaXplcjxcbiAgICAgICAgVCxcbiAgICAgICAgeyBbUCBpbiBrZXlvZiBEXTogUCBleHRlbmRzIEsgPyBSIDogRFtQXSB9XG4gICAgPiB7XG4gICAgICAgIHJldHVybiBuZXcgU2VyaWFsaXplcjxcbiAgICAgICAgICAgIFQsXG4gICAgICAgICAgICB7IFtQIGluIGtleW9mIERdOiBQIGV4dGVuZHMgSyA/IFIgOiBEW1BdIH1cbiAgICAgICAgPihcbiAgICAgICAgICAgIChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2VyaWFsaXplZCA9IHRoaXMuc2VyaWFsaXplKGRhdGEpO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIC4uLnNlcmlhbGl6ZWQsXG4gICAgICAgICAgICAgICAgICAgIFtrZXldOiBzZXJpYWxpemVyLnNlcmlhbGl6ZShzZXJpYWxpemVkW2tleV0pLFxuICAgICAgICAgICAgICAgIH0gYXMgeyBbUCBpbiBrZXlvZiBEXTogUCBleHRlbmRzIEsgPyBSIDogRFtQXSB9O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVzZXJpYWxpemUoe1xuICAgICAgICAgICAgICAgICAgICAuLi5kYXRhLFxuICAgICAgICAgICAgICAgICAgICBba2V5XTogc2VyaWFsaXplci5kZXNlcmlhbGl6ZShkYXRhW2tleV0gYXMgUiksXG4gICAgICAgICAgICAgICAgfSBhcyBEKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgc3RhdGljIGpzb248VCBleHRlbmRzIEpzb25UeXBlPigpOiBTZXJpYWxpemVyPFQsIFVpbnQ4QXJyYXk+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZXJpYWxpemVyPFQsIFVpbnQ4QXJyYXk+KFxuICAgICAgICAgICAgKGRhdGEpID0+IHRleHRFbmNvZGVyLmVuY29kZShKU09OLnN0cmluZ2lmeShkYXRhKSksXG4gICAgICAgICAgICAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRleHQgPSB0ZXh0RGVjb2Rlci5kZWNvZGUoZGF0YSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UodGV4dCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyB0b0pzb24oKTogU2VyaWFsaXplcjxULCBVaW50OEFycmF5PiB7XG4gICAgICAgIHJldHVybiBuZXcgU2VyaWFsaXplcjxULCBVaW50OEFycmF5PihcbiAgICAgICAgICAgIChkYXRhKSA9PiB0ZXh0RW5jb2Rlci5lbmNvZGUoSlNPTi5zdHJpbmdpZnkodGhpcy5zZXJpYWxpemUoZGF0YSkpKSxcbiAgICAgICAgICAgIChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGV4dCA9IHRleHREZWNvZGVyLmRlY29kZShkYXRhKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kZXNlcmlhbGl6ZShKU09OLnBhcnNlKHRleHQpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIHRvQXJyYXkoKTogU2VyaWFsaXplcjxUW10sIERbXT4ge1xuICAgICAgICByZXR1cm4gbmV3IFNlcmlhbGl6ZXI8VFtdLCBEW10+KFxuICAgICAgICAgICAgKGRhdGEpID0+IGRhdGEubWFwKChpdGVtKSA9PiB0aGlzLnNlcmlhbGl6ZShpdGVtKSksXG4gICAgICAgICAgICAoZGF0YSkgPT4gZGF0YS5tYXAoKGl0ZW0pID0+IHRoaXMuZGVzZXJpYWxpemUoaXRlbSkpLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyB0b01hcCgpOiBTZXJpYWxpemVyPE1hcDxzdHJpbmcsIFQ+LCBNYXA8c3RyaW5nLCBEPj4ge1xuICAgICAgICByZXR1cm4gbmV3IFNlcmlhbGl6ZXI8TWFwPHN0cmluZywgVD4sIE1hcDxzdHJpbmcsIEQ+PihcbiAgICAgICAgICAgIChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IE1hcDxzdHJpbmcsIEQ+KCk7XG4gICAgICAgICAgICAgICAgZGF0YS5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zZXQoa2V5LCB0aGlzLnNlcmlhbGl6ZSh2YWx1ZSkpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgTWFwPHN0cmluZywgVD4oKTtcbiAgICAgICAgICAgICAgICBkYXRhLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnNldChrZXksIHRoaXMuZGVzZXJpYWxpemUodmFsdWUpKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZmFsbGJhY2soZmFsbGJhY2s6IFQpOiBTZXJpYWxpemVyPFQsIEQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZXJpYWxpemVyPFQsIEQ+KFxuICAgICAgICAgICAgKGRhdGEpID0+IHRoaXMuc2VyaWFsaXplKGRhdGEpLFxuICAgICAgICAgICAgKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kZXNlcmlhbGl6ZShkYXRhKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbGxiYWNrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIGZhbGxiYWNrTWFwKGZhbGxiYWNrOiAoZGF0YTogRCwgZXJyb3I6IHVua25vd24pID0+IFQpOiBTZXJpYWxpemVyPFQsIEQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZXJpYWxpemVyPFQsIEQ+KFxuICAgICAgICAgICAgKGRhdGEpID0+IHRoaXMuc2VyaWFsaXplKGRhdGEpLFxuICAgICAgICAgICAgKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kZXNlcmlhbGl6ZShkYXRhKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsbGJhY2soZGF0YSwgZXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIHBpcGU8RT4oc2VyaWFsaXplcjogU2VyaWFsaXphYmxlPEQsIEU+KTogU2VyaWFsaXplcjxULCBFPiB7XG4gICAgICAgIHJldHVybiBuZXcgU2VyaWFsaXplcjxULCBFPihcbiAgICAgICAgICAgIChkYXRhKSA9PiBzZXJpYWxpemVyLnNlcmlhbGl6ZSh0aGlzLnNlcmlhbGl6ZShkYXRhKSksXG4gICAgICAgICAgICAoZGF0YSkgPT4gdGhpcy5kZXNlcmlhbGl6ZShzZXJpYWxpemVyLmRlc2VyaWFsaXplKGRhdGEpKSxcbiAgICAgICAgKTtcbiAgICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgSWRlbnRpZmllciB9IGZyb20gJy4uLy4uL2lkZW50aWZpZXInO1xuaW1wb3J0IHsgSnNvblR5cGUsIHR5cGUgU2VyaWFsaXphYmxlLCBTZXJpYWxpemVyIH0gZnJvbSAnLi4vLi4vc2VyaWFsaXplJztcblxuZXhwb3J0IHR5cGUgUGFja2V0RGF0YSA9IHtcbiAgICByZWFkb25seSB0eXBlOiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgZGF0YTogVWludDhBcnJheTtcbn07XG5cbmV4cG9ydCB0eXBlIFBhY2tldDxUID0gdW5rbm93bj4gPSB7XG4gICAgcmVhZG9ubHkgdHlwZTogUGFja2V0VHlwZTxUPjtcbiAgICByZWFkb25seSBkYXRhOiBUO1xufTtcblxuZXhwb3J0IGNsYXNzIFBhY2tldFR5cGU8VD4ge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgaWQ6IElkZW50aWZpZXIsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBzZXJpYWxpemVyOiBTZXJpYWxpemFibGU8VCwgVWludDhBcnJheT4sXG4gICAgKSB7IH1cblxuICAgIHB1YmxpYyBuZXcoZGF0YTogVCk6IFBhY2tldDxUPiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiB0aGlzLFxuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcHVibGljIG1hdGNoKHBhY2tldDogUGFja2V0KTogcGFja2V0IGlzIFBhY2tldDxUPiB7XG4gICAgICAgIHJldHVybiBwYWNrZXQudHlwZSA9PT0gdGhpcztcbiAgICB9XG5cbiAgICBzdGF0aWMgY3JlYXRlSnNvbjxULCBEIGV4dGVuZHMgSnNvblR5cGUgPSBKc29uVHlwZT4oaWRlbnRpZmllcjogSWRlbnRpZmllciwge1xuICAgICAgICBuYW1lLFxuICAgICAgICBzZXJpYWxpemVyLFxuICAgIH06IHtcbiAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICBzZXJpYWxpemVyPzogU2VyaWFsaXphYmxlPFQsIEQ+O1xuICAgIH0pOiBQYWNrZXRUeXBlPFQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQYWNrZXRUeXBlPFQ+KFxuICAgICAgICAgICAgaWRlbnRpZmllci5qb2luKG5hbWUpLFxuICAgICAgICAgICAgU2VyaWFsaXplci5waXBlPFQsIEQsIFVpbnQ4QXJyYXk+KHNlcmlhbGl6ZXIgPz8gU2VyaWFsaXplci5ub29wKCksIFNlcmlhbGl6ZXIuanNvbigpKSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgY3JlYXRlU2VyaWFsaXplZDxUPihpZGVudGlmaWVyOiBJZGVudGlmaWVyLCB7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIHNlcmlhbGl6ZXIsXG4gICAgfToge1xuICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgIHNlcmlhbGl6ZXI6IFNlcmlhbGl6YWJsZTxULCBVaW50OEFycmF5PjtcbiAgICB9KTogUGFja2V0VHlwZTxUPiB7XG4gICAgICAgIHJldHVybiBuZXcgUGFja2V0VHlwZShcbiAgICAgICAgICAgIGlkZW50aWZpZXIuam9pbihuYW1lKSxcbiAgICAgICAgICAgIHNlcmlhbGl6ZXIsXG4gICAgICAgICk7XG4gICAgfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IEFwcEpzb24gfSBmcm9tICcuLi8uLi9hcHAuanMnO1xuaW1wb3J0IHsgQXBwIH0gZnJvbSAnLi4vLi4vYXBwLmpzJztcbmltcG9ydCB7IElkZW50aWZpZXIgfSBmcm9tICcuLi8uLi9pZGVudGlmaWVyJztcbmltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tICcuLi8uLi9zZXJpYWxpemUvc2VyaWFsaXplci5qcyc7XG5pbXBvcnQgeyBQYWNrZXRUeXBlIH0gZnJvbSAnLi9wYWNrZXQuanMnO1xuXG5jb25zdCBJREVOVElGSUVSID0gbmV3IElkZW50aWZpZXIoJ2NvcmUnLCAncGFja2V0Jyk7XG5cbnR5cGUgUHJvdG9jb2xJbmZvID0ge1xuICAgIHZlcnNpb246IHN0cmluZztcbn07XG5cbnR5cGUgUlNBTnVtYmVycyA9IHtcbiAgICBlOiBzdHJpbmc7XG4gICAgbjogc3RyaW5nO1xufTtcblxudHlwZSBFbmNyeXB0aW9uUmVxdWVzdCA9IHtcbiAgICBraW5kOiAndjEnO1xuICAgIHJzYTogUlNBTnVtYmVycztcbn07XG5cbnR5cGUgRW5jcnlwdGlvblJlc3BvbnNlID0ge1xuICAgIGtpbmQ6ICd2MSc7XG4gICAgcnNhOiBSU0FOdW1iZXJzO1xuICAgIGFlczogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgU2VydmVyTWV0YSA9IHtcbiAgICBwcm90b2NvbDogUHJvdG9jb2xJbmZvO1xuICAgIGVuY3J5cHRpb246IEVuY3J5cHRpb25SZXF1ZXN0IHwgbnVsbDtcbiAgICBoYXNoOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59O1xuXG50eXBlIENvbm5lY3RQYWNrZXRKc29uID0ge1xuICAgIHByb3RvY29sOiBQcm90b2NvbEluZm87XG4gICAgYXBwOiBBcHBKc29uO1xuICAgIHRva2VuOiBzdHJpbmc7XG4gICAgZW5jcnlwdGlvbjogRW5jcnlwdGlvblJlc3BvbnNlIHwgbnVsbDtcbn07XG5cbmV4cG9ydCBjbGFzcyBDb25uZWN0UGFja2V0IHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgcHJvdG9jb2w6IFByb3RvY29sSW5mbztcbiAgICBwdWJsaWMgcmVhZG9ubHkgYXBwOiBBcHA7XG4gICAgcHVibGljIHJlYWRvbmx5IHRva2VuOiBzdHJpbmc7XG4gICAgcHVibGljIHJlYWRvbmx5IGVuY3J5cHRpb246IEVuY3J5cHRpb25SZXNwb25zZSB8IG51bGw7XG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiB7XG4gICAgICAgIHByb3RvY29sOiBQcm90b2NvbEluZm87XG4gICAgICAgIGFwcDogQXBwO1xuICAgICAgICB0b2tlbjogc3RyaW5nO1xuICAgICAgICBlbmNyeXB0aW9uPzogRW5jcnlwdGlvblJlc3BvbnNlIHwgbnVsbDtcbiAgICB9KSB7XG4gICAgICAgIHRoaXMucHJvdG9jb2wgPSBvcHRpb25zLnByb3RvY29sO1xuICAgICAgICB0aGlzLmFwcCA9IG9wdGlvbnMuYXBwO1xuICAgICAgICB0aGlzLnRva2VuID0gb3B0aW9ucy50b2tlbjtcbiAgICAgICAgdGhpcy5lbmNyeXB0aW9uID0gb3B0aW9ucy5lbmNyeXB0aW9uID8/IG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZXNlcmlhbGl6ZShkYXRhOiBDb25uZWN0UGFja2V0SnNvbik6IENvbm5lY3RQYWNrZXQge1xuICAgICAgICByZXR1cm4gbmV3IENvbm5lY3RQYWNrZXQoe1xuICAgICAgICAgICAgcHJvdG9jb2w6IGRhdGEucHJvdG9jb2wsXG4gICAgICAgICAgICBhcHA6IEFwcC5kZXNlcmlhbGl6ZShkYXRhLmFwcCksXG4gICAgICAgICAgICBlbmNyeXB0aW9uOiBkYXRhLmVuY3J5cHRpb24sXG4gICAgICAgICAgICB0b2tlbjogZGF0YS50b2tlbixcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBzZXJpYWxpemUoZGF0YTogQ29ubmVjdFBhY2tldCk6IENvbm5lY3RQYWNrZXRKc29uIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHByb3RvY29sOiBkYXRhLnByb3RvY29sLFxuICAgICAgICAgICAgYXBwOiBBcHAuc2VyaWFsaXplKGRhdGEuYXBwKSxcbiAgICAgICAgICAgIGVuY3J5cHRpb246IGRhdGEuZW5jcnlwdGlvbixcbiAgICAgICAgICAgIHRva2VuOiBkYXRhLnRva2VuLFxuICAgICAgICB9O1xuICAgIH1cbn1cblxuZXhwb3J0IGVudW0gRGlzY29ubmVjdFR5cGUge1xuICAgIElOVkFMSURfVE9LRU4gPSAnaW52YWxpZF90b2tlbicsXG4gICAgSU5WQUxJRF9PUklHSU4gPSAnaW52YWxpZF9vcmlnaW4nLFxuICAgIElOVkFMSURfVkVSU0lPTiA9ICdpbnZhbGlkX3ZlcnNpb24nLFxuICAgIElOVkFMSURfUEFDS0VUX1RZUEUgPSAnaW52YWxpZF9wYWNrZXRfdHlwZScsXG4gICAgSU5WQUxJRF9QQUNLRVRfREFUQSA9ICdpbnZhbGlkX3BhY2tldF9kYXRhJyxcbiAgICBJTlZBTElEX1BBQ0tFVCA9ICdpbnZhbGlkX3BhY2tldCcsXG4gICAgSU5URVJOQUxfRVJST1IgPSAnaW50ZXJuYWxfZXJyb3InLFxuICAgIEFOT1RIRVJfQ09OTkVDVElPTiA9ICdhbm90aGVyX2Nvbm5lY3Rpb24nLFxuICAgIFBFUk1JU1NJT05fREVOSUVEID0gJ3Blcm1pc3Npb25fZGVuaWVkJyxcbiAgICBBUFBfUkVNT1ZFRCA9ICdhcHBfcmVtb3ZlZCcsXG4gICAgU0VSVkVSX1JFU1RBUlQgPSAnc2VydmVyX3Jlc3RhcnQnLFxuICAgIFNIVVRET1dOID0gJ3NodXRkb3duJyxcbiAgICBDTE9TRSA9ICdjbG9zZScsXG59XG5cbnR5cGUgRGlzY29ubmVjdFBhY2tldEpzb24gPSB7XG4gICAgdHlwZTogRGlzY29ubmVjdFR5cGU7XG4gICAgbWVzc2FnZTogc3RyaW5nIHwgbnVsbDtcbn07XG5cbmV4cG9ydCBjbGFzcyBEaXNjb25uZWN0UGFja2V0IHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgdHlwZTogRGlzY29ubmVjdFR5cGU7XG4gICAgcHVibGljIHJlYWRvbmx5IG1lc3NhZ2U6IHN0cmluZyB8IG51bGw7XG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiB7XG4gICAgICAgIHR5cGU6IERpc2Nvbm5lY3RUeXBlO1xuICAgICAgICBtZXNzYWdlPzogc3RyaW5nIHwgbnVsbDtcbiAgICB9KSB7XG4gICAgICAgIHRoaXMudHlwZSA9IG9wdGlvbnMudHlwZTtcbiAgICAgICAgdGhpcy5tZXNzYWdlID0gb3B0aW9ucy5tZXNzYWdlID8/IG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBzZXJpYWxpemUoZGF0YTogRGlzY29ubmVjdFBhY2tldCk6IERpc2Nvbm5lY3RQYWNrZXRKc29uIHtcbiAgICAgICAgcmV0dXJuIGRhdGEudG9Kc29uKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZXNlcmlhbGl6ZShkYXRhOiBEaXNjb25uZWN0UGFja2V0SnNvbik6IERpc2Nvbm5lY3RQYWNrZXQge1xuICAgICAgICByZXR1cm4gRGlzY29ubmVjdFBhY2tldC5mcm9tSnNvbihkYXRhKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZnJvbUpzb24oZGF0YTogRGlzY29ubmVjdFBhY2tldEpzb24pOiBEaXNjb25uZWN0UGFja2V0IHtcbiAgICAgICAgcmV0dXJuIG5ldyBEaXNjb25uZWN0UGFja2V0KHtcbiAgICAgICAgICAgIHR5cGU6IGRhdGEudHlwZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGRhdGEubWVzc2FnZSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdG9Kc29uKCk6IERpc2Nvbm5lY3RQYWNrZXRKc29uIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRoaXMubWVzc2FnZSxcbiAgICAgICAgfTtcbiAgICB9XG59XG5cbmV4cG9ydCBjb25zdCBQQUNLRVRfVFlQRVM6IHtcbiAgICBTRVJWRVJfTUVUQTogUGFja2V0VHlwZTxTZXJ2ZXJNZXRhPjtcbiAgICBDT05ORUNUOiBQYWNrZXRUeXBlPENvbm5lY3RQYWNrZXQ+O1xuICAgIERJU0NPTk5FQ1Q6IFBhY2tldFR5cGU8RGlzY29ubmVjdFBhY2tldD47XG4gICAgVE9LRU46IFBhY2tldFR5cGU8c3RyaW5nPjtcbiAgICBSRUFEWTogUGFja2V0VHlwZTx1bmRlZmluZWQ+O1xuICAgIEVOQ1JZUFRFRF9QQUNLRVQ6IFBhY2tldFR5cGU8VWludDhBcnJheT47XG59ID0ge1xuICAgIFNFUlZFUl9NRVRBOiBQYWNrZXRUeXBlLmNyZWF0ZUpzb248U2VydmVyTWV0YT4oSURFTlRJRklFUiwge1xuICAgICAgICBuYW1lOiAnc2VydmVyX21ldGEnLFxuICAgIH0pLFxuICAgIENPTk5FQ1Q6IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxDb25uZWN0UGFja2V0PihJREVOVElGSUVSLCB7XG4gICAgICAgIG5hbWU6ICdjb25uZWN0JyxcbiAgICAgICAgc2VyaWFsaXplcjogQ29ubmVjdFBhY2tldCxcbiAgICB9KSxcbiAgICBESVNDT05ORUNUOiBQYWNrZXRUeXBlLmNyZWF0ZUpzb248RGlzY29ubmVjdFBhY2tldD4oSURFTlRJRklFUiwge1xuICAgICAgICBuYW1lOiAnZGlzY29ubmVjdCcsXG4gICAgICAgIHNlcmlhbGl6ZXI6IERpc2Nvbm5lY3RQYWNrZXQsXG4gICAgfSksXG4gICAgVE9LRU46IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxzdHJpbmc+KElERU5USUZJRVIsIHtcbiAgICAgICAgbmFtZTogJ3Rva2VuJyxcbiAgICB9KSxcbiAgICBSRUFEWTogUGFja2V0VHlwZS5jcmVhdGVKc29uPHVuZGVmaW5lZD4oSURFTlRJRklFUiwge1xuICAgICAgICBuYW1lOiAncmVhZHknLFxuICAgIH0pLFxuICAgIEVOQ1JZUFRFRF9QQUNLRVQ6IFBhY2tldFR5cGUuY3JlYXRlU2VyaWFsaXplZDxVaW50OEFycmF5PihJREVOVElGSUVSLCB7XG4gICAgICAgIG5hbWU6ICdlJyxcbiAgICAgICAgc2VyaWFsaXplcjogU2VyaWFsaXplci5ub29wKCksXG4gICAgfSksXG59O1xuIgogIF0sCiAgIm1hcHBpbmdzIjogIjs7QUFHQSxJQUFNLGtCQUFrQjtBQUN4QixJQUFNLGFBQWE7QUFBQTtBQUlaLE1BQU0sV0FBVztBQUFBLEVBQ0o7QUFBQSxFQUNBO0FBQUEsRUFFaEIsV0FBVyxDQUNQLGNBQ0csTUFDTDtBQUFBLElBQ0UsV0FBVyxTQUFTLFdBQVcsSUFBSTtBQUFBLElBQ25DLEtBQUssWUFBWTtBQUFBLElBQ2pCLEtBQUssT0FBTztBQUFBO0FBQUEsU0FHRixTQUFTLENBQUMsWUFBZ0M7QUFBQSxJQUNwRCxPQUFPLFdBQVcsSUFBSTtBQUFBO0FBQUEsU0FHWixXQUFXLENBQUMsTUFBMEI7QUFBQSxJQUNoRCxPQUFPLFdBQVcsU0FBUyxJQUFJO0FBQUE7QUFBQSxTQUdyQixJQUFJLENBQUMsSUFBd0I7QUFBQSxJQUN2QyxJQUFJLGNBQWMsWUFBWTtBQUFBLE1BQzFCLE9BQU87QUFBQSxJQUNYLEVBQU8sU0FBSSxjQUFjLEtBQUs7QUFBQSxNQUMxQixPQUFPLEdBQUc7QUFBQSxJQUNkLEVBQU8sU0FBSSxPQUFPLE9BQU8sVUFBVTtBQUFBLE1BQy9CLE9BQU8sV0FBVyxRQUFRLEVBQUU7QUFBQSxJQUNoQyxFQUFPO0FBQUEsTUFHSCxNQUFNLFdBQVc7QUFBQSxNQUNqQixJQUNJLE9BQU8sU0FBUyxjQUFjLFlBQzlCLE1BQU0sUUFBUSxTQUFTLElBQUksS0FDM0IsU0FBUyxLQUFLLE1BQU0sQ0FBQyxNQUFNLE9BQU8sTUFBTSxRQUFRLEdBQ2xEO0FBQUEsUUFDRSxPQUFPLElBQUksV0FBVyxTQUFTLFdBQVcsR0FBRyxTQUFTLElBQUk7QUFBQSxNQUM5RDtBQUFBLE1BQ0EsTUFBTSxXQUFXO0FB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Q3BFLE9BQU8saUJBQWlCLFNBQVMsSUFBSTtBQUFBO0FBQUEsU0FHbEMsUUFBUSxDQUFDLE1BQThDO0FBQUEsSUFDMUQsT0FBTyxJQUFJLGlCQUFpQjtBQUFBLE1BQ3hCLE1BQU0sS0FBSztBQUFBLE1BQ1gsU0FBUyxLQUFLO0FBQUEsSUFDbEIsQ0FBQztBQUFBO0FBQUEsRUFHTCxNQUFNLEdBQXlCO0FBQUEsSUFDM0IsT0FBTztBQUFBLE1BQ0gsTUFBTSxLQUFLO0FBQUEsTUFDWCxTQUFTLEtBQUs7QUFBQSxJQUNsQjtBQUFBO0FBRVI7QUFFTyxJQUFNLGVBT1Q7QUFBQSxFQUNBLGFBQWEsV0FBVyxXQUF1QixZQUFZO0FBQUEsSUFDdkQsTUFBTTtBQUFBLEVBQ1YsQ0FBQztBQUFBLEVBQ0QsU0FBUyxXQUFXLFdBQTBCLFlBQVk7QUFBQSxJQUN0RCxNQUFNO0FBQUEsSUFDTixZQUFZO0FBQUEsRUFDaEIsQ0FBQztBQUFBLEVBQ0QsWUFBWSxXQUFXLFdBQTZCLFlBQVk7QUFBQSxJQUM1RCxNQUFNO0FBQUEsSUFDTixZQUFZO0FBQUEsRUFDaEIsQ0FBQztBQUFBLEVBQ0QsT0FBTyxXQUFXLFdBQW1CLFlBQVk7QUFBQSxJQUM3QyxNQUFNO0FBQUEsRUFDVixDQUFDO0FBQUEsRUFDRCxPQUFPLFdBQVcsV0FBc0IsWUFBWTtBQUFBLElBQ2hELE1BQU07QUFBQSxFQUNWLENBQUM7QUFBQSxFQUNELGtCQUFrQixXQUFXLGlCQUE2QixZQUFZO0FBQUEsSUFDbEUsTUFBTTtBQUFBLElBQ04sWUFBWSxXQUFXLEtBQUs7QUFBQSxFQUNoQyxDQUFDO0FBQ0w7IiwKICAiZGVidWdJZCI6ICI2NDU4MjhGMzIzODBENEI3NjQ3NTZFMjE2NDc1NkUyMSIsCiAgIm5hbWVzIjogW10KfQ==