@jubbio/core 1.1.20 → 1.3.2

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 (125) hide show
  1. package/dist/Client.js +13 -14
  2. package/dist/cjs/Client.d.ts +157 -0
  3. package/dist/cjs/Client.js +640 -0
  4. package/dist/cjs/builders/ActionRowBuilder.d.ts +53 -0
  5. package/dist/cjs/builders/ActionRowBuilder.js +68 -0
  6. package/dist/cjs/builders/ButtonBuilder.d.ts +77 -0
  7. package/dist/cjs/builders/ButtonBuilder.js +96 -0
  8. package/dist/cjs/builders/EmbedBuilder.d.ts +157 -0
  9. package/dist/cjs/builders/EmbedBuilder.js +208 -0
  10. package/dist/cjs/builders/ModalBuilder.d.ts +122 -0
  11. package/dist/cjs/builders/ModalBuilder.js +162 -0
  12. package/dist/cjs/builders/SelectMenuBuilder.d.ts +123 -0
  13. package/dist/cjs/builders/SelectMenuBuilder.js +165 -0
  14. package/dist/cjs/builders/SlashCommandBuilder.d.ts +197 -0
  15. package/dist/cjs/builders/SlashCommandBuilder.js +324 -0
  16. package/dist/cjs/builders/index.d.ts +9 -0
  17. package/dist/cjs/builders/index.js +26 -0
  18. package/dist/cjs/enums.d.ts +191 -0
  19. package/dist/cjs/enums.js +211 -0
  20. package/dist/cjs/index.d.ts +25 -0
  21. package/dist/cjs/index.js +130 -0
  22. package/dist/cjs/managers/BaseManager.d.ts +69 -0
  23. package/dist/cjs/managers/BaseManager.js +106 -0
  24. package/dist/cjs/managers/ChannelManager.d.ts +95 -0
  25. package/dist/cjs/managers/ChannelManager.js +205 -0
  26. package/dist/cjs/managers/GuildMemberManager.d.ts +74 -0
  27. package/dist/cjs/managers/GuildMemberManager.js +157 -0
  28. package/dist/cjs/managers/RoleManager.d.ts +84 -0
  29. package/dist/cjs/managers/RoleManager.js +207 -0
  30. package/dist/cjs/managers/index.d.ts +7 -0
  31. package/dist/cjs/managers/index.js +24 -0
  32. package/dist/cjs/rest/REST.d.ts +527 -0
  33. package/dist/cjs/rest/REST.js +904 -0
  34. package/dist/cjs/rest/index.d.ts +1 -0
  35. package/dist/cjs/rest/index.js +18 -0
  36. package/dist/cjs/sharding/ShardingManager.d.ts +179 -0
  37. package/dist/cjs/sharding/ShardingManager.js +375 -0
  38. package/dist/cjs/sharding/index.d.ts +4 -0
  39. package/dist/cjs/sharding/index.js +21 -0
  40. package/dist/cjs/structures/Channel.d.ts +122 -0
  41. package/dist/cjs/structures/Channel.js +240 -0
  42. package/dist/cjs/structures/Collection.d.ts +53 -0
  43. package/dist/cjs/structures/Collection.js +115 -0
  44. package/dist/cjs/structures/Guild.d.ts +59 -0
  45. package/dist/cjs/structures/Guild.js +94 -0
  46. package/dist/cjs/structures/GuildMember.d.ts +174 -0
  47. package/dist/cjs/structures/GuildMember.js +311 -0
  48. package/dist/cjs/structures/Interaction.d.ts +245 -0
  49. package/dist/cjs/structures/Interaction.js +450 -0
  50. package/dist/cjs/structures/Message.d.ts +98 -0
  51. package/dist/cjs/structures/Message.js +195 -0
  52. package/dist/cjs/structures/User.d.ts +37 -0
  53. package/dist/cjs/structures/User.js +65 -0
  54. package/dist/cjs/structures/index.d.ts +7 -0
  55. package/dist/cjs/structures/index.js +25 -0
  56. package/dist/cjs/structures.d.ts +1 -0
  57. package/dist/cjs/structures.js +19 -0
  58. package/dist/cjs/types.d.ts +255 -0
  59. package/dist/cjs/types.js +3 -0
  60. package/dist/cjs/utils/BitField.d.ts +66 -0
  61. package/dist/cjs/utils/BitField.js +138 -0
  62. package/dist/cjs/utils/Collection.d.ts +116 -0
  63. package/dist/cjs/utils/Collection.js +265 -0
  64. package/dist/cjs/utils/Collector.d.ts +152 -0
  65. package/dist/cjs/utils/Collector.js +314 -0
  66. package/dist/cjs/utils/DataResolver.d.ts +61 -0
  67. package/dist/cjs/utils/DataResolver.js +146 -0
  68. package/dist/cjs/utils/Formatters.d.ts +145 -0
  69. package/dist/cjs/utils/Formatters.js +213 -0
  70. package/dist/cjs/utils/IntentsBitField.d.ts +85 -0
  71. package/dist/cjs/utils/IntentsBitField.js +99 -0
  72. package/dist/cjs/utils/Partials.d.ts +104 -0
  73. package/dist/cjs/utils/Partials.js +148 -0
  74. package/dist/cjs/utils/PermissionsBitField.d.ts +118 -0
  75. package/dist/cjs/utils/PermissionsBitField.js +145 -0
  76. package/dist/cjs/utils/SnowflakeUtil.d.ts +63 -0
  77. package/dist/cjs/utils/SnowflakeUtil.js +93 -0
  78. package/dist/cjs/utils/Sweepers.d.ts +119 -0
  79. package/dist/cjs/utils/Sweepers.js +249 -0
  80. package/dist/cjs/utils/index.d.ts +13 -0
  81. package/dist/cjs/utils/index.js +30 -0
  82. package/dist/esm/Client.js +634 -0
  83. package/dist/esm/builders/ActionRowBuilder.js +64 -0
  84. package/dist/esm/builders/ButtonBuilder.js +92 -0
  85. package/dist/esm/builders/EmbedBuilder.js +204 -0
  86. package/dist/esm/builders/ModalBuilder.js +157 -0
  87. package/dist/esm/builders/SelectMenuBuilder.js +161 -0
  88. package/dist/esm/builders/SlashCommandBuilder.js +311 -0
  89. package/dist/esm/builders/index.js +10 -0
  90. package/dist/esm/enums.js +208 -0
  91. package/dist/esm/index.js +34 -0
  92. package/dist/esm/managers/BaseManager.js +100 -0
  93. package/dist/esm/managers/ChannelManager.js +200 -0
  94. package/dist/esm/managers/GuildMemberManager.js +153 -0
  95. package/dist/esm/managers/RoleManager.js +203 -0
  96. package/dist/esm/managers/index.js +8 -0
  97. package/dist/esm/rest/REST.js +900 -0
  98. package/dist/esm/rest/index.js +2 -0
  99. package/dist/esm/sharding/ShardingManager.js +366 -0
  100. package/dist/esm/sharding/index.js +5 -0
  101. package/dist/esm/structures/Channel.js +232 -0
  102. package/dist/esm/structures/Collection.js +111 -0
  103. package/dist/esm/structures/Guild.js +90 -0
  104. package/dist/esm/structures/GuildMember.js +306 -0
  105. package/dist/esm/structures/Interaction.js +438 -0
  106. package/dist/esm/structures/Message.js +191 -0
  107. package/dist/esm/structures/User.js +61 -0
  108. package/dist/esm/structures/index.js +9 -0
  109. package/dist/esm/structures.js +3 -0
  110. package/dist/esm/types.js +2 -0
  111. package/dist/esm/utils/BitField.js +134 -0
  112. package/dist/esm/utils/Collection.js +261 -0
  113. package/dist/esm/utils/Collector.js +305 -0
  114. package/dist/esm/utils/DataResolver.js +142 -0
  115. package/dist/esm/utils/Formatters.js +191 -0
  116. package/dist/esm/utils/IntentsBitField.js +93 -0
  117. package/dist/esm/utils/Partials.js +137 -0
  118. package/dist/esm/utils/PermissionsBitField.js +141 -0
  119. package/dist/esm/utils/SnowflakeUtil.js +89 -0
  120. package/dist/esm/utils/Sweepers.js +245 -0
  121. package/dist/esm/utils/index.js +14 -0
  122. package/dist/rest/REST.js +8 -1
  123. package/dist/structures/Interaction.js +3 -5
  124. package/dist/structures/Message.js +56 -2
  125. package/package.json +14 -4
