@jubbio/core 1.3.2 → 1.3.4

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 (130) hide show
  1. package/dist/Client.js +50 -10
  2. package/dist/rest/REST.d.ts +1 -0
  3. package/dist/rest/REST.js +1 -1
  4. package/dist/structures/Channel.d.ts +1 -1
  5. package/dist/structures/Channel.js +11 -4
  6. package/dist/structures/Guild.d.ts +1 -1
  7. package/dist/structures/Guild.js +7 -3
  8. package/dist/structures/Message.d.ts +2 -0
  9. package/dist/structures/Message.js +13 -33
  10. package/package.json +4 -14
  11. package/dist/cjs/Client.d.ts +0 -157
  12. package/dist/cjs/Client.js +0 -640
  13. package/dist/cjs/builders/ActionRowBuilder.d.ts +0 -53
  14. package/dist/cjs/builders/ActionRowBuilder.js +0 -68
  15. package/dist/cjs/builders/ButtonBuilder.d.ts +0 -77
  16. package/dist/cjs/builders/ButtonBuilder.js +0 -96
  17. package/dist/cjs/builders/EmbedBuilder.d.ts +0 -157
  18. package/dist/cjs/builders/EmbedBuilder.js +0 -208
  19. package/dist/cjs/builders/ModalBuilder.d.ts +0 -122
  20. package/dist/cjs/builders/ModalBuilder.js +0 -162
  21. package/dist/cjs/builders/SelectMenuBuilder.d.ts +0 -123
  22. package/dist/cjs/builders/SelectMenuBuilder.js +0 -165
  23. package/dist/cjs/builders/SlashCommandBuilder.d.ts +0 -197
  24. package/dist/cjs/builders/SlashCommandBuilder.js +0 -324
  25. package/dist/cjs/builders/index.d.ts +0 -9
  26. package/dist/cjs/builders/index.js +0 -26
  27. package/dist/cjs/enums.d.ts +0 -191
  28. package/dist/cjs/enums.js +0 -211
  29. package/dist/cjs/index.d.ts +0 -25
  30. package/dist/cjs/index.js +0 -130
  31. package/dist/cjs/managers/BaseManager.d.ts +0 -69
  32. package/dist/cjs/managers/BaseManager.js +0 -106
  33. package/dist/cjs/managers/ChannelManager.d.ts +0 -95
  34. package/dist/cjs/managers/ChannelManager.js +0 -205
  35. package/dist/cjs/managers/GuildMemberManager.d.ts +0 -74
  36. package/dist/cjs/managers/GuildMemberManager.js +0 -157
  37. package/dist/cjs/managers/RoleManager.d.ts +0 -84
  38. package/dist/cjs/managers/RoleManager.js +0 -207
  39. package/dist/cjs/managers/index.d.ts +0 -7
  40. package/dist/cjs/managers/index.js +0 -24
  41. package/dist/cjs/rest/REST.d.ts +0 -527
  42. package/dist/cjs/rest/REST.js +0 -904
  43. package/dist/cjs/rest/index.d.ts +0 -1
  44. package/dist/cjs/rest/index.js +0 -18
  45. package/dist/cjs/sharding/ShardingManager.d.ts +0 -179
  46. package/dist/cjs/sharding/ShardingManager.js +0 -375
  47. package/dist/cjs/sharding/index.d.ts +0 -4
  48. package/dist/cjs/sharding/index.js +0 -21
  49. package/dist/cjs/structures/Channel.d.ts +0 -122
  50. package/dist/cjs/structures/Channel.js +0 -240
  51. package/dist/cjs/structures/Collection.d.ts +0 -53
  52. package/dist/cjs/structures/Collection.js +0 -115
  53. package/dist/cjs/structures/Guild.d.ts +0 -59
  54. package/dist/cjs/structures/Guild.js +0 -94
  55. package/dist/cjs/structures/GuildMember.d.ts +0 -174
  56. package/dist/cjs/structures/GuildMember.js +0 -311
  57. package/dist/cjs/structures/Interaction.d.ts +0 -245
  58. package/dist/cjs/structures/Interaction.js +0 -450
  59. package/dist/cjs/structures/Message.d.ts +0 -98
  60. package/dist/cjs/structures/Message.js +0 -195
  61. package/dist/cjs/structures/User.d.ts +0 -37
  62. package/dist/cjs/structures/User.js +0 -65
  63. package/dist/cjs/structures/index.d.ts +0 -7
  64. package/dist/cjs/structures/index.js +0 -25
  65. package/dist/cjs/structures.d.ts +0 -1
  66. package/dist/cjs/structures.js +0 -19
  67. package/dist/cjs/types.d.ts +0 -255
  68. package/dist/cjs/types.js +0 -3
  69. package/dist/cjs/utils/BitField.d.ts +0 -66
  70. package/dist/cjs/utils/BitField.js +0 -138
  71. package/dist/cjs/utils/Collection.d.ts +0 -116
  72. package/dist/cjs/utils/Collection.js +0 -265
  73. package/dist/cjs/utils/Collector.d.ts +0 -152
  74. package/dist/cjs/utils/Collector.js +0 -314
  75. package/dist/cjs/utils/DataResolver.d.ts +0 -61
  76. package/dist/cjs/utils/DataResolver.js +0 -146
  77. package/dist/cjs/utils/Formatters.d.ts +0 -145
  78. package/dist/cjs/utils/Formatters.js +0 -213
  79. package/dist/cjs/utils/IntentsBitField.d.ts +0 -85
  80. package/dist/cjs/utils/IntentsBitField.js +0 -99
  81. package/dist/cjs/utils/Partials.d.ts +0 -104
  82. package/dist/cjs/utils/Partials.js +0 -148
  83. package/dist/cjs/utils/PermissionsBitField.d.ts +0 -118
  84. package/dist/cjs/utils/PermissionsBitField.js +0 -145
  85. package/dist/cjs/utils/SnowflakeUtil.d.ts +0 -63
  86. package/dist/cjs/utils/SnowflakeUtil.js +0 -93
  87. package/dist/cjs/utils/Sweepers.d.ts +0 -119
  88. package/dist/cjs/utils/Sweepers.js +0 -249
  89. package/dist/cjs/utils/index.d.ts +0 -13
  90. package/dist/cjs/utils/index.js +0 -30
  91. package/dist/esm/Client.js +0 -634
  92. package/dist/esm/builders/ActionRowBuilder.js +0 -64
  93. package/dist/esm/builders/ButtonBuilder.js +0 -92
  94. package/dist/esm/builders/EmbedBuilder.js +0 -204
  95. package/dist/esm/builders/ModalBuilder.js +0 -157
  96. package/dist/esm/builders/SelectMenuBuilder.js +0 -161
  97. package/dist/esm/builders/SlashCommandBuilder.js +0 -311
  98. package/dist/esm/builders/index.js +0 -10
  99. package/dist/esm/enums.js +0 -208
  100. package/dist/esm/index.js +0 -34
  101. package/dist/esm/managers/BaseManager.js +0 -100
  102. package/dist/esm/managers/ChannelManager.js +0 -200
  103. package/dist/esm/managers/GuildMemberManager.js +0 -153
  104. package/dist/esm/managers/RoleManager.js +0 -203
  105. package/dist/esm/managers/index.js +0 -8
  106. package/dist/esm/rest/REST.js +0 -900
  107. package/dist/esm/rest/index.js +0 -2
  108. package/dist/esm/sharding/ShardingManager.js +0 -366
  109. package/dist/esm/sharding/index.js +0 -5
  110. package/dist/esm/structures/Channel.js +0 -232
  111. package/dist/esm/structures/Collection.js +0 -111
  112. package/dist/esm/structures/Guild.js +0 -90
  113. package/dist/esm/structures/GuildMember.js +0 -306
  114. package/dist/esm/structures/Interaction.js +0 -438
  115. package/dist/esm/structures/Message.js +0 -191
  116. package/dist/esm/structures/User.js +0 -61
  117. package/dist/esm/structures/index.js +0 -9
  118. package/dist/esm/structures.js +0 -3
  119. package/dist/esm/types.js +0 -2
  120. package/dist/esm/utils/BitField.js +0 -134
  121. package/dist/esm/utils/Collection.js +0 -261
  122. package/dist/esm/utils/Collector.js +0 -305
  123. package/dist/esm/utils/DataResolver.js +0 -142
  124. package/dist/esm/utils/Formatters.js +0 -191
  125. package/dist/esm/utils/IntentsBitField.js +0 -93
  126. package/dist/esm/utils/Partials.js +0 -137
  127. package/dist/esm/utils/PermissionsBitField.js +0 -141
  128. package/dist/esm/utils/SnowflakeUtil.js +0 -89
  129. package/dist/esm/utils/Sweepers.js +0 -245
  130. package/dist/esm/utils/index.js +0 -14
@@ -1,450 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ModalFields = exports.ModalSubmitInteraction = exports.SelectMenuInteraction = exports.ButtonInteraction = exports.AutocompleteInteraction = exports.CommandInteractionOptions = exports.CommandInteraction = exports.Interaction = void 0;
4
- exports.createInteraction = createInteraction;
5
- const enums_1 = require("../enums");
6
- const User_1 = require("./User");
7
- const GuildMember_1 = require("./GuildMember");
8
- const EmbedBuilder_1 = require("../builders/EmbedBuilder");
9
- /**
10
- * Base interaction class
11
- */
12
- class Interaction {
13
- /** Reference to the client */
14
- client;
15
- /** Interaction ID */
16
- id;
17
- /** Application ID */
18
- applicationId;
19
- /** Interaction type */
20
- type;
21
- /** Guild ID */
22
- guildId;
23
- /** Channel ID */
24
- channelId;
25
- /** Interaction token */
26
- token;
27
- /** User who triggered the interaction */
28
- user;
29
- /** Guild member (if in a guild) */
30
- member;
31
- /** Whether the interaction has been replied to */
32
- replied = false;
33
- /** Whether the interaction has been deferred */
34
- deferred = false;
35
- constructor(client, data) {
36
- this.client = client;
37
- // Handle both string and number IDs
38
- this.id = String(data.id);
39
- this.applicationId = String(data.application_id);
40
- this.type = data.type;
41
- this.guildId = data.guild_id ? String(data.guild_id) : undefined;
42
- this.channelId = data.channel_id ? String(data.channel_id) : undefined;
43
- this.token = data.token;
44
- // User can come from member.user or directly from user
45
- const userData = data.member?.user || data.user;
46
- this.user = userData ? new User_1.User(userData) : new User_1.User({ id: '0', username: 'Unknown' });
47
- // Create member if in guild
48
- if (data.member && this.guildId) {
49
- const guild = client.guilds.get(this.guildId) || { id: this.guildId, ownerId: null };
50
- this.member = new GuildMember_1.GuildMember(client, guild, data.member);
51
- }
52
- }
53
- /**
54
- * Check if this is a command interaction
55
- */
56
- isCommand() {
57
- return this.type === enums_1.InteractionType.ApplicationCommand;
58
- }
59
- /**
60
- * Check if this is an autocomplete interaction
61
- */
62
- isAutocomplete() {
63
- return this.type === enums_1.InteractionType.ApplicationCommandAutocomplete;
64
- }
65
- /**
66
- * Check if this is a modal submit interaction
67
- */
68
- isModalSubmit() {
69
- return this.type === enums_1.InteractionType.ModalSubmit;
70
- }
71
- /**
72
- * Check if this is a button interaction
73
- */
74
- isButton() {
75
- return this.type === enums_1.InteractionType.MessageComponent && this.componentType === 2;
76
- }
77
- /**
78
- * Check if this is a select menu interaction
79
- */
80
- isSelectMenu() {
81
- return this.type === enums_1.InteractionType.MessageComponent && this.componentType === 3;
82
- }
83
- /**
84
- * Reply to the interaction
85
- */
86
- async reply(options) {
87
- if (this.replied || this.deferred) {
88
- throw new Error('Interaction has already been replied to or deferred');
89
- }
90
- const content = typeof options === 'string' ? options : options.content;
91
- const rawEmbeds = typeof options === 'string' ? undefined : options.embeds;
92
- const components = typeof options === 'string' ? undefined : options.components;
93
- const ephemeral = typeof options === 'string' ? false : options.ephemeral;
94
- // Convert EmbedBuilder instances to plain objects
95
- const embeds = rawEmbeds?.map(e => e instanceof EmbedBuilder_1.EmbedBuilder ? e.toJSON() : e);
96
- await this.client.rest.createInteractionResponse(this.id, this.token, {
97
- type: enums_1.InteractionResponseType.ChannelMessageWithSource,
98
- data: {
99
- content,
100
- embeds,
101
- components,
102
- flags: ephemeral ? enums_1.MessageFlags.Ephemeral : 0
103
- }
104
- });
105
- this.replied = true;
106
- }
107
- /**
108
- * Defer the reply (shows "thinking...")
109
- */
110
- async deferReply(options) {
111
- if (this.replied || this.deferred) {
112
- throw new Error('Interaction has already been replied to or deferred');
113
- }
114
- await this.client.rest.createInteractionResponse(this.id, this.token, {
115
- type: enums_1.InteractionResponseType.DeferredChannelMessageWithSource,
116
- data: options?.ephemeral ? { flags: enums_1.MessageFlags.Ephemeral } : undefined
117
- });
118
- this.deferred = true;
119
- }
120
- /**
121
- * Edit the reply
122
- */
123
- async editReply(options) {
124
- const content = typeof options === 'string' ? options : options.content;
125
- const rawEmbeds = typeof options === 'string' ? undefined : options.embeds;
126
- const components = typeof options === 'string' ? undefined : options.components;
127
- const files = typeof options === 'string' ? undefined : options.files;
128
- // Convert EmbedBuilder instances to plain objects
129
- const embeds = rawEmbeds?.map(e => e instanceof EmbedBuilder_1.EmbedBuilder ? e.toJSON() : e);
130
- await this.client.rest.editInteractionResponse(this.token, {
131
- content,
132
- embeds,
133
- components,
134
- files
135
- }, this.guildId, this.channelId, this.id);
136
- }
137
- /**
138
- * Delete the reply
139
- */
140
- async deleteReply() {
141
- await this.client.rest.deleteInteractionResponse(this.token);
142
- }
143
- /**
144
- * Send a followup message
145
- */
146
- async followUp(options) {
147
- const content = typeof options === 'string' ? options : options.content;
148
- const rawEmbeds = typeof options === 'string' ? undefined : options.embeds;
149
- const ephemeral = typeof options === 'string' ? false : options.ephemeral;
150
- // Convert EmbedBuilder instances to plain objects
151
- const embeds = rawEmbeds?.map(e => e instanceof EmbedBuilder_1.EmbedBuilder ? e.toJSON() : e);
152
- await this.client.rest.createFollowup(this.token, {
153
- content,
154
- embeds,
155
- flags: ephemeral ? enums_1.MessageFlags.Ephemeral : 0
156
- });
157
- }
158
- }
159
- exports.Interaction = Interaction;
160
- /**
161
- * Command interaction
162
- */
163
- class CommandInteraction extends Interaction {
164
- /** Command name */
165
- commandName;
166
- /** Command options */
167
- options;
168
- constructor(client, data) {
169
- super(client, data);
170
- this.commandName = data.data?.name || '';
171
- this.options = new CommandInteractionOptions(data.data?.options || []);
172
- }
173
- /**
174
- * Show a modal
175
- */
176
- async showModal(modal) {
177
- const modalData = 'toJSON' in modal && typeof modal.toJSON === 'function' ? modal.toJSON() : modal;
178
- await this.client.rest.createInteractionResponse(this.id, this.token, {
179
- type: enums_1.InteractionResponseType.Modal,
180
- data: modalData
181
- });
182
- }
183
- }
184
- exports.CommandInteraction = CommandInteraction;
185
- /**
186
- * Command interaction options helper
187
- */
188
- class CommandInteractionOptions {
189
- options;
190
- constructor(options) {
191
- this.options = options;
192
- }
193
- /**
194
- * Get a string option
195
- */
196
- getString(name, required) {
197
- const option = this.options.find(o => o.name === name);
198
- if (!option && required)
199
- throw new Error(`Required option "${name}" not found`);
200
- return option?.value || null;
201
- }
202
- /**
203
- * Get an integer option
204
- */
205
- getInteger(name, required) {
206
- const option = this.options.find(o => o.name === name);
207
- if (!option && required)
208
- throw new Error(`Required option "${name}" not found`);
209
- return option?.value || null;
210
- }
211
- /**
212
- * Get a number option
213
- */
214
- getNumber(name, required) {
215
- return this.getInteger(name, required);
216
- }
217
- /**
218
- * Get a boolean option
219
- */
220
- getBoolean(name, required) {
221
- const option = this.options.find(o => o.name === name);
222
- if (!option && required)
223
- throw new Error(`Required option "${name}" not found`);
224
- return option?.value ?? null;
225
- }
226
- /**
227
- * Get a user option
228
- */
229
- getUser(name, required) {
230
- const option = this.options.find(o => o.name === name);
231
- if (!option && required)
232
- throw new Error(`Required option "${name}" not found`);
233
- return option?.value || null;
234
- }
235
- /**
236
- * Get a channel option
237
- */
238
- getChannel(name, required) {
239
- const option = this.options.find(o => o.name === name);
240
- if (!option && required)
241
- throw new Error(`Required option "${name}" not found`);
242
- return option?.value || null;
243
- }
244
- /**
245
- * Get a subcommand name
246
- */
247
- getSubcommand(required) {
248
- const option = this.options.find(o => o.type === 1);
249
- if (!option && required)
250
- throw new Error('Required subcommand not found');
251
- return option?.name || null;
252
- }
253
- /**
254
- * Get the focused option (for autocomplete)
255
- */
256
- getFocused() {
257
- const option = this.options.find(o => o.focused);
258
- if (!option)
259
- return null;
260
- return { name: option.name, value: option.value };
261
- }
262
- }
263
- exports.CommandInteractionOptions = CommandInteractionOptions;
264
- /**
265
- * Autocomplete interaction
266
- */
267
- class AutocompleteInteraction extends Interaction {
268
- /** Command name */
269
- commandName;
270
- /** Command options */
271
- options;
272
- constructor(client, data) {
273
- super(client, data);
274
- this.commandName = data.data?.name || '';
275
- this.options = new CommandInteractionOptions(data.data?.options || []);
276
- }
277
- /**
278
- * Respond with autocomplete choices
279
- */
280
- async respond(choices) {
281
- await this.client.rest.createInteractionResponse(this.id, this.token, {
282
- type: enums_1.InteractionResponseType.ApplicationCommandAutocompleteResult,
283
- data: { choices }
284
- });
285
- }
286
- }
287
- exports.AutocompleteInteraction = AutocompleteInteraction;
288
- /**
289
- * Button interaction
290
- */
291
- class ButtonInteraction extends Interaction {
292
- /** Button custom ID */
293
- customId;
294
- /** Component type (always 2 for buttons) */
295
- componentType = 2;
296
- /** Message the button is attached to */
297
- message;
298
- constructor(client, data) {
299
- super(client, data);
300
- this.customId = data.data?.custom_id || '';
301
- this.message = data.message;
302
- }
303
- /**
304
- * Update the message the button is attached to
305
- */
306
- async update(options) {
307
- // Convert EmbedBuilder instances to plain objects
308
- const embeds = options.embeds?.map(e => e instanceof EmbedBuilder_1.EmbedBuilder ? e.toJSON() : e);
309
- await this.client.rest.createInteractionResponse(this.id, this.token, {
310
- type: enums_1.InteractionResponseType.UpdateMessage,
311
- data: {
312
- content: options.content,
313
- embeds,
314
- components: options.components
315
- }
316
- });
317
- this.replied = true;
318
- }
319
- /**
320
- * Show a modal in response to this button interaction
321
- */
322
- async showModal(modal) {
323
- const modalData = 'toJSON' in modal && typeof modal.toJSON === 'function' ? modal.toJSON() : modal;
324
- await this.client.rest.createInteractionResponse(this.id, this.token, {
325
- type: enums_1.InteractionResponseType.Modal,
326
- data: modalData
327
- });
328
- }
329
- }
330
- exports.ButtonInteraction = ButtonInteraction;
331
- /**
332
- * Select menu interaction
333
- */
334
- class SelectMenuInteraction extends Interaction {
335
- /** Select menu custom ID */
336
- customId;
337
- /** Component type (always 3 for select menus) */
338
- componentType = 3;
339
- /** Selected values */
340
- values;
341
- /** Message the select menu is attached to */
342
- message;
343
- constructor(client, data) {
344
- super(client, data);
345
- this.customId = data.data?.custom_id || '';
346
- this.values = data.data?.values || [];
347
- this.message = data.message;
348
- }
349
- /**
350
- * Update the message the select menu is attached to
351
- */
352
- async update(options) {
353
- // Convert EmbedBuilder instances to plain objects
354
- const embeds = options.embeds?.map(e => e instanceof EmbedBuilder_1.EmbedBuilder ? e.toJSON() : e);
355
- await this.client.rest.createInteractionResponse(this.id, this.token, {
356
- type: enums_1.InteractionResponseType.UpdateMessage,
357
- data: {
358
- content: options.content,
359
- embeds,
360
- components: options.components
361
- }
362
- });
363
- this.replied = true;
364
- }
365
- /**
366
- * Show a modal in response to this select menu interaction
367
- */
368
- async showModal(modal) {
369
- const modalData = 'toJSON' in modal && typeof modal.toJSON === 'function' ? modal.toJSON() : modal;
370
- await this.client.rest.createInteractionResponse(this.id, this.token, {
371
- type: enums_1.InteractionResponseType.Modal,
372
- data: modalData
373
- });
374
- }
375
- }
376
- exports.SelectMenuInteraction = SelectMenuInteraction;
377
- /**
378
- * Modal submit interaction
379
- */
380
- class ModalSubmitInteraction extends Interaction {
381
- /** Modal custom ID */
382
- customId;
383
- /** Modal fields */
384
- fields;
385
- constructor(client, data) {
386
- super(client, data);
387
- this.customId = data.data?.custom_id || '';
388
- // Modal values come from components array (action rows containing text inputs)
389
- const components = data.data?.components || [];
390
- this.fields = new ModalFields(components);
391
- }
392
- }
393
- exports.ModalSubmitInteraction = ModalSubmitInteraction;
394
- /**
395
- * Modal fields helper
396
- */
397
- class ModalFields {
398
- fieldMap;
399
- constructor(components) {
400
- this.fieldMap = new Map();
401
- // Parse action rows → text inputs
402
- for (const row of components) {
403
- const innerComponents = row?.components || [];
404
- for (const comp of innerComponents) {
405
- if (comp.custom_id && comp.value !== undefined) {
406
- this.fieldMap.set(comp.custom_id, comp.value);
407
- }
408
- }
409
- }
410
- }
411
- /**
412
- * Get a text input value by custom_id
413
- */
414
- getTextInputValue(customId) {
415
- return this.fieldMap.get(customId) ?? null;
416
- }
417
- /**
418
- * Get a field (alias for getTextInputValue)
419
- */
420
- getField(customId) {
421
- const value = this.fieldMap.get(customId);
422
- return value !== undefined ? { value } : null;
423
- }
424
- }
425
- exports.ModalFields = ModalFields;
426
- /**
427
- * Create appropriate interaction class based on type
428
- */
429
- function createInteraction(client, data) {
430
- switch (data.type) {
431
- case enums_1.InteractionType.ApplicationCommand:
432
- return new CommandInteraction(client, data);
433
- case enums_1.InteractionType.ApplicationCommandAutocomplete:
434
- return new AutocompleteInteraction(client, data);
435
- case enums_1.InteractionType.ModalSubmit:
436
- return new ModalSubmitInteraction(client, data);
437
- case enums_1.InteractionType.MessageComponent:
438
- // component_type: 2 = Button, 3 = Select Menu
439
- if (data.data?.component_type === 2) {
440
- return new ButtonInteraction(client, data);
441
- }
442
- else if (data.data?.component_type === 3) {
443
- return new SelectMenuInteraction(client, data);
444
- }
445
- return new Interaction(client, data);
446
- default:
447
- return new Interaction(client, data);
448
- }
449
- }
450
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSW50ZXJhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc3RydWN0dXJlcy9JbnRlcmFjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUEwZkEsOENBbUJDO0FBNWdCRCxvQ0FBa0Y7QUFDbEYsaUNBQThCO0FBQzlCLCtDQUE0QztBQUM1QywyREFBd0Q7QUFHeEQ7O0dBRUc7QUFDSCxNQUFhLFdBQVc7SUFDdEIsOEJBQThCO0lBQ2QsTUFBTSxDQUFTO0lBRS9CLHFCQUFxQjtJQUNMLEVBQUUsQ0FBUztJQUUzQixxQkFBcUI7SUFDTCxhQUFhLENBQVM7SUFFdEMsdUJBQXVCO0lBQ1AsSUFBSSxDQUFrQjtJQUV0QyxlQUFlO0lBQ0MsT0FBTyxDQUFVO0lBRWpDLGlCQUFpQjtJQUNELFNBQVMsQ0FBVTtJQUVuQyx3QkFBd0I7SUFDUixLQUFLLENBQVM7SUFFOUIseUNBQXlDO0lBQ3pCLElBQUksQ0FBTztJQUUzQixtQ0FBbUM7SUFDbkIsTUFBTSxDQUFlO0lBRXJDLGtEQUFrRDtJQUMzQyxPQUFPLEdBQUcsS0FBSyxDQUFDO0lBRXZCLGdEQUFnRDtJQUN6QyxRQUFRLEdBQUcsS0FBSyxDQUFDO0lBRXhCLFlBQVksTUFBYyxFQUFFLElBQW9CO1FBQzlDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLG9DQUFvQztRQUNwQyxJQUFJLENBQUMsRUFBRSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ2pELElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztRQUN0QixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFD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O2dCQUNwQyxPQUFPLElBQUksaUJBQWlCLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQzdDLENBQUM7aUJBQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLGNBQWMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDM0MsT0FBTyxJQUFJLHFCQUFxQixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNqRCxDQUFDO1lBQ0QsT0FBTyxJQUFJLFdBQVcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDdkM7WUFDRSxPQUFPLElBQUksV0FBVyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN6QyxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFQSUludGVyYWN0aW9uLCBBUElJbnRlcmFjdGlvbk9wdGlvbiwgQVBJRW1iZWQgfSBmcm9tICcuLi90eXBlcyc7XHJcbmltcG9ydCB7IEludGVyYWN0aW9uVHlwZSwgSW50ZXJhY3Rpb25SZXNwb25zZVR5cGUsIE1lc3NhZ2VGbGFncyB9IGZyb20gJy4uL2VudW1zJztcclxuaW1wb3J0IHsgVXNlciB9IGZyb20gJy4vVXNlcic7XHJcbmltcG9ydCB7IEd1aWxkTWVtYmVyIH0gZnJvbSAnLi9HdWlsZE1lbWJlcic7XHJcbmltcG9ydCB7IEVtYmVkQnVpbGRlciB9IGZyb20gJy4uL2J1aWxkZXJzL0VtYmVkQnVpbGRlcic7XHJcbmltcG9ydCB0eXBlIHsgQ2xpZW50IH0gZnJvbSAnLi4vQ2xpZW50JztcclxuXHJcbi8qKlxyXG4gKiBCYXNlIGludGVyYWN0aW9uIGNsYXNzXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgSW50ZXJhY3Rpb24ge1xyXG4gIC8qKiBSZWZlcmVuY2UgdG8gdGhlIGNsaWVudCAqL1xyXG4gIHB1YmxpYyByZWFkb25seSBjbGllbnQ6IENsaWVudDtcclxuICBcclxuICAvKiogSW50ZXJhY3Rpb24gSUQgKi9cclxuICBwdWJsaWMgcmVhZG9ubHkgaWQ6IHN0cmluZztcclxuICBcclxuICAvKiogQXBwbGljYXRpb24gSUQgKi9cclxuICBwdWJsaWMgcmVhZG9ubHkgYXBwbGljYXRpb25JZDogc3RyaW5nO1xyXG4gIFxyXG4gIC8qKiBJbnRlcmFjdGlvbiB0eXBlICovXHJcbiAgcHVibGljIHJlYWRvbmx5IHR5cGU6IEludGVyYWN0aW9uVHlwZTtcclxuICBcclxuICAvKiogR3VpbGQgSUQgKi9cclxuICBwdWJsaWMgcmVhZG9ubHkgZ3VpbGRJZD86IHN0cmluZztcclxuICBcclxuICAvKiogQ2hhbm5lbCBJRCAqL1xyXG4gIHB1YmxpYyByZWFkb25seSBjaGFubmVsSWQ/OiBzdHJpbmc7XHJcbiAgXHJcbiAgLyoqIEludGVyYWN0aW9uIHRva2VuICovXHJcbiAgcHVibGljIHJlYWRvbmx5IHRva2VuOiBzdHJpbmc7XHJcbiAgXHJcbiAgLyoqIFVzZXIgd2hvIHRyaWdnZXJlZCB0aGUgaW50ZXJhY3Rpb24gKi9cclxuICBwdWJsaWMgcmVhZG9ubHkgdXNlcjogVXNlcjtcclxuICBcclxuICAvKiogR3VpbGQgbWVtYmVyIChpZiBpbiBhIGd1aWxkKSAqL1xyXG4gIHB1YmxpYyByZWFkb25seSBtZW1iZXI/OiBHdWlsZE1lbWJlcjtcclxuICBcclxuICAvKiogV2hldGhlciB0aGUgaW50ZXJhY3Rpb24gaGFzIGJlZW4gcmVwbGllZCB0byAqL1xyXG4gIHB1YmxpYyByZXBsaWVkID0gZmFsc2U7XHJcbiAgXHJcbiAgLyoqIFdoZXRoZXIgdGhlIGludGVyYWN0aW9uIGhhcyBiZWVuIGRlZmVycmVkICovXHJcbiAgcHVibGljIGRlZmVycmVkID0gZmFsc2U7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGNsaWVudDogQ2xpZW50LCBkYXRhOiBBUElJbnRlcmFjdGlvbikge1xyXG4gICAgdGhpcy5jbGllbnQgPSBjbGllbnQ7XHJcbiAgICAvLyBIYW5kbGUgYm90aCBzdHJpbmcgYW5kIG51bWJlciBJRHNcclxuICAgIHRoaXMuaWQgPSBTdHJpbmcoZGF0YS5pZCk7XHJcbiAgICB0aGlzLmFwcGxpY2F0aW9uSWQgPSBTdHJpbmcoZGF0YS5hcHBsaWNhdGlvbl9pZCk7XHJcbiAgICB0aGlzLnR5cGUgPSBkYXRhLnR5cGU7XHJcbiAgICB0aGlzLmd1aWxkSWQgPSBkYXRhLmd1aWxkX2lkID8gU3RyaW5nKGRhdGEuZ3VpbGRfaWQpIDogdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5jaGFubmVsSWQgPSBkYXRhLmNoYW5uZWxfaWQgPyBTdHJpbmcoZGF0YS5jaGFubmVsX2lkKSA6IHVuZGVmaW5lZDtcclxuICAgIHRoaXMudG9rZW4gPSBkYXRhLnRva2VuO1xyXG4gICAgXHJcbiAgICAvLyBVc2VyIGNhbiBjb21lIGZyb20gbWVtYmVyLnVzZXIgb3IgZGlyZWN0bHkgZnJvbSB1c2VyXHJcbiAgICBjb25zdCB1c2VyRGF0YSA9IGRhdGEubWVtYmVyPy51c2VyIHx8IGRhdGEudXNlcjtcclxuICAgIHRoaXMudXNlciA9IHVzZXJEYXRhID8gbmV3IFVzZXIodXNlckRhdGEpIDogbmV3IFVzZXIoeyBpZDogJzAnLCB1c2VybmFtZTogJ1Vua25vd24nIH0pO1xyXG4gICAgXHJcbiAgICAvLyBDcmVhdGUgbWVtYmVyIGlmIGluIGd1aWxkXHJcbiAgICBpZiAoZGF0YS5tZW1iZXIgJiYgdGhpcy5ndWlsZElkKSB7XHJcbiAgICAgIGNvbnN0IGd1aWxkID0gY2xpZW50Lmd1aWxkcy5nZXQodGhpcy5ndWlsZElkKSB8fCB7IGlkOiB0aGlzLmd1aWxkSWQsIG93bmVySWQ6IG51bGwgfSBhcyBhbnk7XHJcbiAgICAgIHRoaXMubWVtYmVyID0gbmV3IEd1aWxkTWVtYmVyKGNsaWVudCwgZ3VpbGQsIGRhdGEubWVtYmVyKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoZWNrIGlmIHRoaXMgaXMgYSBjb21tYW5kIGludGVyYWN0aW9uXHJcbiAgICovXHJcbiAgaXNDb21tYW5kKCk6IHRoaXMgaXMgQ29tbWFuZEludGVyYWN0aW9uIHtcclxuICAgIHJldHVybiB0aGlzLnR5cGUgPT09IEludGVyYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNvbW1hbmQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDaGVjayBpZiB0aGlzIGlzIGFuIGF1dG9jb21wbGV0ZSBpbnRlcmFjdGlvblxyXG4gICAqL1xyXG4gIGlzQXV0b2NvbXBsZXRlKCk6IHRoaXMgaXMgQXV0b2NvbXBsZXRlSW50ZXJhY3Rpb24ge1xyXG4gICAgcmV0dXJuIHRoaXMudHlwZSA9PT0gSW50ZXJhY3Rpb25UeXBlLkFwcGxpY2F0aW9uQ29tbWFuZEF1dG9jb21wbGV0ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoZWNrIGlmIHRoaXMgaXMgYSBtb2RhbCBzdWJtaXQgaW50ZXJhY3Rpb25cclxuICAgKi9cclxuICBpc01vZGFsU3VibWl0KCk6IHRoaXMgaXMgTW9kYWxTdWJtaXRJbnRlcmFjdGlvbiB7XHJcbiAgICByZXR1cm4gdGhpcy50eXBlID09PSBJbnRlcmFjdGlvblR5cGUuTW9kYWxTdWJtaXQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDaGVjayBpZiB0aGlzIGlzIGEgYnV0dG9uIGludGVyYWN0aW9uXHJcbiAgICovXHJcbiAgaXNCdXR0b24oKTogdGhpcyBpcyBCdXR0b25JbnRlcmFjdGlvbiB7XHJcbiAgICByZXR1cm4gdGhpcy50eXBlID09PSBJbnRlcmFjdGlvblR5cGUuTWVzc2FnZUNvbXBvbmVudCAmJiAodGhpcyBhcyBhbnkpLmNvbXBvbmVudFR5cGUgPT09IDI7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDaGVjayBpZiB0aGlzIGlzIGEgc2VsZWN0IG1lbnUgaW50ZXJhY3Rpb25cclxuICAgKi9cclxuICBpc1NlbGVjdE1lbnUoKTogdGhpcyBpcyBTZWxlY3RNZW51SW50ZXJhY3Rpb24ge1xyXG4gICAgcmV0dXJuIHRoaXMudHlwZSA9PT0gSW50ZXJhY3Rpb25UeXBlLk1lc3NhZ2VDb21wb25lbnQgJiYgKHRoaXMgYXMgYW55KS5jb21wb25lbnRUeXBlID09PSAzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVwbHkgdG8gdGhlIGludGVyYWN0aW9uXHJcbiAgICovXHJcbiAgYXN5bmMgcmVwbHkob3B0aW9uczogc3RyaW5nIHwgSW50ZXJhY3Rpb25SZXBseU9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICh0aGlzLnJlcGxpZWQgfHwgdGhpcy5kZWZlcnJlZCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludGVyYWN0aW9uIGhhcyBhbHJlYWR5IGJlZW4gcmVwbGllZCB0byBvciBkZWZlcnJlZCcpO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBjb25zdCBjb250ZW50ID0gdHlwZW9mIG9wdGlvbnMgPT09ICdzdHJpbmcnID8gb3B0aW9ucyA6IG9wdGlvbnMuY29udGVudDtcclxuICAgIGNvbnN0IHJhd0VtYmVkcyA9IHR5cGVvZiBvcHRpb25zID09PSAnc3RyaW5nJyA/IHVuZGVmaW5lZCA6IG9wdGlvbnMuZW1iZWRzO1xyXG4gICAgY29uc3QgY29tcG9uZW50cyA9IHR5cGVvZiBvcHRpb25zID09PSAnc3RyaW5nJyA/IHVuZGVmaW5lZCA6IG9wdGlvbnMuY29tcG9uZW50cztcclxuICAgIGNvbnN0IGVwaGVtZXJhbCA9IHR5cGVvZiBvcHRpb25zID09PSAnc3RyaW5nJyA/IGZhbHNlIDogb3B0aW9ucy5lcGhlbWVyYWw7XHJcbiAgICBcclxuICAgIC8vIENvbnZlcnQgRW1iZWRCdWlsZGVyIGluc3RhbmNlcyB0byBwbGFpbiBvYmplY3RzXHJcbiAgICBjb25zdCBlbWJlZHMgPSByYXdFbWJlZHM/Lm1hcChlID0+IGUgaW5zdGFuY2VvZiBFbWJlZEJ1aWxkZXIgPyBlLnRvSlNPTigpIDogZSk7XHJcbiAgICBcclxuICAgIGF3YWl0IHRoaXMuY2xpZW50LnJlc3QuY3JlYXRlSW50ZXJhY3Rpb25SZXNwb25zZSh0aGlzLmlkLCB0aGlzLnRva2VuLCB7XHJcbiAgICAgIHR5cGU6IEludGVyYWN0aW9uUmVzcG9uc2VUeXBlLkNoYW5uZWxNZXNzYWdlV2l0aFNvdXJjZSxcclxuICAgICAgZGF0YToge1xyXG4gICAgICAgIGNvbnRlbnQsXHJcbiAgICAgICAgZW1iZWRzLFxyXG4gICAgICAgIGNvbXBvbmVudHMsXHJcbiAgICAgICAgZmxhZ3M6IGVwaGVtZXJhbCA/IE1lc3NhZ2VGbGFncy5FcGhlbWVyYWwgOiAwXHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgXHJcbiAgICB0aGlzLnJlcGxpZWQgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGVmZXIgdGhlIHJlcGx5IChzaG93cyBcInRoaW5raW5nLi4uXCIpXHJcbiAgICovXHJcbiAgYXN5bmMgZGVmZXJSZXBseShvcHRpb25zPzogeyBlcGhlbWVyYWw/OiBib29sZWFuIH0pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICh0aGlzLnJlcGxpZWQgfHwgdGhpcy5kZWZlcnJlZCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludGVyYWN0aW9uIGhhcyBhbHJlYWR5IGJlZW4gcmVwbGllZCB0byBvciBkZWZlcnJlZCcpO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBhd2FpdCB0aGlzLmNsaWVudC5yZXN0LmNyZWF0ZUludGVyYWN0aW9uUmVzcG9uc2UodGhpcy5pZCwgdGhpcy50b2tlbiwge1xyXG4gICAgICB0eXBlOiBJbnRlcmFjdGlvblJlc3BvbnNlVHlwZS5EZWZlcnJlZENoYW5uZWxNZXNzYWdlV2l0aFNvdXJjZSxcclxuICAgICAgZGF0YTogb3B0aW9ucz8uZXBoZW1lcmFsID8geyBmbGFnczogTWVzc2FnZUZsYWdzLkVwaGVtZXJhbCB9IDogdW5kZWZpbmVkXHJcbiAgICB9KTtcclxuICAgIFxyXG4gICAgdGhpcy5kZWZlcnJlZCA9IHRydWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFZGl0IHRoZSByZXBseVxyXG4gICAqL1xyXG4gIGFzeW5jIGVkaXRSZXBseShvcHRpb25zOiBzdHJpbmcgfCBJbnRlcmFjdGlvblJlcGx5T3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgY29udGVudCA9IHR5cGVvZiBvcHRpb25zID09PSAnc3RyaW5nJyA/IG9wdGlvbnMgOiBvcHRpb25zLmNvbnRlbnQ7XHJcbiAgICBjb25zdCByYXdFbWJlZHMgPSB0eXBlb2Ygb3B0aW9ucyA9PT0gJ3N0cmluZycgPyB1bmRlZmluZWQgOiBvcHRpb25zLmVtYmVkcztcclxuICAgIGNvbnN0IGNvbXBvbmVudHMgPSB0eXBlb2Ygb3B0aW9ucyA9PT0gJ3N0cmluZycgPyB1bmRlZmluZWQgOiBvcHRpb25zLmNvbXBvbmVudHM7XHJcbiAgICBjb25zdCBmaWxlcyA9IHR5cGVvZiBvcHRpb25zID09PSAnc3RyaW5nJyA/IHVuZGVmaW5lZCA6IG9wdGlvbnMuZmlsZXM7XHJcbiAgICBcclxuICAgIC8vIENvbnZlcnQgRW1iZWRCdWlsZGVyIGluc3RhbmNlcyB0byBwbGFpbiBvYmplY3RzXHJcbiAgICBjb25zdCBlbWJlZHMgPSByYXdFbWJlZHM/Lm1hcChlID0+IGUgaW5zdGFuY2VvZiBFbWJlZEJ1aWxkZXIgPyBlLnRvSlNPTigpIDogZSk7XHJcbiAgICBcclxuICAgIGF3YWl0IHRoaXMuY2xpZW50LnJlc3QuZWRpdEludGVyYWN0aW9uUmVzcG9uc2UodGhpcy50b2tlbiwge1xyXG4gICAgICBjb250ZW50LFxyXG4gICAgICBlbWJlZHMsXHJcbiAgICAgIGNvbXBvbmVudHMsXHJcbiAgICAgIGZpbGVzXHJcbiAgICB9LCB0aGlzLmd1aWxkSWQsIHRoaXMuY2hhbm5lbElkLCB0aGlzLmlkKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERlbGV0ZSB0aGUgcmVwbHlcclxuICAgKi9cclxuICBhc3luYyBkZWxldGVSZXBseSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGF3YWl0IHRoaXMuY2xpZW50LnJlc3QuZGVsZXRlSW50ZXJhY3Rpb25SZXNwb25zZSh0aGlzLnRva2VuKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNlbmQgYSBmb2xsb3d1cCBtZXNzYWdlXHJcbiAgICovXHJcbiAgYXN5bmMgZm9sbG93VXAob3B0aW9uczogc3RyaW5nIHwgSW50ZXJhY3Rpb25SZXBseU9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IGNvbnRlbnQgPSB0eXBlb2Ygb3B0aW9ucyA9PT0gJ3N0cmluZycgPyBvcHRpb25zIDogb3B0aW9ucy5jb250ZW50O1xyXG4gICAgY29uc3QgcmF3RW1iZWRzID0gdHlwZW9mIG9wdGlvbnMgPT09ICdzdHJpbmcnID8gdW5kZWZpbmVkIDogb3B0aW9ucy5lbWJlZHM7XHJcbiAgICBjb25zdCBlcGhlbWVyYWwgPSB0eXBlb2Ygb3B0aW9ucyA9PT0gJ3N0cmluZycgPyBmYWxzZSA6IG9wdGlvbnMuZXBoZW1lcmFsO1xyXG4gICAgXHJcbiAgICAvLyBDb252ZXJ0IEVtYmVkQnVpbGRlciBpbnN0YW5jZXMgdG8gcGxhaW4gb2JqZWN0c1xyXG4gICAgY29uc3QgZW1iZWRzID0gcmF3RW1iZWRzPy5tYXAoZSA9PiBlIGluc3RhbmNlb2YgRW1iZWRCdWlsZGVyID8gZS50b0pTT04oKSA6IGUpO1xyXG4gICAgXHJcbiAgICBhd2FpdCB0aGlzLmNsaWVudC5yZXN0LmNyZWF0ZUZvbGxvd3VwKHRoaXMudG9rZW4sIHtcclxuICAgICAgY29udGVudCxcclxuICAgICAgZW1iZWRzLFxyXG4gICAgICBmbGFnczogZXBoZW1lcmFsID8gTWVzc2FnZUZsYWdzLkVwaGVtZXJhbCA6IDBcclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIENvbW1hbmQgaW50ZXJhY3Rpb25cclxuICovXHJcbmV4cG9ydCBjbGFzcyBDb21tYW5kSW50ZXJhY3Rpb24gZXh0ZW5kcyBJbnRlcmFjdGlvbiB7XHJcbiAgLyoqIENvbW1hbmQgbmFtZSAqL1xyXG4gIHB1YmxpYyByZWFkb25seSBjb21tYW5kTmFtZTogc3RyaW5nO1xyXG4gIFxyXG4gIC8qKiBDb21tYW5kIG9wdGlvbnMgKi9cclxuICBwdWJsaWMgcmVhZG9ubHkgb3B0aW9uczogQ29tbWFuZEludGVyYWN0aW9uT3B0aW9ucztcclxuXHJcbiAgY29uc3RydWN0b3IoY2xpZW50OiBDbGllbnQsIGRhdGE6IEFQSUludGVyYWN0aW9uKSB7XHJcbiAgICBzdXBlcihjbGllbnQsIGRhdGEpO1xyXG4gICAgdGhpcy5jb21tYW5kTmFtZSA9IGRhdGEuZGF0YT8ubmFtZSB8fCAnJztcclxuICAgIHRoaXMub3B0aW9ucyA9IG5ldyBDb21tYW5kSW50ZXJhY3Rpb25PcHRpb25zKGRhdGEuZGF0YT8ub3B0aW9ucyB8fCBbXSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTaG93IGEgbW9kYWxcclxuICAgKi9cclxuICBhc3luYyBzaG93TW9kYWwobW9kYWw6IE1vZGFsRGF0YSB8IHsgdG9KU09OKCk6IE1vZGFsRGF0YSB9KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBtb2RhbERhdGEgPSAndG9KU09OJyBpbiBtb2RhbCAmJiB0eXBlb2YgbW9kYWwudG9KU09OID09PSAnZnVuY3Rpb24nID8gbW9kYWwudG9KU09OKCkgOiBtb2RhbDtcclxuICAgIGF3YWl0IHRoaXMuY2xpZW50LnJlc3QuY3JlYXRlSW50ZXJhY3Rpb25SZXNwb25zZSh0aGlzLmlkLCB0aGlzLnRva2VuLCB7XHJcbiAgICAgIHR5cGU6IEludGVyYWN0aW9uUmVzcG9uc2VUeXBlLk1vZGFsLFxyXG4gICAgICBkYXRhOiBtb2RhbERhdGFcclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIENvbW1hbmQgaW50ZXJhY3Rpb24gb3B0aW9ucyBoZWxwZXJcclxuICovXHJcbmV4cG9ydCBjbGFzcyBDb21tYW5kSW50ZXJhY3Rpb25PcHRpb25zIHtcclxuICBwcml2YXRlIG9wdGlvbnM6IEFQSUludGVyYWN0aW9uT3B0aW9uW107XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IEFQSUludGVyYWN0aW9uT3B0aW9uW10pIHtcclxuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgYSBzdHJpbmcgb3B0aW9uXHJcbiAgICovXHJcbiAgZ2V0U3RyaW5nKG5hbWU6IHN0cmluZywgcmVxdWlyZWQ/OiBib29sZWFuKTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgICBjb25zdCBvcHRpb24gPSB0aGlzLm9wdGlvbnMuZmluZChvID0+IG8ubmFtZSA9PT0gbmFtZSk7XHJcbiAgICBpZiAoIW9wdGlvbiAmJiByZXF1aXJlZCkgdGhyb3cgbmV3IEVycm9yKGBSZXF1aXJlZCBvcHRpb24gXCIke25hbWV9XCIgbm90IGZvdW5kYCk7XHJcbiAgICByZXR1cm4gb3B0aW9uPy52YWx1ZSBhcyBzdHJpbmcgfHwgbnVsbDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBhbiBpbnRlZ2VyIG9wdGlvblxyXG4gICAqL1xyXG4gIGdldEludGVnZXIobmFtZTogc3RyaW5nLCByZXF1aXJlZD86IGJvb2xlYW4pOiBudW1iZXIgfCBudWxsIHtcclxuICAgIGNvbnN0IG9wdGlvbiA9IHRoaXMub3B0aW9ucy5maW5kKG8gPT4gby5uYW1lID09PSBuYW1lKTtcclxuICAgIGlmICghb3B0aW9uICYmIHJlcXVpcmVkKSB0aHJvdyBuZXcgRXJyb3IoYFJlcXVpcmVkIG9wdGlvbiBcIiR7bmFtZX1cIiBub3QgZm91bmRgKTtcclxuICAgIHJldHVybiBvcHRpb24/LnZhbHVlIGFzIG51bWJlciB8fCBudWxsO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IGEgbnVtYmVyIG9wdGlvblxyXG4gICAqL1xyXG4gIGdldE51bWJlcihuYW1lOiBzdHJpbmcsIHJlcXVpcmVkPzogYm9vbGVhbik6IG51bWJlciB8IG51bGwge1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0SW50ZWdlcihuYW1lLCByZXF1aXJlZCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgYSBib29sZWFuIG9wdGlvblxyXG4gICAqL1xyXG4gIGdldEJvb2xlYW4obmFtZTogc3RyaW5nLCByZXF1aXJlZD86IGJvb2xlYW4pOiBib29sZWFuIHwgbnVsbCB7XHJcbiAgICBjb25zdCBvcHRpb24gPSB0aGlzLm9wdGlvbnMuZmluZChvID0+IG8ubmFtZSA9PT0gbmFtZSk7XHJcbiAgICBpZiAoIW9wdGlvbiAmJiByZXF1aXJlZCkgdGhyb3cgbmV3IEVycm9yKGBSZXF1aXJlZCBvcHRpb24gXCIke25hbWV9XCIgbm90IGZvdW5kYCk7XHJcbiAgICByZXR1cm4gb3B0aW9uPy52YWx1ZSBhcyBib29sZWFuID8/IG51bGw7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgYSB1c2VyIG9wdGlvblxyXG4gICAqL1xyXG4gIGdldFVzZXIobmFtZTogc3RyaW5nLCByZXF1aXJlZD86IGJvb2xlYW4pOiBzdHJpbmcgfCBudWxsIHtcclxuICAgIGNvbnN0IG9wdGlvbiA9IHRoaXMub3B0aW9ucy5maW5kKG8gPT4gby5uYW1lID09PSBuYW1lKTtcclxuICAgIGlmICghb3B0aW9uICYmIHJlcXVpcmVkKSB0aHJvdyBuZXcgRXJyb3IoYFJlcXVpcmVkIG9wdGlvbiBcIiR7bmFtZX1cIiBub3QgZm91bmRgKTtcclxuICAgIHJldHVybiBvcHRpb24/LnZhbHVlIGFzIHN0cmluZyB8fCBudWxsO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IGEgY2hhbm5lbCBvcHRpb25cclxuICAgKi9cclxuICBnZXRDaGFubmVsKG5hbWU6IHN0cmluZywgcmVxdWlyZWQ/OiBib29sZWFuKTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgICBjb25zdCBvcHRpb24gPSB0aGlzLm9wdGlvbnMuZmluZChvID0+IG8ubmFtZSA9PT0gbmFtZSk7XHJcbiAgICBpZiAoIW9wdGlvbiAmJiByZXF1aXJlZCkgdGhyb3cgbmV3IEVycm9yKGBSZXF1aXJlZCBvcHRpb24gXCIke25hbWV9XCIgbm90IGZvdW5kYCk7XHJcbiAgICByZXR1cm4gb3B0aW9uPy52YWx1ZSBhcyBzdHJpbmcgfHwgbnVsbDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBhIHN1YmNvbW1hbmQgbmFtZVxyXG4gICAqL1xyXG4gIGdldFN1YmNvbW1hbmQocmVxdWlyZWQ/OiBib29sZWFuKTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgICBjb25zdCBvcHRpb24gPSB0aGlzLm9wdGlvbnMuZmluZChvID0+IG8udHlwZSA9PT0gMSk7XHJcbiAgICBpZiAoIW9wdGlvbiAmJiByZXF1aXJlZCkgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBzdWJjb21tYW5kIG5vdCBmb3VuZCcpO1xyXG4gICAgcmV0dXJuIG9wdGlvbj8ubmFtZSB8fCBudWxsO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IHRoZSBmb2N1c2VkIG9wdGlvbiAoZm9yIGF1dG9jb21wbGV0ZSlcclxuICAgKi9cclxuICBnZXRGb2N1c2VkKCk6IHsgbmFtZTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH0gfCBudWxsIHtcclxuICAgIGNvbnN0IG9wdGlvbiA9IHRoaXMub3B0aW9ucy5maW5kKG8gPT4gby5mb2N1c2VkKTtcclxuICAgIGlmICghb3B0aW9uKSByZXR1cm4gbnVsbDtcclxuICAgIHJldHVybiB7IG5hbWU6IG9wdGlvbi5uYW1lLCB2YWx1ZTogb3B0aW9uLnZhbHVlIGFzIHN0cmluZyB9O1xyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIEF1dG9jb21wbGV0ZSBpbnRlcmFjdGlvblxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIEF1dG9jb21wbGV0ZUludGVyYWN0aW9uIGV4dGVuZHMgSW50ZXJhY3Rpb24ge1xyXG4gIC8qKiBDb21tYW5kIG5hbWUgKi9cclxuICBwdWJsaWMgcmVhZG9ubHkgY29tbWFuZE5hbWU6IHN0cmluZztcclxuICBcclxuICAvKiogQ29tbWFuZCBvcHRpb25zICovXHJcbiAgcHVibGljIHJlYWRvbmx5IG9wdGlvbnM6IENvbW1hbmRJbnRlcmFjdGlvbk9wdGlvbnM7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGNsaWVudDogQ2xpZW50LCBkYXRhOiBBUElJbnRlcmFjdGlvbikge1xyXG4gICAgc3VwZXIoY2xpZW50LCBkYXRhKTtcclxuICAgIHRoaXMuY29tbWFuZE5hbWUgPSBkYXRhLmRhdGE/Lm5hbWUgfHwgJyc7XHJcbiAgICB0aGlzLm9wdGlvbnMgPSBuZXcgQ29tbWFuZEludGVyYWN0aW9uT3B0aW9ucyhkYXRhLmRhdGE/Lm9wdGlvbnMgfHwgW10pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVzcG9uZCB3aXRoIGF1dG9jb21wbGV0ZSBjaG9pY2VzXHJcbiAgICovXHJcbiAgYXN5bmMgcmVzcG9uZChjaG9pY2VzOiBBdXRvY29tcGxldGVDaG9pY2VbXSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgYXdhaXQgdGhpcy5jbGllbnQucmVzdC5jcmVhdGVJbnRlcmFjdGlvblJlc3BvbnNlKHRoaXMuaWQsIHRoaXMudG9rZW4sIHtcclxuICAgICAgdHlwZTogSW50ZXJhY3Rpb25SZXNwb25zZVR5cGUuQXBwbGljYXRpb25Db21tYW5kQXV0b2NvbXBsZXRlUmVzdWx0LFxyXG4gICAgICBkYXRhOiB7IGNob2ljZXMgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogQnV0dG9uIGludGVyYWN0aW9uXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgQnV0dG9uSW50ZXJhY3Rpb24gZXh0ZW5kcyBJbnRlcmFjdGlvbiB7XHJcbiAgLyoqIEJ1dHRvbiBjdXN0b20gSUQgKi9cclxuICBwdWJsaWMgcmVhZG9ubHkgY3VzdG9tSWQ6IHN0cmluZztcclxuICBcclxuICAvKiogQ29tcG9uZW50IHR5cGUgKGFsd2F5cyAyIGZvciBidXR0b25zKSAqL1xyXG4gIHB1YmxpYyByZWFkb25seSBjb21wb25lbnRUeXBlOiBudW1iZXIgPSAyO1xyXG4gIFxyXG4gIC8qKiBNZXNzYWdlIHRoZSBidXR0b24gaXMgYXR0YWNoZWQgdG8gKi9cclxuICBwdWJsaWMgcmVhZG9ubHkgbWVzc2FnZT86IGFueTtcclxuXHJcbiAgY29uc3RydWN0b3IoY2xpZW50OiBDbGllbnQsIGRhdGE6IEFQSUludGVyYWN0aW9uKSB7XHJcbiAgICBzdXBlcihjbGllbnQsIGRhdGEpO1xyXG4gICAgdGhpcy5jdXN0b21JZCA9IGRhdGEuZGF0YT8uY3VzdG9tX2lkIHx8ICcnO1xyXG4gICAgdGhpcy5tZXNzYWdlID0gZGF0YS5tZXNzYWdlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVXBkYXRlIHRoZSBtZXNzYWdlIHRoZSBidXR0b24gaXMgYXR0YWNoZWQgdG9cclxuICAgKi9cclxuICBhc3luYyB1cGRhdGUob3B0aW9uczogSW50ZXJhY3Rpb25SZXBseU9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIC8vIENvbnZlcnQgRW1iZWRCdWlsZGVyIGluc3RhbmNlcyB0byBwbGFpbiBvYmplY3RzXHJcbiAgICBjb25zdCBlbWJlZHMgPSBvcHRpb25zLmVtYmVkcz8ubWFwKGUgPT4gZSBpbnN0YW5jZW9mIEVtYmVkQnVpbGRlciA/IGUudG9KU09OKCkgOiBlKTtcclxuICAgIFxyXG4gICAgYXdhaXQgdGhpcy5jbGllbnQucmVzdC5jcmVhdGVJbnRlcmFjdGlvblJlc3BvbnNlKHRoaXMuaWQsIHRoaXMudG9rZW4sIHtcclxuICAgICAgdHlwZTogSW50ZXJhY3Rpb25SZXNwb25zZVR5cGUuVXBkYXRlTWVzc2FnZSxcclxuICAgICAgZGF0YToge1xyXG4gICAgICAgIGNvbnRlbnQ6IG9wdGlvbnMuY29udGVudCxcclxuICAgICAgICBlbWJlZHMsXHJcbiAgICAgICAgY29tcG9uZW50czogb3B0aW9ucy5jb21wb25lbnRzXHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5yZXBsaWVkID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNob3cgYSBtb2RhbCBpbiByZXNwb25zZSB0byB0aGlzIGJ1dHRvbiBpbnRlcmFjdGlvblxyXG4gICAqL1xyXG4gIGFzeW5jIHNob3dNb2RhbChtb2RhbDogTW9kYWxEYXRhIHwgeyB0b0pTT04oKTogTW9kYWxEYXRhIH0pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IG1vZGFsRGF0YSA9ICd0b0pTT04nIGluIG1vZGFsICYmIHR5cGVvZiBtb2RhbC50b0pTT04gPT09ICdmdW5jdGlvbicgPyBtb2RhbC50b0pTT04oKSA6IG1vZGFsO1xyXG4gICAgYXdhaXQgdGhpcy5jbGllbnQucmVzdC5jcmVhdGVJbnRlcmFjdGlvblJlc3BvbnNlKHRoaXMuaWQsIHRoaXMudG9rZW4sIHtcclxuICAgICAgdHlwZTogSW50ZXJhY3Rpb25SZXNwb25zZVR5cGUuTW9kYWwsXHJcbiAgICAgIGRhdGE6IG1vZGFsRGF0YVxyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogU2VsZWN0IG1lbnUgaW50ZXJhY3Rpb25cclxuICovXHJcbmV4cG9ydCBjbGFzcyBTZWxlY3RNZW51SW50ZXJhY3Rpb24gZXh0ZW5kcyBJbnRlcmFjdGlvbiB7XHJcbiAgLyoqIFNlbGVjdCBtZW51IGN1c3RvbSBJRCAqL1xyXG4gIHB1YmxpYyByZWFkb25seSBjdXN0b21JZDogc3RyaW5nO1xyXG4gIFxyXG4gIC8qKiBDb21wb25lbnQgdHlwZSAoYWx3YXlzIDMgZm9yIHNlbGVjdCBtZW51cykgKi9cclxuICBwdWJsaWMgcmVhZG9ubHkgY29tcG9uZW50VHlwZTogbnVtYmVyID0gMztcclxuICBcclxuICAvKiogU2VsZWN0ZWQgdmFsdWVzICovXHJcbiAgcHVibGljIHJlYWRvbmx5IHZhbHVlczogc3RyaW5nW107XHJcbiAgXHJcbiAgLyoqIE1lc3NhZ2UgdGhlIHNlbGVjdCBtZW51IGlzIGF0dGFjaGVkIHRvICovXHJcbiAgcHVibGljIHJlYWRvbmx5IG1lc3NhZ2U/OiBhbnk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGNsaWVudDogQ2xpZW50LCBkYXRhOiBBUElJbnRlcmFjdGlvbikge1xyXG4gICAgc3VwZXIoY2xpZW50LCBkYXRhKTtcclxuICAgIHRoaXMuY3VzdG9tSWQgPSBkYXRhLmRhdGE/LmN1c3RvbV9pZCB8fCAnJztcclxuICAgIHRoaXMudmFsdWVzID0gZGF0YS5kYXRhPy52YWx1ZXMgfHwgW107XHJcbiAgICB0aGlzLm1lc3NhZ2UgPSBkYXRhLm1lc3NhZ2U7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVcGRhdGUgdGhlIG1lc3NhZ2UgdGhlIHNlbGVjdCBtZW51IGlzIGF0dGFjaGVkIHRvXHJcbiAgICovXHJcbiAgYXN5bmMgdXBkYXRlKG9wdGlvbnM6IEludGVyYWN0aW9uUmVwbHlPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAvLyBDb252ZXJ0IEVtYmVkQnVpbGRlciBpbnN0YW5jZXMgdG8gcGxhaW4gb2JqZWN0c1xyXG4gICAgY29uc3QgZW1iZWRzID0gb3B0aW9ucy5lbWJlZHM/Lm1hcChlID0+IGUgaW5zdGFuY2VvZiBFbWJlZEJ1aWxkZXIgPyBlLnRvSlNPTigpIDogZSk7XHJcbiAgICBcclxuICAgIGF3YWl0IHRoaXMuY2xpZW50LnJlc3QuY3JlYXRlSW50ZXJhY3Rpb25SZXNwb25zZSh0aGlzLmlkLCB0aGlzLnRva2VuLCB7XHJcbiAgICAgIHR5cGU6IEludGVyYWN0aW9uUmVzcG9uc2VUeXBlLlVwZGF0ZU1lc3NhZ2UsXHJcbiAgICAgIGRhdGE6IHtcclxuICAgICAgICBjb250ZW50OiBvcHRpb25zLmNvbnRlbnQsXHJcbiAgICAgICAgZW1iZWRzLFxyXG4gICAgICAgIGNvbXBvbmVudHM6IG9wdGlvbnMuY29tcG9uZW50c1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMucmVwbGllZCA9IHRydWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTaG93IGEgbW9kYWwgaW4gcmVzcG9uc2UgdG8gdGhpcyBzZWxlY3QgbWVudSBpbnRlcmFjdGlvblxyXG4gICAqL1xyXG4gIGFzeW5jIHNob3dNb2RhbChtb2RhbDogTW9kYWxEYXRhIHwgeyB0b0pTT04oKTogTW9kYWxEYXRhIH0pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IG1vZGFsRGF0YSA9ICd0b0pTT04nIGluIG1vZGFsICYmIHR5cGVvZiBtb2RhbC50b0pTT04gPT09ICdmdW5jdGlvbicgPyBtb2RhbC50b0pTT04oKSA6IG1vZGFsO1xyXG4gICAgYXdhaXQgdGhpcy5jbGllbnQucmVzdC5jcmVhdGVJbnRlcmFjdGlvblJlc3BvbnNlKHRoaXMuaWQsIHRoaXMudG9rZW4sIHtcclxuICAgICAgdHlwZTogSW50ZXJhY3Rpb25SZXNwb25zZVR5cGUuTW9kYWwsXHJcbiAgICAgIGRhdGE6IG1vZGFsRGF0YVxyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogTW9kYWwgc3VibWl0IGludGVyYWN0aW9uXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgTW9kYWxTdWJtaXRJbnRlcmFjdGlvbiBleHRlbmRzIEludGVyYWN0aW9uIHtcclxuICAvKiogTW9kYWwgY3VzdG9tIElEICovXHJcbiAgcHVibGljIHJlYWRvbmx5IGN1c3RvbUlkOiBzdHJpbmc7XHJcbiAgXHJcbiAgLyoqIE1vZGFsIGZpZWxkcyAqL1xyXG4gIHB1YmxpYyByZWFkb25seSBmaWVsZHM6IE1vZGFsRmllbGRzO1xyXG5cclxuICBjb25zdHJ1Y3RvcihjbGllbnQ6IENsaWVudCwgZGF0YTogQVBJSW50ZXJhY3Rpb24pIHtcclxuICAgIHN1cGVyKGNsaWVudCwgZGF0YSk7XHJcbiAgICB0aGlzLmN1c3RvbUlkID0gZGF0YS5kYXRhPy5jdXN0b21faWQgfHwgJyc7XHJcbiAgICAvLyBNb2RhbCB2YWx1ZXMgY29tZSBmcm9tIGNvbXBvbmVudHMgYXJyYXkgKGFjdGlvbiByb3dzIGNvbnRhaW5pbmcgdGV4dCBpbnB1dHMpXHJcbiAgICBjb25zdCBjb21wb25lbnRzID0gKGRhdGEuZGF0YSBhcyBhbnkpPy5jb21wb25lbnRzIHx8IFtdO1xyXG4gICAgdGhpcy5maWVsZHMgPSBuZXcgTW9kYWxGaWVsZHMoY29tcG9uZW50cyk7XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogTW9kYWwgZmllbGRzIGhlbHBlclxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIE1vZGFsRmllbGRzIHtcclxuICBwcml2YXRlIGZpZWxkTWFwOiBNYXA8c3RyaW5nLCBzdHJpbmc+O1xyXG5cclxuICBjb25zdHJ1Y3Rvcihjb21wb25lbnRzOiBhbnlbXSkge1xyXG4gICAgdGhpcy5maWVsZE1hcCA9IG5ldyBNYXAoKTtcclxuICAgIC8vIFBhcnNlIGFjdGlvbiByb3dzIOKGkiB0ZXh0IGlucHV0c1xyXG4gICAgZm9yIChjb25zdCByb3cgb2YgY29tcG9uZW50cykge1xyXG4gICAgICBjb25zdCBpbm5lckNvbXBvbmVudHMgPSByb3c/LmNvbXBvbmVudHMgfHwgW107XHJcbiAgICAgIGZvciAoY29uc3QgY29tcCBvZiBpbm5lckNvbXBvbmVudHMpIHtcclxuICAgICAgICBpZiAoY29tcC5jdXN0b21faWQgJiYgY29tcC52YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICB0aGlzLmZpZWxkTWFwLnNldChjb21wLmN1c3RvbV9pZCwgY29tcC52YWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgYSB0ZXh0IGlucHV0IHZhbHVlIGJ5IGN1c3RvbV9pZFxyXG4gICAqL1xyXG4gIGdldFRleHRJbnB1dFZhbHVlKGN1c3RvbUlkOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcclxuICAgIHJldHVybiB0aGlzLmZpZWxkTWFwLmdldChjdXN0b21JZCkgPz8gbnVsbDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBhIGZpZWxkIChhbGlhcyBmb3IgZ2V0VGV4dElucHV0VmFsdWUpXHJcbiAgICovXHJcbiAgZ2V0RmllbGQoY3VzdG9tSWQ6IHN0cmluZyk6IHsgdmFsdWU6IHN0cmluZyB9IHwgbnVsbCB7XHJcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZmllbGRNYXAuZ2V0KGN1c3RvbUlkKTtcclxuICAgIHJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkID8geyB2YWx1ZSB9IDogbnVsbDtcclxuICB9XHJcbn1cclxuXHJcbi8vIFR5cGVzXHJcbmV4cG9ydCBpbnRlcmZhY2UgSW50ZXJhY3Rpb25SZXBseU9wdGlvbnMge1xyXG4gIGNvbnRlbnQ/OiBzdHJpbmc7XHJcbiAgZW1iZWRzPzogKEFQSUVtYmVkIHwgRW1iZWRCdWlsZGVyKVtdO1xyXG4gIGNvbXBvbmVudHM/OiBhbnlbXTtcclxuICBlcGhlbWVyYWw/OiBib29sZWFuO1xyXG4gIGZpbGVzPzogQXJyYXk8eyBuYW1lOiBzdHJpbmc7IGRhdGE6IEJ1ZmZlcjsgY29udGVudFR5cGU/OiBzdHJpbmcgfT47XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQXV0b2NvbXBsZXRlQ2hvaWNlIHtcclxuICBuYW1lOiBzdHJpbmc7XHJcbiAgdmFsdWU6IHN0cmluZyB8IG51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBNb2RhbERhdGEge1xyXG4gIGN1c3RvbV9pZDogc3RyaW5nO1xyXG4gIHRpdGxlOiBzdHJpbmc7XHJcbiAgY29tcG9uZW50czogYW55W107XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDcmVhdGUgYXBwcm9wcmlhdGUgaW50ZXJhY3Rpb24gY2xhc3MgYmFzZWQgb24gdHlwZVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUludGVyYWN0aW9uKGNsaWVudDogQ2xpZW50LCBkYXRhOiBBUElJbnRlcmFjdGlvbik6IEludGVyYWN0aW9uIHtcclxuICBzd2l0Y2ggKGRhdGEudHlwZSkge1xyXG4gICAgY2FzZSBJbnRlcmFjdGlvblR5cGUuQXBwbGljYXRpb25Db21tYW5kOlxyXG4gICAgICByZXR1cm4gbmV3IENvbW1hbmRJbnRlcmFjdGlvbihjbGllbnQsIGRhdGEpO1xyXG4gICAgY2FzZSBJbnRlcmFjdGlvblR5cGUuQXBwbGljYXRpb25Db21tYW5kQXV0b2NvbXBsZXRlOlxyXG4gICAgICByZXR1cm4gbmV3IEF1dG9jb21wbGV0ZUludGVyYWN0aW9uKGNsaWVudCwgZGF0YSk7XHJcbiAgICBjYXNlIEludGVyYWN0aW9uVHlwZS5Nb2RhbFN1Ym1pdDpcclxuICAgICAgcmV0dXJuIG5ldyBNb2RhbFN1Ym1pdEludGVyYWN0aW9uKGNsaWVudCwgZGF0YSk7XHJcbiAgICBjYXNlIEludGVyYWN0aW9uVHlwZS5NZXNzYWdlQ29tcG9uZW50OlxyXG4gICAgICAvLyBjb21wb25lbnRfdHlwZTogMiA9IEJ1dHRvbiwgMyA9IFNlbGVjdCBNZW51XHJcbiAgICAgIGlmIChkYXRhLmRhdGE/LmNvbXBvbmVudF90eXBlID09PSAyKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBCdXR0b25JbnRlcmFjdGlvbihjbGllbnQsIGRhdGEpO1xyXG4gICAgICB9IGVsc2UgaWYgKGRhdGEuZGF0YT8uY29tcG9uZW50X3R5cGUgPT09IDMpIHtcclxuICAgICAgICByZXR1cm4gbmV3IFNlbGVjdE1lbnVJbnRlcmFjdGlvbihjbGllbnQsIGRhdGEpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBuZXcgSW50ZXJhY3Rpb24oY2xpZW50LCBkYXRhKTtcclxuICAgIGRlZmF1bHQ6XHJcbiAgICAgIHJldHVybiBuZXcgSW50ZXJhY3Rpb24oY2xpZW50LCBkYXRhKTtcclxuICB9XHJcbn1cclxuIl19
@@ -1,98 +0,0 @@
1
- import { APIMessage, APIEmbed, APIAttachment } from '../types';
2
- import { User } from './User';
3
- import { GuildMember } from './GuildMember';
4
- import type { Client } from '../Client';
5
- import type { MessageCreateOptions } from './Channel';
6
- import { InteractionCollector, InteractionCollectorOptions } from '../utils/Collector';
7
- /**
8
- * Mention data from backend
9
- */
10
- export interface MessageMentions {
11
- users?: Array<{
12
- id: number | string;
13
- username: string;
14
- }>;
15
- roles?: Array<{
16
- id: string;
17
- name?: string;
18
- }>;
19
- everyone?: boolean;
20
- }
21
- /**
22
- * Represents a message
23
- */
24
- export declare class Message {
25
- /** Reference to the client */
26
- readonly client: Client;
27
- /** Message ID */
28
- readonly id: string;
29
- /** Channel ID */
30
- readonly channelId: string;
31
- /** Guild ID (if in a guild) */
32
- readonly guildId?: string;
33
- /** Message author */
34
- readonly author: User;
35
- /** Message content */
36
- content: string;
37
- /** Message timestamp */
38
- readonly createdTimestamp: number;
39
- /** Edit timestamp */
40
- editedTimestamp?: number;
41
- /** Attachments */
42
- attachments: APIAttachment[];
43
- /** Embeds */
44
- embeds: APIEmbed[];
45
- /** Components (buttons, select menus, etc.) */
46
- components: any[];
47
- /** Mentions in the message */
48
- mentions: MessageMentions;
49
- /** User ID (from backend) */
50
- user_id?: number;
51
- /** Guild member (if in a guild) */
52
- member?: GuildMember;
53
- constructor(client: Client, data: APIMessage);
54
- /**
55
- * Get the creation date
56
- */
57
- get createdAt(): Date;
58
- /**
59
- * Get the edit date
60
- */
61
- get editedAt(): Date | null;
62
- /**
63
- * Reply to this message
64
- */
65
- reply(options: string | MessageCreateOptions): Promise<Message>;
66
- /**
67
- * Edit this message (only if author is the bot)
68
- */
69
- edit(options: string | MessageCreateOptions): Promise<Message>;
70
- /**
71
- * Delete this message
72
- */
73
- delete(): Promise<void>;
74
- /**
75
- * React to this message
76
- */
77
- react(emoji: string): Promise<void>;
78
- /**
79
- * Pin this message
80
- */
81
- pin(): Promise<void>;
82
- /**
83
- * Unpin this message
84
- */
85
- unpin(): Promise<void>;
86
- /**
87
- * Create a component interaction collector on this message
88
- */
89
- createMessageComponentCollector(options?: Omit<InteractionCollectorOptions, 'messageId'>): InteractionCollector;
90
- /**
91
- * Await component interactions on this message
92
- */
93
- awaitMessageComponent(options?: Omit<InteractionCollectorOptions, 'messageId' | 'max'>): Promise<any>;
94
- /**
95
- * Convert to string
96
- */
97
- toString(): string;
98
- }