@@ -0,0 +1,261 @@
1
+ /**
2
+ * A Map with additional utility methods
3
+ */
4
+ export class Collection extends Map {
5
+ /**
6
+ * Identical to Map.get()
7
+ * Ensures the value exists
8
+ */
9
+ ensure(key, defaultValueGenerator) {
10
+ if (this.has(key))
11
+ return this.get(key);
12
+ const defaultValue = defaultValueGenerator(key, this);
13
+ this.set(key, defaultValue);
14
+ return defaultValue;
15
+ }
16
+ /**
17
+ * Checks if all items pass a test
18
+ */
19
+ every(fn) {
20
+ for (const [key, val] of this) {
21
+ if (!fn(val, key, this))
22
+ return false;
23
+ }
24
+ return true;
25
+ }
26
+ /**
27
+ * Checks if any item passes a test
28
+ */
29
+ some(fn) {
30
+ for (const [key, val] of this) {
31
+ if (fn(val, key, this))
32
+ return true;
33
+ }
34
+ return false;
35
+ }
36
+ /**
37
+ * Identical to Array.filter(), but returns a Collection
38
+ */
39
+ filter(fn) {
40
+ const results = new Collection();
41
+ for (const [key, val] of this) {
42
+ if (fn(val, key, this))
43
+ results.set(key, val);
44
+ }
45
+ return results;
46
+ }
47
+ /**
48
+ * Partitions the collection into two collections
49
+ */
50
+ partition(fn) {
51
+ const results = [new Collection(), new Collection()];
52
+ for (const [key, val] of this) {
53
+ if (fn(val, key, this)) {
54
+ results[0].set(key, val);
55
+ }
56
+ else {
57
+ results[1].set(key, val);
58
+ }
59
+ }
60
+ return results;
61
+ }
62
+ /**
63
+ * Maps each item to another value
64
+ */
65
+ map(fn) {
66
+ const results = [];
67
+ for (const [key, val] of this) {
68
+ results.push(fn(val, key, this));
69
+ }
70
+ return results;
71
+ }
72
+ /**
73
+ * Maps each item to another value into a Collection
74
+ */
75
+ mapValues(fn) {
76
+ const results = new Collection();
77
+ for (const [key, val] of this) {
78
+ results.set(key, fn(val, key, this));
79
+ }
80
+ return results;
81
+ }
82
+ /**
83
+ * Searches for a single item
84
+ */
85
+ find(fn) {
86
+ for (const [key, val] of this) {
87
+ if (fn(val, key, this))
88
+ return val;
89
+ }
90
+ return undefined;
91
+ }
92
+ /**
93
+ * Searches for the key of a single item
94
+ */
95
+ findKey(fn) {
96
+ for (const [key, val] of this) {
97
+ if (fn(val, key, this))
98
+ return key;
99
+ }
100
+ return undefined;
101
+ }
102
+ /**
103
+ * Removes items that satisfy the provided filter function
104
+ */
105
+ sweep(fn) {
106
+ const previousSize = this.size;
107
+ for (const [key, val] of this) {
108
+ if (fn(val, key, this))
109
+ this.delete(key);
110
+ }
111
+ return previousSize - this.size;
112
+ }
113
+ /**
114
+ * Reduces the collection to a single value
115
+ */
116
+ reduce(fn, initialValue) {
117
+ let accumulator = initialValue;
118
+ for (const [key, val] of this) {
119
+ accumulator = fn(accumulator, val, key, this);
120
+ }
121
+ return accumulator;
122
+ }
123
+ /**
124
+ * Identical to Array.forEach()
125
+ */
126
+ each(fn) {
127
+ for (const [key, val] of this) {
128
+ fn(val, key, this);
129
+ }
130
+ return this;
131
+ }
132
+ first(amount) {
133
+ if (amount === undefined)
134
+ return this.values().next().value;
135
+ if (amount < 0)
136
+ return this.last(amount * -1);
137
+ amount = Math.min(this.size, amount);
138
+ const iter = this.values();
139
+ return Array.from({ length: amount }, () => iter.next().value);
140
+ }
141
+ firstKey(amount) {
142
+ if (amount === undefined)
143
+ return this.keys().next().value;
144
+ if (amount < 0)
145
+ return this.lastKey(amount * -1);
146
+ amount = Math.min(this.size, amount);
147
+ const iter = this.keys();
148
+ return Array.from({ length: amount }, () => iter.next().value);
149
+ }
150
+ last(amount) {
151
+ const arr = [...this.values()];
152
+ if (amount === undefined)
153
+ return arr[arr.length - 1];
154
+ if (amount < 0)
155
+ return this.first(amount * -1);
156
+ if (!amount)
157
+ return [];
158
+ return arr.slice(-amount);
159
+ }
160
+ lastKey(amount) {
161
+ const arr = [...this.keys()];
162
+ if (amount === undefined)
163
+ return arr[arr.length - 1];
164
+ if (amount < 0)
165
+ return this.firstKey(amount * -1);
166
+ if (!amount)
167
+ return [];
168
+ return arr.slice(-amount);
169
+ }
170
+ random(amount) {
171
+ const arr = [...this.values()];
172
+ if (amount === undefined)
173
+ return arr[Math.floor(Math.random() * arr.length)];
174
+ if (!arr.length || !amount)
175
+ return [];
176
+ return Array.from({ length: Math.min(amount, arr.length) }, () => arr.splice(Math.floor(Math.random() * arr.length), 1)[0]);
177
+ }
178
+ randomKey(amount) {
179
+ const arr = [...this.keys()];
180
+ if (amount === undefined)
181
+ return arr[Math.floor(Math.random() * arr.length)];
182
+ if (!arr.length || !amount)
183
+ return [];
184
+ return Array.from({ length: Math.min(amount, arr.length) }, () => arr.splice(Math.floor(Math.random() * arr.length), 1)[0]);
185
+ }
186
+ /**
187
+ * Combines this collection with others
188
+ */
189
+ concat(...collections) {
190
+ const newColl = this.clone();
191
+ for (const coll of collections) {
192
+ for (const [key, val] of coll)
193
+ newColl.set(key, val);
194
+ }
195
+ return newColl;
196
+ }
197
+ /**
198
+ * Checks if this collection shares identical items with another
199
+ */
200
+ equals(collection) {
201
+ if (this === collection)
202
+ return true;
203
+ if (this.size !== collection.size)
204
+ return false;
205
+ for (const [key, value] of this) {
206
+ if (!collection.has(key) || value !== collection.get(key)) {
207
+ return false;
208
+ }
209
+ }
210
+ return true;
211
+ }
212
+ /**
213
+ * Creates an identical shallow copy of this collection
214
+ */
215
+ clone() {
216
+ return new Collection(this);
217
+ }
218
+ /**
219
+ * Sorts the collection and returns it
220
+ */
221
+ sort(compareFunction = Collection.defaultSort) {
222
+ const entries = [...this.entries()];
223
+ entries.sort((a, b) => compareFunction(a[1], b[1], a[0], b[0]));
224
+ this.clear();
225
+ for (const [k, v] of entries) {
226
+ this.set(k, v);
227
+ }
228
+ return this;
229
+ }
230
+ /**
231
+ * Sorts the collection by keys and returns it
232
+ */
233
+ sortByKey(compareFunction = Collection.defaultSort) {
234
+ const entries = [...this.entries()];
235
+ entries.sort((a, b) => compareFunction(a[0], b[0], a[1], b[1]));
236
+ this.clear();
237
+ for (const [k, v] of entries) {
238
+ this.set(k, v);
239
+ }
240
+ return this;
241
+ }
242
+ /**
243
+ * Returns an array of items
244
+ */
245
+ toJSON() {
246
+ return [...this.values()];
247
+ }
248
+ /**
249
+ * Default sort function
250
+ */
251
+ static defaultSort(firstValue, secondValue) {
252
+ return Number(firstValue > secondValue) || Number(firstValue === secondValue) - 1;
253
+ }
254
+ /**
255
+ * Creates a Collection from an array
256
+ */
257
+ static from(entries) {
258
+ return new Collection(entries);
259
+ }
260
+ }
261
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29sbGVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy9Db2xsZWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxPQUFPLFVBQWlCLFNBQVEsR0FBUztJQUM3Qzs7O09BR0c7SUFDSCxNQUFNLENBQUMsR0FBTSxFQUFFLHFCQUFzRDtRQUNuRSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBRSxDQUFDO1FBQ3pDLE1BQU0sWUFBWSxHQUFHLHFCQUFxQixDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN0RCxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUM1QixPQUFPLFlBQVksQ0FBQztJQUN0QixDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsRUFBbUQ7UUFDdkQsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQzlCLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUM7Z0JBQUUsT0FBTyxLQUFLLENBQUM7UUFDeEMsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBSSxDQUFDLEVBQW1EO1FBQ3RELEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUM5QixJQUFJLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQztnQkFBRSxPQUFPLElBQUksQ0FBQztRQUN0QyxDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNLENBQUMsRUFBbUQ7UUFDeEQsTUFBTSxPQUFP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LENBQUM7UUFDN0IsSUFBSSxNQUFNLEtBQUssU0FBUztZQUFFLE9BQU8sR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDckQsSUFBSSxNQUFNLEdBQUcsQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsRCxJQUFJLENBQUMsTUFBTTtZQUFFLE9BQU8sRUFBRSxDQUFDO1FBQ3ZCLE9BQU8sR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFPRCxNQUFNLENBQUMsTUFBZTtRQUNwQixNQUFNLEdBQUcsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDL0IsSUFBSSxNQUFNLEtBQUssU0FBUztZQUFFLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQzdFLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxJQUFJLENBQUMsTUFBTTtZQUFFLE9BQU8sRUFBRSxDQUFDO1FBQ3RDLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzlILENBQUM7SUFPRCxTQUFTLENBQUMsTUFBZTtRQUN2QixNQUFNLEdBQUcsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFDN0IsSUFBSSxNQUFNLEtB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QyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoRSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDYixLQUFLLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksT0FBTyxFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDakIsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTTtRQUNKLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFRDs7T0FFRztJQUNLLE1BQU0sQ0FBQyxXQUFXLENBQUksVUFBYSxFQUFFLFdBQWM7UUFDekQsT0FBTyxNQUFNLENBQUMsVUFBVSxHQUFHLFdBQVcsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxVQUFVLEtBQUssV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3BGLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FBQyxJQUFJLENBQU8sT0FBa0M7UUFDbEQsT0FBTyxJQUFJLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNqQyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEEgTWFwIHdpdGggYWRkaXRpb25hbCB1dGlsaXR5IG1ldGhvZHNcbiAqL1xuZXhwb3J0IGNsYXNzIENvbGxlY3Rpb248SywgVj4gZXh0ZW5kcyBNYXA8SywgVj4ge1xuICAvKipcbiAgICogSWRlbnRpY2FsIHRvIE1hcC5nZXQoKVxuICAgKiBFbnN1cmVzIHRoZSB2YWx1ZSBleGlzdHNcbiAgICovXG4gIGVuc3VyZShrZXk6IEssIGRlZmF1bHRWYWx1ZUdlbmVyYXRvcjogKGtleTogSywgY29sbGVjdGlvbjogdGhpcykgPT4gVik6IFYge1xuICAgIGlmICh0aGlzLmhhcyhrZXkpKSByZXR1cm4gdGhpcy5nZXQoa2V5KSE7XG4gICAgY29uc3QgZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbHVlR2VuZXJhdG9yKGtleSwgdGhpcyk7XG4gICAgdGhpcy5zZXQoa2V5LCBkZWZhdWx0VmFsdWUpO1xuICAgIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGFsbCBpdGVtcyBwYXNzIGEgdGVzdFxuICAgKi9cbiAgZXZlcnkoZm46ICh2YWx1ZTogViwga2V5OiBLLCBjb2xsZWN0aW9uOiB0aGlzKSA9PiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWxdIG9mIHRoaXMpIHtcbiAgICAgIGlmICghZm4odmFsLCBrZXksIHRoaXMpKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBhbnkgaXRlbSBwYXNzZXMgYSB0ZXN0XG4gICAqL1xuICBzb21lKGZuOiAodmFsdWU6IFYsIGtleTogSywgY29sbGVjdGlvbjogdGhpcykgPT4gYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsXSBvZiB0aGlzKSB7XG4gICAgICBpZiAoZm4odmFsLCBrZXksIHRoaXMpKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIElkZW50aWNhbCB0byBBcnJheS5maWx0ZXIoKSwgYnV0IHJldHVybnMgYSBDb2xsZWN0aW9uXG4gICAqL1xuICBmaWx0ZXIoZm46ICh2YWx1ZTogViwga2V5OiBLLCBjb2xsZWN0aW9uOiB0aGlzKSA9PiBib29sZWFuKTogQ29sbGVjdGlvbjxLLCBWPiB7XG4gICAgY29uc3QgcmVzdWx0cyA9IG5ldyBDb2xsZWN0aW9uPEssIFY+KCk7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWxdIG9mIHRoaXMpIHtcbiAgICAgIGlmIChmbih2YWwsIGtleSwgdGhpcykpIHJlc3VsdHMuc2V0KGtleSwgdmFsKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH1cblxuICAvKipcbiAgICogUGFydGl0aW9ucyB0aGUgY29sbGVjdGlvbiBpbnRvIHR3byBjb2xsZWN0aW9uc1xuICAgKi9cbiAgcGFydGl0aW9uKGZuOiAodmFsdWU6IFYsIGtleTogSywgY29sbGVjdGlvbjogdGhpcykgPT4gYm9vbGVhbik6IFtDb2xsZWN0aW9uPEssIFY+LCBDb2xsZWN0aW9uPEssIFY+XSB7XG4gICAgY29uc3QgcmVzdWx0czogW0NvbGxlY3Rpb248SywgVj4sIENvbGxlY3Rpb248SywgVj5dID0gW25ldyBDb2xsZWN0aW9uPEssIFY+KCksIG5ldyBDb2xsZWN0aW9uPEssIFY+KCldO1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsXSBvZiB0aGlzKSB7XG4gICAgICBpZiAoZm4odmFsLCBrZXksIHRoaXMpKSB7XG4gICAgICAgIHJlc3VsdHNbMF0uc2V0KGtleSwgdmFsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdHNbMV0uc2V0KGtleSwgdmFsKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH1cblxuICAvKipcbiAgICogTWFwcyBlYWNoIGl0ZW0gdG8gYW5vdGhlciB2YWx1ZVxuICAgKi9cbiAgbWFwPFQ+KGZuOiAodmFsdWU6IFYsIGtleTogSywgY29sbGVjdGlvbjogdGhpcykgPT4gVCk6IFRbXSB7XG4gICAgY29uc3QgcmVzdWx0czogVFtdID0gW107XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWxdIG9mIHRoaXMpIHtcbiAgICAgIHJlc3VsdHMucHVzaChmbih2YWwsIGtleSwgdGhpcykpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXBzIGVhY2ggaXRlbSB0byBhbm90aGVyIHZhbHVlIGludG8gYSBDb2xsZWN0aW9uXG4gICAqL1xuICBtYXBWYWx1ZXM8VD4oZm46ICh2YWx1ZTogViwga2V5OiBLLCBjb2xsZWN0aW9uOiB0aGlzKSA9PiBUKTogQ29sbGVjdGlvbjxLLCBUPiB7XG4gICAgY29uc3QgcmVzdWx0cyA9IG5ldyBDb2xsZWN0aW9uPEssIFQ+KCk7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWxdIG9mIHRoaXMpIHtcbiAgICAgIHJlc3VsdHMuc2V0KGtleSwgZm4odmFsLCBrZXksIHRoaXMpKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH1cblxuICAvKipcbiAgICogU2VhcmNoZXMgZm9yIGEgc2luZ2xlIGl0ZW1cbiAgICovXG4gIGZpbmQoZm46ICh2YWx1ZTogViwga2V5OiBLLCBjb2xsZWN0aW9uOiB0aGlzKSA9PiBib29sZWFuKTogViB8IHVuZGVmaW5lZCB7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWxdIG9mIHRoaXMpIHtcbiAgICAgIGlmIChmbih2YWwsIGtleSwgdGhpcykpIHJldHVybiB2YWw7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogU2VhcmNoZXMgZm9yIHRoZSBrZXkgb2YgYSBzaW5nbGUgaXRlbVxuICAgKi9cbiAgZmluZEtleShmbjogKHZhbHVlOiBWLCBrZXk6IEssIGNvbGxlY3Rpb246IHRoaXMpID0+IGJvb2xlYW4pOiBLIHwgdW5kZWZpbmVkIHtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbF0gb2YgdGhpcykge1xuICAgICAgaWYgKGZuKHZhbCwga2V5LCB0aGlzKSkgcmV0dXJuIGtleTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGl0ZW1zIHRoYXQgc2F0aXNmeSB0aGUgcHJvdmlkZWQgZmlsdGVyIGZ1bmN0aW9uXG4gICAqL1xuICBzd2VlcChmbjogKHZhbHVlOiBWLCBrZXk6IEssIGNvbGxlY3Rpb246IHRoaXMpID0+IGJvb2xlYW4pOiBudW1iZXIge1xuICAgIGNvbnN0IHByZXZpb3VzU2l6ZSA9IHRoaXMuc2l6ZTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbF0gb2YgdGhpcykge1xuICAgICAgaWYgKGZuKHZhbCwga2V5LCB0aGlzKSkgdGhpcy5kZWxldGUoa2V5KTtcbiAgICB9XG4gICAgcmV0dXJuIHByZXZpb3VzU2l6ZSAtIHRoaXMuc2l6ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWR1Y2VzIHRoZSBjb2xsZWN0aW9uIHRvIGEgc2luZ2xlIHZhbHVlXG4gICAqL1xuICByZWR1Y2U8VD4oZm46IChhY2N1bXVsYXRvcjogVCwgdmFsdWU6IFYsIGtleTogSywgY29sbGVjdGlvbjogdGhpcykgPT4gVCwgaW5pdGlhbFZhbHVlOiBUKTogVCB7XG4gICAgbGV0IGFjY3VtdWxhdG9yID0gaW5pdGlhbFZhbHVlO1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsXSBvZiB0aGlzKSB7XG4gICAgICBhY2N1bXVsYXRvciA9IGZuKGFjY3VtdWxhdG9yLCB2YWwsIGtleSwgdGhpcyk7XG4gICAgfVxuICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZGVudGljYWwgdG8gQXJyYXkuZm9yRWFjaCgpXG4gICAqL1xuICBlYWNoKGZuOiAodmFsdWU6IFYsIGtleTogSywgY29sbGVjdGlvbjogdGhpcykgPT4gdm9pZCk6IHRoaXMge1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsXSBvZiB0aGlzKSB7XG4gICAgICBmbih2YWwsIGtleSwgdGhpcyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGZpcnN0IGl0ZW0ocykgaW4gdGhlIGNvbGxlY3Rpb25cbiAgICovXG4gIGZpcnN0KCk6IFYgfCB1bmRlZmluZWQ7XG4gIGZpcnN0KGFtb3VudDogbnVtYmVyKTogVltdO1xuICBmaXJzdChhbW91bnQ/OiBudW1iZXIpOiBWIHwgVltdIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoYW1vdW50ID09PSB1bmRlZmluZWQpIHJldHVybiB0aGlzLnZhbHVlcygpLm5leHQoKS52YWx1ZTtcbiAgICBpZiAoYW1vdW50IDwgMCkgcmV0dXJuIHRoaXMubGFzdChhbW91bnQgKiAtMSk7XG4gICAgYW1vdW50ID0gTWF0aC5taW4odGhpcy5zaXplLCBhbW91bnQpO1xuICAgIGNvbnN0IGl0ZXIgPSB0aGlzLnZhbHVlcygpO1xuICAgIHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoOiBhbW91bnQgfSwgKCkgPT4gaXRlci5uZXh0KCkudmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGZpcnN0IGtleShzKSBpbiB0aGUgY29sbGVjdGlvblxuICAgKi9cbiAgZmlyc3RLZXkoKTogSyB8IHVuZGVmaW5lZDtcbiAgZmlyc3RLZXkoYW1vdW50OiBudW1iZXIpOiBLW107XG4gIGZpcnN0S2V5KGFtb3VudD86IG51bWJlcik6IEsgfCBLW10gfCB1bmRlZmluZWQge1xuICAgIGlmIChhbW91bnQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXMua2V5cygpLm5leHQoKS52YWx1ZTtcbiAgICBpZiAoYW1vdW50IDwgMCkgcmV0dXJuIHRoaXMubGFzdEtleShhbW91bnQgKiAtMSk7XG4gICAgYW1vdW50ID0gTWF0aC5taW4odGhpcy5zaXplLCBhbW91bnQpO1xuICAgIGNvbnN0IGl0ZXIgPSB0aGlzLmtleXMoKTtcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh7IGxlbmd0aDogYW1vdW50IH0sICgpID0+IGl0ZXIubmV4dCgpLnZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBsYXN0IGl0ZW0ocykgaW4gdGhlIGNvbGxlY3Rpb25cbiAgICovXG4gIGxhc3QoKTogViB8IHVuZGVmaW5lZDtcbiAgbGFzdChhbW91bnQ6IG51bWJlcik6IFZbXTtcbiAgbGFzdChhbW91bnQ/OiBudW1iZXIpOiBWIHwgVltdIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBhcnIgPSBbLi4udGhpcy52YWx1ZXMoKV07XG4gICAgaWYgKGFtb3VudCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gYXJyW2Fyci5sZW5ndGggLSAxXTtcbiAgICBpZiAoYW1vdW50IDwgMCkgcmV0dXJuIHRoaXMuZmlyc3QoYW1vdW50ICogLTEpO1xuICAgIGlmICghYW1vdW50KSByZXR1cm4gW107XG4gICAgcmV0dXJuIGFyci5zbGljZSgtYW1vdW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBsYXN0IGtleShzKSBpbiB0aGUgY29sbGVjdGlvblxuICAgKi9cbiAgbGFzdEtleSgpOiBLIHwgdW5kZWZpbmVkO1xuICBsYXN0S2V5KGFtb3VudDogbnVtYmVyKTogS1tdO1xuICBsYXN0S2V5KGFtb3VudD86IG51bWJlcik6IEsgfCBLW10gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGFyciA9IFsuLi50aGlzLmtleXMoKV07XG4gICAgaWYgKGFtb3VudCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gYXJyW2Fyci5sZW5ndGggLSAxXTtcbiAgICBpZiAoYW1vdW50IDwgMCkgcmV0dXJuIHRoaXMuZmlyc3RLZXkoYW1vdW50ICogLTEpO1xuICAgIGlmICghYW1vdW50KSByZXR1cm4gW107XG4gICAgcmV0dXJuIGFyci5zbGljZSgtYW1vdW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgcmFuZG9tIGl0ZW0gZnJvbSB0aGUgY29sbGVjdGlvblxuICAgKi9cbiAgcmFuZG9tKCk6IFYgfCB1bmRlZmluZWQ7XG4gIHJhbmRvbShhbW91bnQ6IG51bWJlcik6IFZbXTtcbiAgcmFuZG9tKGFtb3VudD86IG51bWJlcik6IFYgfCBWW10gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGFyciA9IFsuLi50aGlzLnZhbHVlcygpXTtcbiAgICBpZiAoYW1vdW50ID09PSB1bmRlZmluZWQpIHJldHVybiBhcnJbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogYXJyLmxlbmd0aCldO1xuICAgIGlmICghYXJyLmxlbmd0aCB8fCAhYW1vdW50KSByZXR1cm4gW107XG4gICAgcmV0dXJuIEFycmF5LmZyb20oeyBsZW5ndGg6IE1hdGgubWluKGFtb3VudCwgYXJyLmxlbmd0aCkgfSwgKCkgPT4gYXJyLnNwbGljZShNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBhcnIubGVuZ3RoKSwgMSlbMF0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSByYW5kb20ga2V5IGZyb20gdGhlIGNvbGxlY3Rpb25cbiAgICovXG4gIHJhbmRvbUtleSgpOiBLIHwgdW5kZWZpbmVkO1xuICByYW5kb21LZXkoYW1vdW50OiBudW1iZXIpOiBLW107XG4gIHJhbmRvbUtleShhbW91bnQ/OiBudW1iZXIpOiBLIHwgS1tdIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBhcnIgPSBbLi4udGhpcy5rZXlzKCldO1xuICAgIGlmIChhbW91bnQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGFycltNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBhcnIubGVuZ3RoKV07XG4gICAgaWYgKCFhcnIubGVuZ3RoIHx8ICFhbW91bnQpIHJldHVybiBbXTtcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh7IGxlbmd0aDogTWF0aC5taW4oYW1vdW50LCBhcnIubGVuZ3RoKSB9LCAoKSA9PiBhcnIuc3BsaWNlKE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGFyci5sZW5ndGgpLCAxKVswXSk7XG4gIH1cblxuICAvKipcbiAgICogQ29tYmluZXMgdGhpcyBjb2xsZWN0aW9uIHdpdGggb3RoZXJzXG4gICAqL1xuICBjb25jYXQoLi4uY29sbGVjdGlvbnM6IENvbGxlY3Rpb248SywgVj5bXSk6IENvbGxlY3Rpb248SywgVj4ge1xuICAgIGNvbnN0IG5ld0NvbGwgPSB0aGlzLmNsb25lKCk7XG4gICAgZm9yIChjb25zdCBjb2xsIG9mIGNvbGxlY3Rpb25zKSB7XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbF0gb2YgY29sbCkgbmV3Q29sbC5zZXQoa2V5LCB2YWwpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3Q29sbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhpcyBjb2xsZWN0aW9uIHNoYXJlcyBpZGVudGljYWwgaXRlbXMgd2l0aCBhbm90aGVyXG4gICAqL1xuICBlcXVhbHMoY29sbGVjdGlvbjogQ29sbGVjdGlvbjxLLCBWPik6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzID09PSBjb2xsZWN0aW9uKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAodGhpcy5zaXplICE9PSBjb2xsZWN0aW9uLnNpemUpIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB0aGlzKSB7XG4gICAgICBpZiAoIWNvbGxlY3Rpb24uaGFzKGtleSkgfHwgdmFsdWUgIT09IGNvbGxlY3Rpb24uZ2V0KGtleSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGlkZW50aWNhbCBzaGFsbG93IGNvcHkgb2YgdGhpcyBjb2xsZWN0aW9uXG4gICAqL1xuICBjbG9uZSgpOiBDb2xsZWN0aW9uPEssIFY+IHtcbiAgICByZXR1cm4gbmV3IENvbGxlY3Rpb24odGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogU29ydHMgdGhlIGNvbGxlY3Rpb24gYW5kIHJldHVybnMgaXRcbiAgICovXG4gIHNvcnQoY29tcGFyZUZ1bmN0aW9uOiAoZmlyc3RWYWx1ZTogViwgc2Vjb25kVmFsdWU6IFYsIGZpcnN0S2V5OiBLLCBzZWNvbmRLZXk6IEspID0+IG51bWJlciA9IENvbGxlY3Rpb24uZGVmYXVsdFNvcnQpOiB0aGlzIHtcbiAgICBjb25zdCBlbnRyaWVzID0gWy4uLnRoaXMuZW50cmllcygpXTtcbiAgICBlbnRyaWVzLnNvcnQoKGEsIGIpID0+IGNvbXBhcmVGdW5jdGlvbihhWzFdLCBiWzFdLCBhWzBdLCBiWzBdKSk7XG4gICAgdGhpcy5jbGVhcigpO1xuICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIGVudHJpZXMpIHtcbiAgICAgIHRoaXMuc2V0KGssIHYpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTb3J0cyB0aGUgY29sbGVjdGlvbiBieSBrZXlzIGFuZCByZXR1cm5zIGl0XG4gICAqL1xuICBzb3J0QnlLZXkoY29tcGFyZUZ1bmN0aW9uOiAoZmlyc3RLZXk6IEssIHNlY29uZEtleTogSywgZmlyc3RWYWx1ZTogViwgc2Vjb25kVmFsdWU6IFYpID0+IG51bWJlciA9IENvbGxlY3Rpb24uZGVmYXVsdFNvcnQpOiB0aGlzIHtcbiAgICBjb25zdCBlbnRyaWVzID0gWy4uLnRoaXMuZW50cmllcygpXTtcbiAgICBlbnRyaWVzLnNvcnQoKGEsIGIpID0+IGNvbXBhcmVGdW5jdGlvbihhWzBdLCBiWzBdLCBhWzFdLCBiWzFdKSk7XG4gICAgdGhpcy5jbGVhcigpO1xuICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIGVudHJpZXMpIHtcbiAgICAgIHRoaXMuc2V0KGssIHYpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGl0ZW1zXG4gICAqL1xuICB0b0pTT04oKTogVltdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMudmFsdWVzKCldO1xuICB9XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgc29ydCBmdW5jdGlvblxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZGVmYXVsdFNvcnQ8Vj4oZmlyc3RWYWx1ZTogViwgc2Vjb25kVmFsdWU6IFYpOiBudW1iZXIge1xuICAgIHJldHVybiBOdW1iZXIoZmlyc3RWYWx1ZSA+IHNlY29uZFZhbHVlKSB8fCBOdW1iZXIoZmlyc3RWYWx1ZSA9PT0gc2Vjb25kVmFsdWUpIC0gMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgQ29sbGVjdGlvbiBmcm9tIGFuIGFycmF5XG4gICAqL1xuICBzdGF0aWMgZnJvbTxLLCBWPihlbnRyaWVzOiBJdGVyYWJsZTxyZWFkb25seSBbSywgVl0+KTogQ29sbGVjdGlvbjxLLCBWPiB7XG4gICAgcmV0dXJuIG5ldyBDb2xsZWN0aW9uKGVudHJpZXMpO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,305 @@
1
+ /**
2
+ * Collectors for awaiting messages, reactions, and interactions
3
+ * API compatible with Discord.js Collectors
4
+ */
5
+ import { EventEmitter } from 'events';
6
+ import { Collection } from './Collection';
7
+ /**
8
+ * Abstract base class for collectors
9
+ */
10
+ export class Collector extends EventEmitter {
11
+ /** The client that instantiated this collector */
12
+ client;
13
+ /** The items collected */
14
+ collected = new Collection();
15
+ /** Whether the collector has ended */
16
+ ended = false;
17
+ /** The reason the collector ended */
18
+ endReason = null;
19
+ /** Filter function */
20
+ filter;
21
+ /** Collector options */
22
+ options;
23
+ /** Number of items processed */
24
+ _processedCount = 0;
25
+ /** Timeout for time limit */
26
+ _timeout = null;
27
+ /** Timeout for idle limit */
28
+ _idleTimeout = null;
29
+ constructor(client, options = {}) {
30
+ super();
31
+ this.client = client;
32
+ this.options = options;
33
+ this.filter = options.filter ?? (() => true);
34
+ this.handleCollect = this.handleCollect.bind(this);
35
+ this.handleDispose = this.handleDispose.bind(this);
36
+ if (options.time) {
37
+ this._timeout = setTimeout(() => this.stop('time'), options.time);
38
+ }
39
+ if (options.idle) {
40
+ this._idleTimeout = setTimeout(() => this.stop('idle'), options.idle);
41
+ }
42
+ }
43
+ /**
44
+ * Handle an item being collected
45
+ */
46
+ async handleCollect(item) {
47
+ if (this.ended)
48
+ return;
49
+ this._processedCount++;
50
+ const filterResult = await this.filter(item, this.collected);
51
+ if (!filterResult)
52
+ return;
53
+ const key = this.collect(item);
54
+ if (key === null)
55
+ return;
56
+ this.collected.set(key, item);
57
+ this.emit('collect', item);
58
+ // Reset idle timer
59
+ if (this._idleTimeout) {
60
+ clearTimeout(this._idleTimeout);
61
+ this._idleTimeout = setTimeout(() => this.stop('idle'), this.options.idle);
62
+ }
63
+ // Check limits
64
+ if (this.options.max && this.collected.size >= this.options.max) {
65
+ this.stop('limit');
66
+ }
67
+ if (this.options.maxProcessed && this._processedCount >= this.options.maxProcessed) {
68
+ this.stop('processedLimit');
69
+ }
70
+ }
71
+ /**
72
+ * Handle an item being disposed
73
+ */
74
+ handleDispose(item) {
75
+ if (!this.options.dispose)
76
+ return;
77
+ const key = this.dispose(item);
78
+ if (key === null)
79
+ return;
80
+ if (this.collected.has(key)) {
81
+ this.collected.delete(key);
82
+ this.emit('dispose', item);
83
+ }
84
+ }
85
+ /**
86
+ * Stop the collector
87
+ */
88
+ stop(reason = 'user') {
89
+ if (this.ended)
90
+ return;
91
+ this.ended = true;
92
+ this.endReason = reason;
93
+ if (this._timeout) {
94
+ clearTimeout(this._timeout);
95
+ this._timeout = null;
96
+ }
97
+ if (this._idleTimeout) {
98
+ clearTimeout(this._idleTimeout);
99
+ this._idleTimeout = null;
100
+ }
101
+ this.emit('end', this.collected, reason);
102
+ }
103
+ /**
104
+ * Reset the collector's timer
105
+ */
106
+ resetTimer(options = {}) {
107
+ if (this._timeout) {
108
+ clearTimeout(this._timeout);
109
+ this._timeout = null;
110
+ }
111
+ if (this._idleTimeout) {
112
+ clearTimeout(this._idleTimeout);
113
+ this._idleTimeout = null;
114
+ }
115
+ if (options.time ?? this.options.time) {
116
+ this._timeout = setTimeout(() => this.stop('time'), options.time ?? this.options.time);
117
+ }
118
+ if (options.idle ?? this.options.idle) {
119
+ this._idleTimeout = setTimeout(() => this.stop('idle'), options.idle ?? this.options.idle);
120
+ }
121
+ }
122
+ /**
123
+ * Check the end conditions
124
+ */
125
+ checkEnd() {
126
+ const reason = this.endReason;
127
+ if (reason) {
128
+ this.stop(reason);
129
+ return true;
130
+ }
131
+ return false;
132
+ }
133
+ /**
134
+ * Get the next item
135
+ */
136
+ get next() {
137
+ return new Promise((resolve, reject) => {
138
+ if (this.ended) {
139
+ reject(new Error('Collector has ended'));
140
+ return;
141
+ }
142
+ const cleanup = () => {
143
+ this.removeListener('collect', onCollect);
144
+ this.removeListener('end', onEnd);
145
+ };
146
+ const onCollect = (item) => {
147
+ cleanup();
148
+ resolve(item);
149
+ };
150
+ const onEnd = () => {
151
+ cleanup();
152
+ reject(new Error('Collector ended'));
153
+ };
154
+ this.on('collect', onCollect);
155
+ this.on('end', onEnd);
156
+ });
157
+ }
158
+ }
159
+ /**
160
+ * Collector for messages
161
+ */
162
+ export class MessageCollector extends Collector {
163
+ channelId;
164
+ messageHandler;
165
+ constructor(client, channelId, options = {}) {
166
+ super(client, options);
167
+ this.channelId = channelId;
168
+ // Get bot's user ID to filter out bot's own messages
169
+ const botUserId = client.user?.id;
170
+ this.messageHandler = (message) => {
171
+ if (message.channel_id === this.channelId || message.channelId === this.channelId) {
172
+ // Automatically filter out bot's own messages
173
+ const authorId = message.author?.id || message.author_id;
174
+ if (botUserId && authorId === botUserId)
175
+ return;
176
+ // Also filter by application_id (bot messages have this)
177
+ if (message.application_id || message.applicationId)
178
+ return;
179
+ this.handleCollect(message);
180
+ }
181
+ };
182
+ client.on('messageCreate', this.messageHandler);
183
+ this.once('end', () => {
184
+ client.removeListener('messageCreate', this.messageHandler);
185
+ });
186
+ }
187
+ collect(message) {
188
+ return message.id ?? null;
189
+ }
190
+ dispose(message) {
191
+ return message.id ?? null;
192
+ }
193
+ }
194
+ /**
195
+ * Collector for interactions (buttons, select menus, etc.)
196
+ */
197
+ export class InteractionCollector extends Collector {
198
+ channelId;
199
+ guildId;
200
+ messageId;
201
+ interactionType;
202
+ componentType;
203
+ interactionHandler;
204
+ constructor(client, options = {}) {
205
+ super(client, options);
206
+ this.channelId = options.channelId;
207
+ this.guildId = options.guildId;
208
+ this.messageId = options.messageId;
209
+ this.interactionType = options.interactionType
210
+ ? Array.isArray(options.interactionType) ? options.interactionType : [options.interactionType]
211
+ : undefined;
212
+ this.componentType = options.componentType
213
+ ? Array.isArray(options.componentType) ? options.componentType : [options.componentType]
214
+ : undefined;
215
+ this.interactionHandler = (interaction) => {
216
+ // Filter by channel
217
+ if (this.channelId && interaction.channelId !== this.channelId)
218
+ return;
219
+ // Filter by guild
220
+ if (this.guildId && interaction.guildId !== this.guildId)
221
+ return;
222
+ // Filter by message
223
+ if (this.messageId && interaction.message?.id !== this.messageId)
224
+ return;
225
+ // Filter by interaction type
226
+ if (this.interactionType && !this.interactionType.includes(interaction.type))
227
+ return;
228
+ // Filter by component type
229
+ if (this.componentType && interaction.componentType && !this.componentType.includes(interaction.componentType))
230
+ return;
231
+ this.handleCollect(interaction);
232
+ };
233
+ client.on('interactionCreate', this.interactionHandler);
234
+ this.once('end', () => {
235
+ client.removeListener('interactionCreate', this.interactionHandler);
236
+ });
237
+ }
238
+ collect(interaction) {
239
+ return interaction.id ?? null;
240
+ }
241
+ dispose(interaction) {
242
+ return interaction.id ?? null;
243
+ }
244
+ }
245
+ /**
246
+ * Collector for reactions
247
+ */
248
+ export class ReactionCollector extends Collector {
249
+ messageId;
250
+ reactionHandler;
251
+ constructor(client, messageId, options) {
252
+ super(client, options);
253
+ this.messageId = messageId;
254
+ this.reactionHandler = (reaction) => {
255
+ if (reaction.message_id === this.messageId || reaction.messageId === this.messageId) {
256
+ this.handleCollect(reaction);
257
+ }
258
+ };
259
+ client.on('messageReactionAdd', this.reactionHandler);
260
+ this.once('end', () => {
261
+ client.removeListener('messageReactionAdd', this.reactionHandler);
262
+ });
263
+ }
264
+ collect(reaction) {
265
+ // Key is emoji identifier
266
+ return reaction.emoji?.id ?? reaction.emoji?.name ?? null;
267
+ }
268
+ dispose(reaction) {
269
+ return reaction.emoji?.id ?? reaction.emoji?.name ?? null;
270
+ }
271
+ }
272
+ /**
273
+ * Await messages helper
274
+ */
275
+ export function awaitMessages(client, channelId, options = {}) {
276
+ return new Promise((resolve, reject) => {
277
+ const collector = new MessageCollector(client, channelId, options);
278
+ collector.once('end', (collected, reason) => {
279
+ if (options.max && collected.size < options.max) {
280
+ reject(new Error(`Collector ended with reason: ${reason}`));
281
+ }
282
+ else {
283
+ resolve(collected);
284
+ }
285
+ });
286
+ });
287
+ }
288
+ /**
289
+ * Await reactions helper
290
+ */
291
+ export function awaitReactions(client, messageId, options) {
292
+ return new Promise((resolve, reject) => {
293
+ const collector = new ReactionCollector(client, messageId, options);
294
+ collector.once('end', (collected, reason) => {
295
+ if (options.max && collected.size < options.max) {
296
+ reject(new Error(`Collector ended with reason: ${reason}`));
297
+ }
298
+ else {
299
+ resolve(collected);
300
+ }
301
+ });
302
+ });
303
+ }
304
+ export default Collector;
305
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29sbGVjdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3V0aWxzL0NvbGxlY3Rvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFzQjFDOztHQUVHO0FBQ0gsTUFBTSxPQUFnQixTQUErQixTQUFRLFlBQVk7SUFDdkUsa0RBQWtEO0lBQ2xDLE1BQU0sQ0FBTTtJQUU1QiwwQkFBMEI7SUFDVixTQUFTLEdBQXFCLElBQUksVUFBVSxFQUFFLENBQUM7SUFFL0Qsc0NBQXNDO0lBQy9CLEtBQUssR0FBRyxLQUFLLENBQUM7SUFFckIscUNBQXFDO0lBQzlCLFNBQVMsR0FBa0IsSUFBSSxDQUFDO0lBRXZDLHNCQUFzQjtJQUNmLE1BQU0sQ0FBdUU7SUFFcEYsd0JBQXdCO0lBQ2pCLE9BQU8sQ0FBc0I7SUFFcEMsZ0NBQWdDO0lBQ3hCLGVBQWUsR0FBRyxDQUFDLENBQUM7SUFFNUIsNkJBQTZCO0lBQ3JCLFFBQVEsR0FBMEIsSUFBSSxDQUFDO0lBRS9DLDZCQUE2QjtJQUNyQixZQUFZLEdBQTBCLElBQUksQ0FBQztJQUVuRCxZQUFZLE1BQVcsRUFBRSxVQUErQixFQUFFO1FBQ3hELEtBQUssRUFBRSxDQUFDO1FBQ1IsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsSUFBSSxDQUFDLE1BQU0sR0FBSSxPQUFPLENBQUMsTUFBYyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFdEQsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuRCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUks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QztRQUVwRSxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUMxQyxJQUFJLE9BQU8sQ0FBQyxHQUFHLElBQUksU0FBUyxDQUFDLElBQUksR0FBRyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQ2hELE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxnQ0FBZ0MsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzlELENBQUM7aUJBQU0sQ0FBQztnQkFDTixPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDckIsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsZUFBZSxTQUFTLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvbGxlY3RvcnMgZm9yIGF3YWl0aW5nIG1lc3NhZ2VzLCByZWFjdGlvbnMsIGFuZCBpbnRlcmFjdGlvbnNcbiAqIEFQSSBjb21wYXRpYmxlIHdpdGggRGlzY29yZC5qcyBDb2xsZWN0b3JzXG4gKi9cblxuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnZXZlbnRzJztcbmltcG9ydCB7IENvbGxlY3Rpb24gfSBmcm9tICcuL0NvbGxlY3Rpb24nO1xuXG5leHBvcnQgaW50ZXJmYWNlIENvbGxlY3Rvck9wdGlvbnM8VD4ge1xuICAvKiogSG93IGxvbmcgdG8gcnVuIHRoZSBjb2xsZWN0b3IgZm9yIGluIG1pbGxpc2Vjb25kcyAqL1xuICB0aW1lPzogbnVtYmVyO1xuICAvKiogSG93IGxvbmcgdG8gd2FpdCBmb3IgdGhlIG5leHQgaXRlbSBpbiBtaWxsaXNlY29uZHMgKi9cbiAgaWRsZT86IG51bWJlcjtcbiAgLyoqIE1heGltdW0gbnVtYmVyIG9mIGl0ZW1zIHRvIGNvbGxlY3QgKi9cbiAgbWF4PzogbnVtYmVyO1xuICAvKiogTWF4aW11bSBudW1iZXIgb2YgaXRlbXMgdG8gcHJvY2VzcyAqL1xuICBtYXhQcm9jZXNzZWQ/OiBudW1iZXI7XG4gIC8qKiBGaWx0ZXIgZnVuY3Rpb24gKi9cbiAgZmlsdGVyPzogKGl0ZW06IFQsIGNvbGxlY3RlZDogQ29sbGVjdGlvbjxzdHJpbmcsIFQ+KSA9PiBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPjtcbiAgLyoqIFdoZXRoZXIgdG8gZGlzcG9zZSBvZiBpdGVtcyB3aGVuIHRoZSBjb2xsZWN0b3IgZW5kcyAqL1xuICBkaXNwb3NlPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb2xsZWN0b3JSZXNldFRpbWVyT3B0aW9ucyB7XG4gIHRpbWU/OiBudW1iZXI7XG4gIGlkbGU/OiBudW1iZXI7XG59XG5cbi8qKlxuICogQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgY29sbGVjdG9yc1xuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ29sbGVjdG9yPEsgZXh0ZW5kcyBzdHJpbmcsIFY+IGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgLyoqIFRoZSBjbGllbnQgdGhhdCBpbnN0YW50aWF0ZWQgdGhpcyBjb2xsZWN0b3IgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNsaWVudDogYW55O1xuICBcbiAgLyoqIFRoZSBpdGVtcyBjb2xsZWN0ZWQgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNvbGxlY3RlZDogQ29sbGVjdGlvbjxLLCBWPiA9IG5ldyBDb2xsZWN0aW9uKCk7XG4gIFxuICAvKiogV2hldGhlciB0aGUgY29sbGVjdG9yIGhhcyBlbmRlZCAqL1xuICBwdWJsaWMgZW5kZWQgPSBmYWxzZTtcbiAgXG4gIC8qKiBUaGUgcmVhc29uIHRoZSBjb2xsZWN0b3IgZW5kZWQgKi9cbiAgcHVibGljIGVuZFJlYXNvbjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIFxuICAvKiogRmlsdGVyIGZ1bmN0aW9uICovXG4gIHB1YmxpYyBmaWx0ZXI6IChpdGVtOiBWLCBjb2xsZWN0ZWQ6IENvbGxlY3Rpb248SywgVj4pID0+IGJvb2xlYW4gfCBQcm9taXNlPGJvb2xlYW4+O1xuICBcbiAgLyoqIENvbGxlY3RvciBvcHRpb25zICovXG4gIHB1YmxpYyBvcHRpb25zOiBDb2xsZWN0b3JPcHRpb25zPFY+O1xuICBcbiAgLyoqIE51bWJlciBvZiBpdGVtcyBwcm9jZXNzZWQgKi9cbiAgcHJpdmF0ZSBfcHJvY2Vzc2VkQ291bnQgPSAwO1xuICBcbiAgLyoqIFRpbWVvdXQgZm9yIHRpbWUgbGltaXQgKi9cbiAgcHJpdmF0ZSBfdGltZW91dDogTm9kZUpTLlRpbWVvdXQgfCBudWxsID0gbnVsbDtcbiAgXG4gIC8qKiBUaW1lb3V0IGZvciBpZGxlIGxpbWl0ICovXG4gIHByaXZhdGUgX2lkbGVUaW1lb3V0OiBOb2RlSlMuVGltZW91dCB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKGNsaWVudDogYW55LCBvcHRpb25zOiBDb2xsZWN0b3JPcHRpb25zPFY+ID0ge30pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuY2xpZW50ID0gY2xpZW50O1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgdGhpcy5maWx0ZXIgPSAob3B0aW9ucy5maWx0ZXIgYXMgYW55KSA/PyAoKCkgPT4gdHJ1ZSk7XG4gICAgXG4gICAgdGhpcy5oYW5kbGVDb2xsZWN0ID0gdGhpcy5oYW5kbGVDb2xsZWN0LmJpbmQodGhpcyk7XG4gICAgdGhpcy5oYW5kbGVEaXNwb3NlID0gdGhpcy5oYW5kbGVEaXNwb3NlLmJpbmQodGhpcyk7XG4gICAgXG4gICAgaWYgKG9wdGlvbnMudGltZSkge1xuICAgICAgdGhpcy5fdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zdG9wKCd0aW1lJyksIG9wdGlvbnMudGltZSk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmlkbGUpIHtcbiAgICAgIHRoaXMuX2lkbGVUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB0aGlzLnN0b3AoJ2lkbGUnKSwgb3B0aW9ucy5pZGxlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGFuIGl0ZW0gYmVpbmcgY29sbGVjdGVkXG4gICAqL1xuICBhc3luYyBoYW5kbGVDb2xsZWN0KGl0ZW06IFYpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5lbmRlZCkgcmV0dXJuO1xuICAgIFxuICAgIHRoaXMuX3Byb2Nlc3NlZENvdW50Kys7XG4gICAgXG4gICAgY29uc3QgZmlsdGVyUmVzdWx0ID0gYXdhaXQgdGhpcy5maWx0ZXIoaXRlbSwgdGhpcy5jb2xsZWN0ZWQpO1xuICAgIGlmICghZmlsdGVyUmVzdWx0KSByZXR1cm47XG4gICAgXG4gICAgY29uc3Qga2V5ID0gdGhpcy5jb2xsZWN0KGl0ZW0pO1xuICAgIGlmIChrZXkgPT09IG51bGwpIHJldHVybjtcbiAgICBcbiAgICB0aGlzLmNvbGxlY3RlZC5zZXQoa2V5LCBpdGVtKTtcbiAgICB0aGlzLmVtaXQoJ2NvbGxlY3QnLCBpdGVtKTtcbiAgICBcbiAgICAvLyBSZXNldCBpZGxlIHRpbWVyXG4gICAgaWYgKHRoaXMuX2lkbGVUaW1lb3V0KSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5faWRsZVRpbWVvdXQpO1xuICAgICAgdGhpcy5faWRsZVRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc3RvcCgnaWRsZScpLCB0aGlzLm9wdGlvbnMuaWRsZSEpO1xuICAgIH1cbiAgICBcbiAgICAvLyBDaGVjayBsaW1pdHNcbiAgICBpZiAodGhpcy5vcHRpb25zLm1heCAmJiB0aGlzLmNvbGxlY3RlZC5zaXplID49IHRoaXMub3B0aW9ucy5tYXgpIHtcbiAgICAgIHRoaXMuc3RvcCgnbGltaXQnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMub3B0aW9ucy5tYXhQcm9jZXNzZWQgJiYgdGhpcy5fcHJvY2Vzc2VkQ291bnQgPj0gdGhpcy5vcHRpb25zLm1heFByb2Nlc3NlZCkge1xuICAgICAgdGhpcy5zdG9wKCdwcm9jZXNzZWRMaW1pdCcpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgYW4gaXRlbSBiZWluZyBkaXNwb3NlZFxuICAgKi9cbiAgaGFuZGxlRGlzcG9zZShpdGVtOiBWKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm9wdGlvbnMuZGlzcG9zZSkgcmV0dXJuO1xuICAgIFxuICAgIGNvbnN0IGtleSA9IHRoaXMuZGlzcG9zZShpdGVtKTtcbiAgICBpZiAoa2V5ID09PSBudWxsKSByZXR1cm47XG4gICAgXG4gICAgaWYgKHRoaXMuY29sbGVjdGVkLmhhcyhrZXkpKSB7XG4gICAgICB0aGlzLmNvbGxlY3RlZC5kZWxldGUoa2V5KTtcbiAgICAgIHRoaXMuZW1pdCgnZGlzcG9zZScsIGl0ZW0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGtleSBmb3IgYW4gaXRlbVxuICAgKi9cbiAgYWJzdHJhY3QgY29sbGVjdChpdGVtOiBWKTogSyB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEdldCB0aGUga2V5IGZvciBkaXNwb3NpbmcgYW4gaXRlbVxuICAgKi9cbiAgYWJzdHJhY3QgZGlzcG9zZShpdGVtOiBWKTogSyB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFN0b3AgdGhlIGNvbGxlY3RvclxuICAgKi9cbiAgc3RvcChyZWFzb24gPSAndXNlcicpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5lbmRlZCkgcmV0dXJuO1xuICAgIFxuICAgIHRoaXMuZW5kZWQgPSB0cnVlO1xuICAgIHRoaXMuZW5kUmVhc29uID0gcmVhc29uO1xuICAgIFxuICAgIGlmICh0aGlzLl90aW1lb3V0KSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5fdGltZW91dCk7XG4gICAgICB0aGlzLl90aW1lb3V0ID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2lkbGVUaW1lb3V0KSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5faWRsZVRpbWVvdXQpO1xuICAgICAgdGhpcy5faWRsZVRpbWVvdXQgPSBudWxsO1xuICAgIH1cbiAgICBcbiAgICB0aGlzLmVtaXQoJ2VuZCcsIHRoaXMuY29sbGVjdGVkLCByZWFzb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IHRoZSBjb2xsZWN0b3IncyB0aW1lclxuICAgKi9cbiAgcmVzZXRUaW1lcihvcHRpb25zOiBDb2xsZWN0b3JSZXNldFRpbWVyT3B0aW9ucyA9IHt9KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3RpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLl90aW1lb3V0KTtcbiAgICAgIHRoaXMuX3RpbWVvdXQgPSBudWxsO1xuICAgIH1cbiAgICBpZiAodGhpcy5faWRsZVRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9pZGxlVGltZW91dCk7XG4gICAgICB0aGlzLl9pZGxlVGltZW91dCA9IG51bGw7XG4gICAgfVxuICAgIFxuICAgIGlmIChvcHRpb25zLnRpbWUgPz8gdGhpcy5vcHRpb25zLnRpbWUpIHtcbiAgICAgIHRoaXMuX3RpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc3RvcCgndGltZScpLCBvcHRpb25zLnRpbWUgPz8gdGhpcy5vcHRpb25zLnRpbWUpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5pZGxlID8/IHRoaXMub3B0aW9ucy5pZGxlKSB7XG4gICAgICB0aGlzLl9pZGxlVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zdG9wKCdpZGxlJyksIG9wdGlvbnMuaWRsZSA/PyB0aGlzLm9wdGlvbnMuaWRsZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIHRoZSBlbmQgY29uZGl0aW9uc1xuICAgKi9cbiAgY2hlY2tFbmQoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcmVhc29uID0gdGhpcy5lbmRSZWFzb247XG4gICAgaWYgKHJlYXNvbikge1xuICAgICAgdGhpcy5zdG9wKHJlYXNvbik7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbmV4dCBpdGVtXG4gICAqL1xuICBnZXQgbmV4dCgpOiBQcm9taXNlPFY+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgaWYgKHRoaXMuZW5kZWQpIHtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignQ29sbGVjdG9yIGhhcyBlbmRlZCcpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgXG4gICAgICBjb25zdCBjbGVhbnVwID0gKCkgPT4ge1xuICAgICAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKCdjb2xsZWN0Jywgb25Db2xsZWN0KTtcbiAgICAgICAgdGhpcy5yZW1vdmVMaXN0ZW5lcignZW5kJywgb25FbmQpO1xuICAgICAgfTtcbiAgICAgIFxuICAgICAgY29uc3Qgb25Db2xsZWN0ID0gKGl0ZW06IFYpID0+IHtcbiAgICAgICAgY2xlYW51cCgpO1xuICAgICAgICByZXNvbHZlKGl0ZW0pO1xuICAgICAgfTtcbiAgICAgIFxuICAgICAgY29uc3Qgb25FbmQgPSAoKSA9PiB7XG4gICAgICAgIGNsZWFudXAoKTtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignQ29sbGVjdG9yIGVuZGVkJykpO1xuICAgICAgfTtcbiAgICAgIFxuICAgICAgdGhpcy5vbignY29sbGVjdCcsIG9uQ29sbGVjdCk7XG4gICAgICB0aGlzLm9uKCdlbmQnLCBvbkVuZCk7XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBNZXNzYWdlIGNvbGxlY3RvciBvcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWVzc2FnZUNvbGxlY3Rvck9wdGlvbnMgZXh0ZW5kcyBDb2xsZWN0b3JPcHRpb25zPGFueT4ge1xuICAvKiogQ2hhbm5lbCB0byBjb2xsZWN0IG1lc3NhZ2VzIGZyb20gKi9cbiAgY2hhbm5lbElkPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbGxlY3RvciBmb3IgbWVzc2FnZXNcbiAqL1xuZXhwb3J0IGNsYXNzIE1lc3NhZ2VDb2xsZWN0b3IgZXh0ZW5kcyBDb2xsZWN0b3I8c3RyaW5nLCBhbnk+IHtcbiAgcHVibGljIHJlYWRvbmx5IGNoYW5uZWxJZDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IG1lc3NhZ2VIYW5kbGVyOiAobWVzc2FnZTogYW55KSA9PiB2b2lkO1xuXG4gIGNvbnN0cnVjdG9yKGNsaWVudDogYW55LCBjaGFubmVsSWQ6IHN0cmluZywgb3B0aW9uczogTWVzc2FnZUNvbGxlY3Rvck9wdGlvbnMgPSB7fSkge1xuICAgIHN1cGVyKGNsaWVudCwgb3B0aW9ucyk7XG4gICAgdGhpcy5jaGFubmVsSWQgPSBjaGFubmVsSWQ7XG4gICAgXG4gICAgLy8gR2V0IGJvdCdzIHVzZXIgSUQgdG8gZmlsdGVyIG91dCBib3QncyBvd24gbWVzc2FnZXNcbiAgICBjb25zdCBib3RVc2VySWQgPSBjbGllbnQudXNlcj8uaWQ7XG4gICAgXG4gICAgdGhpcy5tZXNzYWdlSGFuZGxlciA9IChtZXNzYWdlOiBhbnkpID0+IHtcbiAgICAgIGlmIChtZXNzYWdlLmNoYW5uZWxfaWQgPT09IHRoaXMuY2hhbm5lbElkIHx8IG1lc3NhZ2UuY2hhbm5lbElkID09PSB0aGlzLmNoYW5uZWxJZCkge1xuICAgICAgICAvLyBBdXRvbWF0aWNhbGx5IGZpbHRlciBvdXQgYm90J3Mgb3duIG1lc3NhZ2VzXG4gICAgICAgIGNvbnN0IGF1dGhvcklkID0gbWVzc2FnZS5hdXRob3I/LmlkIHx8IG1lc3NhZ2UuYXV0aG9yX2lkO1xuICAgICAgICBpZiAoYm90VXNlcklkICYmIGF1dGhvcklkID09PSBib3RVc2VySWQpIHJldHVybjtcbiAgICAgICAgXG4gICAgICAgIC8vIEFsc28gZmlsdGVyIGJ5IGFwcGxpY2F0aW9uX2lkIChib3QgbWVzc2FnZXMgaGF2ZSB0aGlzKVxuICAgICAgICBpZiAobWVzc2FnZS5hcHBsaWNhdGlvbl9pZCB8fCBtZXNzYWdlLmFwcGxpY2F0aW9uSWQpIHJldHVybjtcbiAgICAgICAgXG4gICAgICAgIHRoaXMuaGFuZGxlQ29sbGVjdChtZXNzYWdlKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIFxuICAgIGNsaWVudC5vbignbWVzc2FnZUNyZWF0ZScsIHRoaXMubWVzc2FnZUhhbmRsZXIpO1xuICAgIFxuICAgIHRoaXMub25jZSgnZW5kJywgKCkgPT4ge1xuICAgICAgY2xpZW50LnJlbW92ZUxpc3RlbmVyKCdtZXNzYWdlQ3JlYXRlJywgdGhpcy5tZXNzYWdlSGFuZGxlcik7XG4gICAgfSk7XG4gIH1cblxuICBjb2xsZWN0KG1lc3NhZ2U6IGFueSk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiBtZXNzYWdlLmlkID8/IG51bGw7XG4gIH1cblxuICBkaXNwb3NlKG1lc3NhZ2U6IGFueSk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiBtZXNzYWdlLmlkID8/IG51bGw7XG4gIH1cbn1cblxuLyoqXG4gKiBJbnRlcmFjdGlvbiBjb2xsZWN0b3Igb3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEludGVyYWN0aW9uQ29sbGVjdG9yT3B0aW9ucyBleHRlbmRzIENvbGxlY3Rvck9wdGlvbnM8YW55PiB7XG4gIC8qKiBDaGFubmVsIHRvIGNvbGxlY3QgaW50ZXJhY3Rpb25zIGZyb20gKi9cbiAgY2hhbm5lbElkPzogc3RyaW5nO1xuICAvKiogR3VpbGQgdG8gY29sbGVjdCBpbnRlcmFjdGlvbnMgZnJvbSAqL1xuICBndWlsZElkPzogc3RyaW5nO1xuICAvKiogTWVzc2FnZSB0byBjb2xsZWN0IGludGVyYWN0aW9ucyBmcm9tICovXG4gIG1lc3NhZ2VJZD86IHN0cmluZztcbiAgLyoqIEludGVyYWN0aW9uIHR5cGVzIHRvIGNvbGxlY3QgKi9cbiAgaW50ZXJhY3Rpb25UeXBlPzogbnVtYmVyIHwgbnVtYmVyW107XG4gIC8qKiBDb21wb25lbnQgdHlwZXMgdG8gY29sbGVjdCAqL1xuICBjb21wb25lbnRUeXBlPzogbnVtYmVyIHwgbnVtYmVyW107XG59XG5cbi8qKlxuICogQ29sbGVjdG9yIGZvciBpbnRlcmFjdGlvbnMgKGJ1dHRvbnMsIHNlbGVjdCBtZW51cywgZXRjLilcbiAqL1xuZXhwb3J0IGNsYXNzIEludGVyYWN0aW9uQ29sbGVjdG9yIGV4dGVuZHMgQ29sbGVjdG9yPHN0cmluZywgYW55PiB7XG4gIHB1YmxpYyByZWFkb25seSBjaGFubmVsSWQ/OiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSBndWlsZElkPzogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgbWVzc2FnZUlkPzogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgaW50ZXJhY3Rpb25UeXBlPzogbnVtYmVyW107XG4gIHB1YmxpYyByZWFkb25seSBjb21wb25lbnRUeXBlPzogbnVtYmVyW107XG4gIHByaXZhdGUgcmVhZG9ubHkgaW50ZXJhY3Rpb25IYW5kbGVyOiAoaW50ZXJhY3Rpb246IGFueSkgPT4gdm9pZDtcblxuICBjb25zdHJ1Y3RvcihjbGllbnQ6IGFueSwgb3B0aW9uczogSW50ZXJhY3Rpb25Db2xsZWN0b3JPcHRpb25zID0ge30pIHtcbiAgICBzdXBlcihjbGllbnQsIG9wdGlvbnMpO1xuICAgIHRoaXMuY2hhbm5lbElkID0gb3B0aW9ucy5jaGFubmVsSWQ7XG4gICAgdGhpcy5ndWlsZElkID0gb3B0aW9ucy5ndWlsZElkO1xuICAgIHRoaXMubWVzc2FnZUlkID0gb3B0aW9ucy5tZXNzYWdlSWQ7XG4gICAgdGhpcy5pbnRlcmFjdGlvblR5cGUgPSBvcHRpb25zLmludGVyYWN0aW9uVHlwZSBcbiAgICAgID8gQXJyYXkuaXNBcnJheShvcHRpb25zLmludGVyYWN0aW9uVHlwZSkgPyBvcHRpb25zLmludGVyYWN0aW9uVHlwZSA6IFtvcHRpb25zLmludGVyYWN0aW9uVHlwZV1cbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIHRoaXMuY29tcG9uZW50VHlwZSA9IG9wdGlvbnMuY29tcG9uZW50VHlwZVxuICAgICAgPyBBcnJheS5pc0FycmF5KG9wdGlvbnMuY29tcG9uZW50VHlwZSkgPyBvcHRpb25zLmNvbXBvbmVudFR5cGUgOiBbb3B0aW9ucy5jb21wb25lbnRUeXBlXVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgXG4gICAgdGhpcy5pbnRlcmFjdGlvbkhhbmRsZXIgPSAoaW50ZXJhY3Rpb246IGFueSkgPT4ge1xuICAgICAgLy8gRmlsdGVyIGJ5IGNoYW5uZWxcbiAgICAgIGlmICh0aGlzLmNoYW5uZWxJZCAmJiBpbnRlcmFjdGlvbi5jaGFubmVsSWQgIT09IHRoaXMuY2hhbm5lbElkKSByZXR1cm47XG4gICAgICAvLyBGaWx0ZXIgYnkgZ3VpbGRcbiAgICAgIGlmICh0aGlzLmd1aWxkSWQgJiYgaW50ZXJhY3Rpb24uZ3VpbGRJZCAhPT0gdGhpcy5ndWlsZElkKSByZXR1cm47XG4gICAgICAvLyBGaWx0ZXIgYnkgbWVzc2FnZVxuICAgICAgaWYgKHRoaXMubWVzc2FnZUlkICYmIGludGVyYWN0aW9uLm1lc3NhZ2U/LmlkICE9PSB0aGlzLm1lc3NhZ2VJZCkgcmV0dXJuO1xuICAgICAgLy8gRmlsdGVyIGJ5IGludGVyYWN0aW9uIHR5cGVcbiAgICAgIGlmICh0aGlzLmludGVyYWN0aW9uVHlwZSAmJiAhdGhpcy5pbnRlcmFjdGlvblR5cGUuaW5jbHVkZXMoaW50ZXJhY3Rpb24udHlwZSkpIHJldHVybjtcbiAgICAgIC8vIEZpbHRlciBieSBjb21wb25lbnQgdHlwZVxuICAgICAgaWYgKHRoaXMuY29tcG9uZW50VHlwZSAmJiBpbnRlcmFjdGlvbi5jb21wb25lbnRUeXBlICYmICF0aGlzLmNvbXBvbmVudFR5cGUuaW5jbHVkZXMoaW50ZXJhY3Rpb24uY29tcG9uZW50VHlwZSkpIHJldHVybjtcbiAgICAgIFxuICAgICAgdGhpcy5oYW5kbGVDb2xsZWN0KGludGVyYWN0aW9uKTtcbiAgICB9O1xuICAgIFxuICAgIGNsaWVudC5vbignaW50ZXJhY3Rpb25DcmVhdGUnLCB0aGlzLmludGVyYWN0aW9uSGFuZGxlcik7XG4gICAgXG4gICAgdGhpcy5vbmNlKCdlbmQnLCAoKSA9PiB7XG4gICAgICBjbGllbnQucmVtb3ZlTGlzdGVuZXIoJ2ludGVyYWN0aW9uQ3JlYXRlJywgdGhpcy5pbnRlcmFjdGlvbkhhbmRsZXIpO1xuICAgIH0pO1xuICB9XG5cbiAgY29sbGVjdChpbnRlcmFjdGlvbjogYW55KTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIGludGVyYWN0aW9uLmlkID8/IG51bGw7XG4gIH1cblxuICBkaXNwb3NlKGludGVyYWN0aW9uOiBhbnkpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gaW50ZXJhY3Rpb24uaWQgPz8gbnVsbDtcbiAgfVxufVxuXG4vKipcbiAqIFJlYWN0aW9uIGNvbGxlY3RvciBvcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVhY3Rpb25Db2xsZWN0b3JPcHRpb25zIGV4dGVuZHMgQ29sbGVjdG9yT3B0aW9uczxhbnk+IHtcbiAgLyoqIE1lc3NhZ2UgdG8gY29sbGVjdCByZWFjdGlvbnMgZnJvbSAqL1xuICBtZXNzYWdlSWQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb2xsZWN0b3IgZm9yIHJlYWN0aW9uc1xuICovXG5leHBvcnQgY2xhc3MgUmVhY3Rpb25Db2xsZWN0b3IgZXh0ZW5kcyBDb2xsZWN0b3I8c3RyaW5nLCBhbnk+IHtcbiAgcHVibGljIHJlYWRvbmx5IG1lc3NhZ2VJZDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlYWN0aW9uSGFuZGxlcjogKHJlYWN0aW9uOiBhbnkpID0+IHZvaWQ7XG5cbiAgY29uc3RydWN0b3IoY2xpZW50OiBhbnksIG1lc3NhZ2VJZDogc3RyaW5nLCBvcHRpb25zOiBSZWFjdGlvbkNvbGxlY3Rvck9wdGlvbnMpIHtcbiAgICBzdXBlcihjbGllbnQsIG9wdGlvbnMpO1xuICAgIHRoaXMubWVzc2FnZUlkID0gbWVzc2FnZUlkO1xuICAgIFxuICAgIHRoaXMucmVhY3Rpb25IYW5kbGVyID0gKHJlYWN0aW9uOiBhbnkpID0+IHtcbiAgICAgIGlmIChyZWFjdGlvbi5tZXNzYWdlX2lkID09PSB0aGlzLm1lc3NhZ2VJZCB8fCByZWFjdGlvbi5tZXNzYWdlSWQgPT09IHRoaXMubWVzc2FnZUlkKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlQ29sbGVjdChyZWFjdGlvbik7XG4gICAgICB9XG4gICAgfTtcbiAgICBcbiAgICBjbGllbnQub24oJ21lc3NhZ2VSZWFjdGlvbkFkZCcsIHRoaXMucmVhY3Rpb25IYW5kbGVyKTtcbiAgICBcbiAgICB0aGlzLm9uY2UoJ2VuZCcsICgpID0+IHtcbiAgICAgIGNsaWVudC5yZW1vdmVMaXN0ZW5lcignbWVzc2FnZVJlYWN0aW9uQWRkJywgdGhpcy5yZWFjdGlvbkhhbmRsZXIpO1xuICAgIH0pO1xuICB9XG5cbiAgY29sbGVjdChyZWFjdGlvbjogYW55KTogc3RyaW5nIHwgbnVsbCB7XG4gICAgLy8gS2V5IGlzIGVtb2ppIGlkZW50aWZpZXJcbiAgICByZXR1cm4gcmVhY3Rpb24uZW1vamk/LmlkID8/IHJlYWN0aW9uLmVtb2ppPy5uYW1lID8/IG51bGw7XG4gIH1cblxuICBkaXNwb3NlKHJlYWN0aW9uOiBhbnkpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gcmVhY3Rpb24uZW1vamk/LmlkID8/IHJlYWN0aW9uLmVtb2ppPy5uYW1lID8/IG51bGw7XG4gIH1cbn1cblxuLyoqXG4gKiBBd2FpdCBtZXNzYWdlcyBoZWxwZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGF3YWl0TWVzc2FnZXMoXG4gIGNsaWVudDogYW55LFxuICBjaGFubmVsSWQ6IHN0cmluZyxcbiAgb3B0aW9uczogTWVzc2FnZUNvbGxlY3Rvck9wdGlvbnMgPSB7fVxuKTogUHJvbWlzZTxDb2xsZWN0aW9uPHN0cmluZywgYW55Pj4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IGNvbGxlY3RvciA9IG5ldyBNZXNzYWdlQ29sbGVjdG9yKGNsaWVudCwgY2hhbm5lbElkLCBvcHRpb25zKTtcbiAgICBcbiAgICBjb2xsZWN0b3Iub25jZSgnZW5kJywgKGNvbGxlY3RlZCwgcmVhc29uKSA9PiB7XG4gICAgICBpZiAob3B0aW9ucy5tYXggJiYgY29sbGVjdGVkLnNpemUgPCBvcHRpb25zLm1heCkge1xuICAgICAgICByZWplY3QobmV3IEVycm9yKGBDb2xsZWN0b3IgZW5kZWQgd2l0aCByZWFzb246ICR7cmVhc29ufWApKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc29sdmUoY29sbGVjdGVkKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59XG5cbi8qKlxuICogQXdhaXQgcmVhY3Rpb25zIGhlbHBlclxuICovXG5leHBvcnQgZnVuY3Rpb24gYXdhaXRSZWFjdGlvbnMoXG4gIGNsaWVudDogYW55LFxuICBtZXNzYWdlSWQ6IHN0cmluZyxcbiAgb3B0aW9uczogUmVhY3Rpb25Db2xsZWN0b3JPcHRpb25zXG4pOiBQcm9taXNlPENvbGxlY3Rpb248c3RyaW5nLCBhbnk+PiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3QgY29sbGVjdG9yID0gbmV3IFJlYWN0aW9uQ29sbGVjdG9yKGNsaWVudCwgbWVzc2FnZUlkLCBvcHRpb25zKTtcbiAgICBcbiAgICBjb2xsZWN0b3Iub25jZSgnZW5kJywgKGNvbGxlY3RlZCwgcmVhc29uKSA9PiB7XG4gICAgICBpZiAob3B0aW9ucy5tYXggJiYgY29sbGVjdGVkLnNpemUgPCBvcHRpb25zLm1heCkge1xuICAgICAgICByZWplY3QobmV3IEVycm9yKGBDb2xsZWN0b3IgZW5kZWQgd2l0aCByZWFzb246ICR7cmVhc29ufWApKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc29sdmUoY29sbGVjdGVkKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IENvbGxlY3RvcjtcbiJdfQ==