@discordeno/utils 19.0.0-next.40c19da → 19.0.0-next.4142946

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 (128) hide show
  1. package/README.md +7 -144
  2. package/dist/cjs/Collection.cjs +122 -0
  3. package/dist/cjs/base64.cjs +276 -0
  4. package/dist/cjs/bucket.cjs +96 -0
  5. package/dist/cjs/builders/embeds.cjs +292 -0
  6. package/dist/cjs/builders.cjs +27 -0
  7. package/dist/cjs/casing.cjs +75 -0
  8. package/dist/cjs/colors.cjs +456 -0
  9. package/dist/cjs/hash.cjs +37 -0
  10. package/dist/cjs/images.cjs +136 -0
  11. package/dist/cjs/index.cjs +36 -0
  12. package/dist/cjs/logger.cjs +157 -0
  13. package/dist/cjs/oauth2.cjs +26 -0
  14. package/dist/cjs/permissions.cjs +35 -0
  15. package/dist/cjs/reactions.cjs +21 -0
  16. package/dist/cjs/token.cjs +39 -0
  17. package/dist/cjs/typeguards.cjs +45 -0
  18. package/dist/cjs/urlToBase64.cjs +19 -0
  19. package/dist/cjs/urls.cjs +26 -0
  20. package/dist/cjs/utils.cjs +28 -0
  21. package/dist/esm/Collection.js +112 -0
  22. package/dist/esm/base64.js +262 -0
  23. package/dist/esm/bucket.js +81 -0
  24. package/dist/esm/builders/embeds.js +295 -0
  25. package/dist/esm/builders.js +5 -0
  26. package/dist/esm/casing.js +51 -0
  27. package/dist/esm/colors.js +467 -0
  28. package/dist/esm/hash.js +19 -0
  29. package/dist/esm/images.js +179 -0
  30. package/dist/esm/index.js +19 -0
  31. package/dist/esm/logger.js +130 -0
  32. package/dist/esm/oauth2.js +16 -0
  33. package/dist/esm/permissions.js +17 -0
  34. package/dist/esm/reactions.js +11 -0
  35. package/dist/esm/token.js +21 -0
  36. package/dist/esm/typeguards.js +18 -0
  37. package/dist/esm/urlToBase64.js +9 -0
  38. package/dist/esm/urls.js +8 -0
  39. package/dist/esm/utils.js +12 -0
  40. package/dist/{Collection.d.ts → types/Collection.d.ts} +2 -3
  41. package/dist/types/Collection.d.ts.map +1 -0
  42. package/dist/types/base64.d.ts.map +1 -0
  43. package/dist/{bucket.d.ts → types/bucket.d.ts} +11 -2
  44. package/dist/types/bucket.d.ts.map +1 -0
  45. package/dist/types/builders/embeds.d.ts +146 -0
  46. package/dist/types/builders/embeds.d.ts.map +1 -0
  47. package/dist/types/builders.d.ts +4 -0
  48. package/dist/types/builders.d.ts.map +1 -0
  49. package/dist/types/casing.d.ts.map +1 -0
  50. package/dist/types/colors.d.ts.map +1 -0
  51. package/dist/types/hash.d.ts.map +1 -0
  52. package/dist/types/images.d.ts +202 -0
  53. package/dist/types/images.d.ts.map +1 -0
  54. package/dist/{index.d.ts → types/index.d.ts} +4 -2
  55. package/dist/types/index.d.ts.map +1 -0
  56. package/dist/types/logger.d.ts.map +1 -0
  57. package/dist/types/oauth2.d.ts +69 -0
  58. package/dist/types/oauth2.d.ts.map +1 -0
  59. package/dist/types/permissions.d.ts.map +1 -0
  60. package/dist/types/reactions.d.ts.map +1 -0
  61. package/dist/{token.d.ts → types/token.d.ts} +1 -1
  62. package/dist/types/token.d.ts.map +1 -0
  63. package/dist/{typeguards.d.ts → types/typeguards.d.ts} +2 -1
  64. package/dist/types/typeguards.d.ts.map +1 -0
  65. package/dist/types/urlToBase64.d.ts.map +1 -0
  66. package/dist/types/urls.d.ts +4 -0
  67. package/dist/types/urls.d.ts.map +1 -0
  68. package/dist/types/utils.d.ts.map +1 -0
  69. package/package.json +29 -26
  70. package/dist/Collection.d.ts.map +0 -1
  71. package/dist/Collection.js +0 -113
  72. package/dist/Collection.js.map +0 -1
  73. package/dist/base64.d.ts.map +0 -1
  74. package/dist/base64.js +0 -262
  75. package/dist/base64.js.map +0 -1
  76. package/dist/bucket.d.ts.map +0 -1
  77. package/dist/bucket.js +0 -67
  78. package/dist/bucket.js.map +0 -1
  79. package/dist/casing.d.ts.map +0 -1
  80. package/dist/casing.js +0 -51
  81. package/dist/casing.js.map +0 -1
  82. package/dist/colors.d.ts.map +0 -1
  83. package/dist/colors.js +0 -471
  84. package/dist/colors.js.map +0 -1
  85. package/dist/files.d.ts +0 -4
  86. package/dist/files.d.ts.map +0 -1
  87. package/dist/files.js +0 -41
  88. package/dist/files.js.map +0 -1
  89. package/dist/hash.d.ts.map +0 -1
  90. package/dist/hash.js +0 -19
  91. package/dist/hash.js.map +0 -1
  92. package/dist/images.d.ts +0 -68
  93. package/dist/images.d.ts.map +0 -1
  94. package/dist/images.js +0 -66
  95. package/dist/images.js.map +0 -1
  96. package/dist/index.d.ts.map +0 -1
  97. package/dist/index.js +0 -17
  98. package/dist/index.js.map +0 -1
  99. package/dist/logger.d.ts.map +0 -1
  100. package/dist/logger.js +0 -130
  101. package/dist/logger.js.map +0 -1
  102. package/dist/permissions.d.ts.map +0 -1
  103. package/dist/permissions.js +0 -17
  104. package/dist/permissions.js.map +0 -1
  105. package/dist/reactions.d.ts.map +0 -1
  106. package/dist/reactions.js +0 -11
  107. package/dist/reactions.js.map +0 -1
  108. package/dist/token.d.ts.map +0 -1
  109. package/dist/token.js +0 -16
  110. package/dist/token.js.map +0 -1
  111. package/dist/typeguards.d.ts.map +0 -1
  112. package/dist/typeguards.js +0 -15
  113. package/dist/typeguards.js.map +0 -1
  114. package/dist/urlToBase64.d.ts.map +0 -1
  115. package/dist/urlToBase64.js +0 -10
  116. package/dist/urlToBase64.js.map +0 -1
  117. package/dist/utils.d.ts.map +0 -1
  118. package/dist/utils.js +0 -15
  119. package/dist/utils.js.map +0 -1
  120. /package/dist/{base64.d.ts → types/base64.d.ts} +0 -0
  121. /package/dist/{casing.d.ts → types/casing.d.ts} +0 -0
  122. /package/dist/{colors.d.ts → types/colors.d.ts} +0 -0
  123. /package/dist/{hash.d.ts → types/hash.d.ts} +0 -0
  124. /package/dist/{logger.d.ts → types/logger.d.ts} +0 -0
  125. /package/dist/{permissions.d.ts → types/permissions.d.ts} +0 -0
  126. /package/dist/{reactions.d.ts → types/reactions.d.ts} +0 -0
  127. /package/dist/{urlToBase64.d.ts → types/urlToBase64.d.ts} +0 -0
  128. /package/dist/{utils.d.ts → types/utils.d.ts} +0 -0
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "LeakyBucket", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return LeakyBucket;
9
+ }
10
+ });
11
+ const _logger = /*#__PURE__*/ _interop_require_default(require("./logger.cjs"));
12
+ const _utils = require("./utils.cjs");
13
+ function _interop_require_default(obj) {
14
+ return obj && obj.__esModule ? obj : {
15
+ default: obj
16
+ };
17
+ }
18
+ let LeakyBucket = class LeakyBucket {
19
+ constructor(options){
20
+ /** The amount of requests that have been used up already. */ this.used = 0;
21
+ /** The queue of requests to acquire an available request. Mapped by <shardId, resolve()> */ this.queue = [];
22
+ /** Whether or not the queue is already processing. */ this.processing = false;
23
+ this.max = options?.max ?? 1;
24
+ this.refillAmount = options?.refillAmount ? options.refillAmount > this.max ? this.max : options.refillAmount : 1;
25
+ this.refillInterval = options?.refillInterval ?? 5000;
26
+ this.logger = options?.logger ?? _logger.default;
27
+ }
28
+ /** The amount of requests that still remain. */ get remaining() {
29
+ return this.max < this.used ? 0 : this.max - this.used;
30
+ }
31
+ /** Refills the bucket as needed. */ refillBucket() {
32
+ this.logger.debug(`[LeakyBucket] Timeout for leaky bucket requests executed. Refilling bucket.`);
33
+ // Lower the used amount by the refill amount
34
+ this.used = this.refillAmount > this.used ? 0 : this.used - this.refillAmount;
35
+ // Reset the refillsAt timestamp since it just got refilled
36
+ this.refillsAt = undefined;
37
+ // Reset the timeoutId
38
+ clearTimeout(this.timeoutId);
39
+ this.timeoutId = undefined;
40
+ if (this.used > 0) {
41
+ this.timeoutId = setTimeout(()=>{
42
+ this.refillBucket();
43
+ }, this.refillInterval);
44
+ this.refillsAt = Date.now() + this.refillInterval;
45
+ }
46
+ }
47
+ /** Begin processing the queue. */ async processQueue() {
48
+ this.logger.debug('[LeakyBucket] Processing queue');
49
+ // There is already a queue that is processing
50
+ if (this.processing) return this.logger.debug('[LeakyBucket] Queue is already processing.');
51
+ this.processing = true;
52
+ // Begin going through the queue.
53
+ while(this.queue.length){
54
+ if (this.remaining) {
55
+ this.logger.debug(`[LeakyBucket] Processing queue. Remaining: ${this.remaining} Length: ${this.queue.length}`);
56
+ // Resolves the promise allowing the paused execution of this request to resolve and continue.
57
+ this.queue.shift()?.();
58
+ // A request can be made
59
+ this.used++;
60
+ // Create a new timeout for this request if none exists.
61
+ if (!this.timeoutId) {
62
+ this.logger.debug(`[LeakyBucket] Creating new timeout for leaky bucket requests.`);
63
+ this.timeoutId = setTimeout(()=>{
64
+ this.refillBucket();
65
+ }, this.refillInterval);
66
+ // Set the time for when this refill will occur.
67
+ this.refillsAt = Date.now() + this.refillInterval;
68
+ }
69
+ } else if (this.refillsAt) {
70
+ const now = Date.now();
71
+ // If there is time left until next refill, just delay execution.
72
+ if (this.refillsAt > now) {
73
+ this.logger.debug(`[LeakyBucket] Delaying execution of leaky bucket requests for ${this.refillsAt - now}ms`);
74
+ await (0, _utils.delay)(this.refillsAt - now);
75
+ this.logger.debug(`[LeakyBucket] Resuming execution`);
76
+ } else {
77
+ this.logger.debug(`[LeakyBucket] Delaying execution of leaky bucket requests for 1000ms`);
78
+ await (0, _utils.delay)(1000);
79
+ }
80
+ }
81
+ }
82
+ // Loop has ended mark false so it can restart later when needed
83
+ this.processing = false;
84
+ }
85
+ /** Pauses the execution until the request is available to be made. */ async acquire(highPriority) {
86
+ return await new Promise((resolve)=>{
87
+ // High priority requests get added to the start of the queue
88
+ if (highPriority) this.queue.unshift(resolve);
89
+ else this.queue.push(resolve);
90
+ // Each request should trigger the queue to be processed.
91
+ void this.processQueue();
92
+ });
93
+ }
94
+ };
95
+
96
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9idWNrZXQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGxvZ2dlciBmcm9tICcuL2xvZ2dlci5qcydcbmltcG9ydCB7IGRlbGF5IH0gZnJvbSAnLi91dGlscy5qcydcblxuZXhwb3J0IGNsYXNzIExlYWt5QnVja2V0IGltcGxlbWVudHMgTGVha3lCdWNrZXRPcHRpb25zIHtcbiAgbWF4OiBudW1iZXJcbiAgcmVmaWxsSW50ZXJ2YWw6IG51bWJlclxuICByZWZpbGxBbW91bnQ6IG51bWJlclxuXG4gIC8qKiBUaGUgYW1vdW50IG9mIHJlcXVlc3RzIHRoYXQgaGF2ZSBiZWVuIHVzZWQgdXAgYWxyZWFkeS4gKi9cbiAgdXNlZDogbnVtYmVyID0gMFxuICAvKiogVGhlIHF1ZXVlIG9mIHJlcXVlc3RzIHRvIGFjcXVpcmUgYW4gYXZhaWxhYmxlIHJlcXVlc3QuIE1hcHBlZCBieSA8c2hhcmRJZCwgcmVzb2x2ZSgpPiAqL1xuICBxdWV1ZTogQXJyYXk8KHZhbHVlOiB2b2lkIHwgUHJvbWlzZUxpa2U8dm9pZD4pID0+IHZvaWQ+ID0gW11cbiAgLyoqIFdoZXRoZXIgb3Igbm90IHRoZSBxdWV1ZSBpcyBhbHJlYWR5IHByb2Nlc3NpbmcuICovXG4gIHByb2Nlc3Npbmc6IGJvb2xlYW4gPSBmYWxzZVxuICAvKiogVGhlIHRpbWVvdXQgaWQgZm9yIHRoZSB0aW1lciB0byByZWR1Y2UgdGhlIHVzZWQgYW1vdW50IGJ5IHRoZSByZWZpbGwgYW1vdW50LiAqL1xuICB0aW1lb3V0SWQ/OiBOb2RlSlMuVGltZW91dFxuICAvKiogVGhlIHRpbWVzdGFtcCBpbiBtaWxsaXNlY29uZHMgd2hlbiB0aGUgbmV4dCByZWZpbGwgaXMgc2NoZWR1bGVkLiAqL1xuICByZWZpbGxzQXQ/OiBudW1iZXJcbiAgLyoqIExvZ2dlciB1c2VkIGluIHRoZSBsZWFreSBidWNrZXQgKi9cbiAgbG9nZ2VyOiBQaWNrPHR5cGVvZiBsb2dnZXIsICdkZWJ1ZycgfCAnaW5mbycgfCAnd2FybicgfCAnZXJyb3InIHwgJ2ZhdGFsJz5cblxuICBjb25zdHJ1Y3RvcihvcHRpb25zPzogTGVha3lCdWNrZXRPcHRpb25zKSB7XG4gICAgdGhpcy5tYXggPSBvcHRpb25zPy5tYXggPz8gMVxuICAgIHRoaXMucmVmaWxsQW1vdW50ID0gb3B0aW9ucz8ucmVmaWxsQW1vdW50ID8gKG9wdGlvbnMucmVmaWxsQW1vdW50ID4gdGhpcy5tYXggPyB0aGlzLm1heCA6IG9wdGlvbnMucmVmaWxsQW1vdW50KSA6IDFcbiAgICB0aGlzLnJlZmlsbEludGVydmFsID0gb3B0aW9ucz8ucmVmaWxsSW50ZXJ2YWwgPz8gNTAwMFxuICAgIHRoaXMubG9nZ2VyID0gb3B0aW9ucz8ubG9nZ2VyID8/IGxvZ2dlclxuICB9XG5cbiAgLyoqIFRoZSBhbW91bnQgb2YgcmVxdWVzdHMgdGhhdCBzdGlsbCByZW1haW4uICovXG4gIGdldCByZW1haW5pbmcoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5tYXggPCB0aGlzLnVzZWQgPyAwIDogdGhpcy5tYXggLSB0aGlzLnVzZWRcbiAgfVxuXG4gIC8qKiBSZWZpbGxzIHRoZSBidWNrZXQgYXMgbmVlZGVkLiAqL1xuICByZWZpbGxCdWNrZXQoKTogdm9pZCB7XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoYFtMZWFreUJ1Y2tldF0gVGltZW91dCBmb3IgbGVha3kgYnVja2V0IHJlcXVlc3RzIGV4ZWN1dGVkLiBSZWZpbGxpbmcgYnVja2V0LmApXG4gICAgLy8gTG93ZXIgdGhlIHVzZWQgYW1vdW50IGJ5IHRoZSByZWZpbGwgYW1vdW50XG4gICAgdGhpcy51c2VkID0gdGhpcy5yZWZpbGxBbW91bnQgPiB0aGlzLnVzZWQgPyAwIDogdGhpcy51c2VkIC0gdGhpcy5yZWZpbGxBbW91bnRcbiAgICAvLyBSZXNldCB0aGUgcmVmaWxsc0F0IHRpbWVzdGFtcCBzaW5jZSBpdCBqdXN0IGdvdCByZWZpbGxlZFxuICAgIHRoaXMucmVmaWxsc0F0ID0gdW5kZWZpbmVkXG4gICAgLy8gUmVzZXQgdGhlIHRpbWVvdXRJZFxuICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXRJZClcbiAgICB0aGlzLnRpbWVvdXRJZCA9IHVuZGVmaW5lZFxuXG4gICAgaWYgKHRoaXMudXNlZCA+IDApIHtcbiAgICAgIHRoaXMudGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMucmVmaWxsQnVja2V0KClcbiAgICAgIH0sIHRoaXMucmVmaWxsSW50ZXJ2YWwpXG4gICAgICB0aGlzLnJlZmlsbHNBdCA9IERhdGUubm93KCkgKyB0aGlzLnJlZmlsbEludGVydmFsXG4gICAgfVxuICB9XG5cbiAgLyoqIEJlZ2luIHByb2Nlc3NpbmcgdGhlIHF1ZXVlLiAqL1xuICBhc3luYyBwcm9jZXNzUXVldWUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoJ1tMZWFreUJ1Y2tldF0gUHJvY2Vzc2luZyBxdWV1ZScpXG5cbiAgICAvLyBUaGVyZSBpcyBhbHJlYWR5IGEgcXVldWUgdGhhdCBpcyBwcm9jZXNzaW5nXG4gICAgaWYgKHRoaXMucHJvY2Vzc2luZykgcmV0dXJuIHRoaXMubG9nZ2VyLmRlYnVnKCdbTGVha3lCdWNrZXRdIFF1ZXVlIGlzIGFscmVhZHkgcHJvY2Vzc2luZy4nKVxuXG4gICAgdGhpcy5wcm9jZXNzaW5nID0gdHJ1ZVxuXG4gICAgLy8gQmVnaW4gZ29pbmcgdGhyb3VnaCB0aGUgcXVldWUuXG4gICAgd2hpbGUgKHRoaXMucXVldWUubGVuZ3RoKSB7XG4gICAgICBpZiAodGhpcy5yZW1haW5pbmcpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFtMZWFreUJ1Y2tldF0gUHJvY2Vzc2luZyBxdWV1ZS4gUmVtYWluaW5nOiAke3RoaXMucmVtYWluaW5nfSBMZW5ndGg6ICR7dGhpcy5xdWV1ZS5sZW5ndGh9YClcbiAgICAgICAgLy8gUmVzb2x2ZXMgdGhlIHByb21pc2UgYWxsb3dpbmcgdGhlIHBhdXNlZCBleGVjdXRpb24gb2YgdGhpcyByZXF1ZXN0IHRvIHJlc29sdmUgYW5kIGNvbnRpbnVlLlxuICAgICAgICB0aGlzLnF1ZXVlLnNoaWZ0KCk/LigpXG4gICAgICAgIC8vIEEgcmVxdWVzdCBjYW4gYmUgbWFkZVxuICAgICAgICB0aGlzLnVzZWQrK1xuXG4gICAgICAgIC8vIENyZWF0ZSBhIG5ldyB0aW1lb3V0IGZvciB0aGlzIHJlcXVlc3QgaWYgbm9uZSBleGlzdHMuXG4gICAgICAgIGlmICghdGhpcy50aW1lb3V0SWQpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW0xlYWt5QnVja2V0XSBDcmVhdGluZyBuZXcgdGltZW91dCBmb3IgbGVha3kgYnVja2V0IHJlcXVlc3RzLmApXG5cbiAgICAgICAgICB0aGlzLnRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZWZpbGxCdWNrZXQoKVxuICAgICAgICAgIH0sIHRoaXMucmVmaWxsSW50ZXJ2YWwpXG4gICAgICAgICAgLy8gU2V0IHRoZSB0aW1lIGZvciB3aGVuIHRoaXMgcmVmaWxsIHdpbGwgb2NjdXIuXG4gICAgICAgICAgdGhpcy5yZWZpbGxzQXQgPSBEYXRlLm5vdygpICsgdGhpcy5yZWZpbGxJbnRlcnZhbFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIGEgcmVmaWxsIGlzIHNjaGVkdWxlZCwgc2luY2Ugd2UgaGF2ZSB1c2VkIHVwIGFsbCBhdmFpbGFibGUgcmVxdWVzdHNcbiAgICAgIGVsc2UgaWYgKHRoaXMucmVmaWxsc0F0KSB7XG4gICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KClcbiAgICAgICAgLy8gSWYgdGhlcmUgaXMgdGltZSBsZWZ0IHVudGlsIG5leHQgcmVmaWxsLCBqdXN0IGRlbGF5IGV4ZWN1dGlvbi5cbiAgICAgICAgaWYgKHRoaXMucmVmaWxsc0F0ID4gbm93KSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFtMZWFreUJ1Y2tldF0gRGVsYXlpbmcgZXhlY3V0aW9uIG9mIGxlYWt5IGJ1Y2tldCByZXF1ZXN0cyBmb3IgJHt0aGlzLnJlZmlsbHNBdCAtIG5vd31tc2ApXG4gICAgICAgICAgYXdhaXQgZGVsYXkodGhpcy5yZWZpbGxzQXQgLSBub3cpXG4gICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFtMZWFreUJ1Y2tldF0gUmVzdW1pbmcgZXhlY3V0aW9uYClcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHRoZSByZWZpbGxzQXQgaGFzIHBhc3NlZCBidXQgdGhlIHRpbWVvdXQgZGlkbid0IHlldCBleGVjdXRlIGRlbGF5IHRoZSBleGVjdXRpb25cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFtMZWFreUJ1Y2tldF0gRGVsYXlpbmcgZXhlY3V0aW9uIG9mIGxlYWt5IGJ1Y2tldCByZXF1ZXN0cyBmb3IgMTAwMG1zYClcbiAgICAgICAgICBhd2FpdCBkZWxheSgxMDAwKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTG9vcCBoYXMgZW5kZWQgbWFyayBmYWxzZSBzbyBpdCBjYW4gcmVzdGFydCBsYXRlciB3aGVuIG5lZWRlZFxuICAgIHRoaXMucHJvY2Vzc2luZyA9IGZhbHNlXG4gIH1cblxuICAvKiogUGF1c2VzIHRoZSBleGVjdXRpb24gdW50aWwgdGhlIHJlcXVlc3QgaXMgYXZhaWxhYmxlIHRvIGJlIG1hZGUuICovXG4gIGFzeW5jIGFjcXVpcmUoaGlnaFByaW9yaXR5PzogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgLy8gSGlnaCBwcmlvcml0eSByZXF1ZXN0cyBnZXQgYWRkZWQgdG8gdGhlIHN0YXJ0IG9mIHRoZSBxdWV1ZVxuICAgICAgaWYgKGhpZ2hQcmlvcml0eSkgdGhpcy5xdWV1ZS51bnNoaWZ0KHJlc29sdmUpXG4gICAgICAvLyBBbGwgb3RoZXIgcmVxdWVzdHMgZ2V0IHB1c2hlZCB0byB0aGUgZW5kLlxuICAgICAgZWxzZSB0aGlzLnF1ZXVlLnB1c2gocmVzb2x2ZSlcblxuICAgICAgLy8gRWFjaCByZXF1ZXN0IHNob3VsZCB0cmlnZ2VyIHRoZSBxdWV1ZSB0byBiZSBwcm9jZXNzZWQuXG4gICAgICB2b2lkIHRoaXMucHJvY2Vzc1F1ZXVlKClcbiAgICB9KVxuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGVha3lCdWNrZXRPcHRpb25zIHtcbiAgLyoqXG4gICAqIE1heCByZXF1ZXN0cyBhbGxvd2VkIGF0IG9uY2UuXG4gICAqIEBkZWZhdWx0IDFcbiAgICovXG4gIG1heD86IG51bWJlclxuICAvKipcbiAgICogSW50ZXJ2YWwgaW4gbWlsbGlzZWNvbmRzIGJldHdlZW4gcmVmaWxscy5cbiAgICogQGRlZmF1bHQgNTAwMFxuICAgKi9cbiAgcmVmaWxsSW50ZXJ2YWw/OiBudW1iZXJcbiAgLyoqXG4gICAqIEFtb3VudCBvZiByZXF1ZXN0cyB0byByZWZpbGwgYXQgZWFjaCBpbnRlcnZhbC5cbiAgICogQGRlZmF1bHQgMVxuICAgKi9cbiAgcmVmaWxsQW1vdW50PzogbnVtYmVyXG4gIC8qKlxuICAgKiBUaGUgbG9nZ2VyIHRoYXQgdGhlIGxlYWt5IGJ1Y2tldCB3aWxsIHVzZVxuICAgKiBAZGVmYXVsdCBsb2dnZXIgLy8gVGhlIGxvZ2dlciBleHBvcnRlZCBieSBgQGRpc2NvcmRlbm8vdXRpbHNgXG4gICAqL1xuICBsb2dnZXI/OiBQaWNrPHR5cGVvZiBsb2dnZXIsICdkZWJ1ZycgfCAnaW5mbycgfCAnd2FybicgfCAnZXJyb3InIHwgJ2ZhdGFsJz5cbn1cbiJdLCJuYW1lcyI6WyJMZWFreUJ1Y2tldCIsImNvbnN0cnVjdG9yIiwib3B0aW9ucyIsInVzZWQiLCJxdWV1ZSIsInByb2Nlc3NpbmciLCJtYXgiLCJyZWZpbGxBbW91bnQiLCJyZWZpbGxJbnRlcnZhbCIsImxvZ2dlciIsInJlbWFpbmluZyIsInJlZmlsbEJ1Y2tldCIsImRlYnVnIiwicmVmaWxsc0F0IiwidW5kZWZpbmVkIiwiY2xlYXJUaW1lb3V0IiwidGltZW91dElkIiwic2V0VGltZW91dCIsIkRhdGUiLCJub3ciLCJwcm9jZXNzUXVldWUiLCJsZW5ndGgiLCJzaGlmdCIsImRlbGF5IiwiYWNxdWlyZSIsImhpZ2hQcmlvcml0eSIsIlByb21pc2UiLCJyZXNvbHZlIiwidW5zaGlmdCIsInB1c2giXSwibWFwcGluZ3MiOiI7Ozs7K0JBR2FBOzs7ZUFBQUE7OzsrREFITTt1QkFDRzs7Ozs7O0FBRWYsSUFBQSxBQUFNQSxjQUFOLE1BQU1BO0lBa0JYQyxZQUFZQyxPQUE0QixDQUFFO1FBYjFDLDJEQUEyRCxRQUMzREMsT0FBZTtRQUNmLDBGQUEwRixRQUMxRkMsUUFBMEQsRUFBRTtRQUM1RCxvREFBb0QsUUFDcERDLGFBQXNCO1FBU3BCLElBQUksQ0FBQ0MsR0FBRyxHQUFHSixTQUFTSSxPQUFPO1FBQzNCLElBQUksQ0FBQ0MsWUFBWSxHQUFHTCxTQUFTSyxlQUFnQkwsUUFBUUssWUFBWSxHQUFHLElBQUksQ0FBQ0QsR0FBRyxHQUFHLElBQUksQ0FBQ0EsR0FBRyxHQUFHSixRQUFRSyxZQUFZLEdBQUk7UUFDbEgsSUFBSSxDQUFDQyxjQUFjLEdBQUdOLFNBQVNNLGtCQUFrQjtRQUNqRCxJQUFJLENBQUNDLE1BQU0sR0FBR1AsU0FBU08sVUFBVUEsZUFBTTtJQUN6QztJQUVBLDhDQUE4QyxHQUM5QyxJQUFJQyxZQUFvQjtRQUN0QixPQUFPLElBQUksQ0FBQ0osR0FBRyxHQUFHLElBQUksQ0FBQ0gsSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDRyxHQUFHLEdBQUcsSUFBSSxDQUFDSCxJQUFJO0lBQ3hEO0lBRUEsa0NBQWtDLEdBQ2xDUSxlQUFxQjtRQUNuQixJQUFJLENBQUNGLE1BQU0sQ0FBQ0csS0FBSyxDQUFDLENBQUMsMkVBQTJFLENBQUM7UUFDL0YsNkNBQTZDO1FBQzdDLElBQUksQ0FBQ1QsSUFBSSxHQUFHLElBQUksQ0FBQ0ksWUFBWSxHQUFHLElBQUksQ0FBQ0osSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDQSxJQUFJLEdBQUcsSUFBSSxDQUFDSSxZQUFZO1FBQzdFLDJEQUEyRDtRQUMzRCxJQUFJLENBQUNNLFNBQVMsR0FBR0M7UUFDakIsc0JBQXNCO1FBQ3RCQyxhQUFhLElBQUksQ0FBQ0MsU0FBUztRQUMzQixJQUFJLENBQUNBLFNBQVMsR0FBR0Y7UUFFakIsSUFBSSxJQUFJLENBQUNYLElBQUksR0FBRyxHQUFHO1lBQ2pCLElBQUksQ0FBQ2EsU0FBUyxHQUFHQyxXQUFXO2dCQUMxQixJQUFJLENBQUNOLFlBQVk7WUFDbkIsR0FBRyxJQUFJLENBQUNILGNBQWM7WUFDdEIsSUFBSSxDQUFDSyxTQUFTLEdBQUdLLEtBQUtDLEdBQUcsS0FBSyxJQUFJLENBQUNYLGNBQWM7UUFDbkQ7SUFDRjtJQUVBLGdDQUFnQyxHQUNoQyxNQUFNWSxlQUE4QjtRQUNsQyxJQUFJLENBQUNYLE1BQU0sQ0FBQ0csS0FBSyxDQUFDO1FBRWxCLDhDQUE4QztRQUM5QyxJQUFJLElBQUksQ0FBQ1AsVUFBVSxFQUFFLE9BQU8sSUFBSSxDQUFDSSxNQUFNLENBQUNHLEtBQUssQ0FBQztRQUU5QyxJQUFJLENBQUNQLFVBQVUsR0FBRztRQUVsQixpQ0FBaUM7UUFDakMsTUFBTyxJQUFJLENBQUNELEtBQUssQ0FBQ2lCLE1BQU0sQ0FBRTtZQUN4QixJQUFJLElBQUksQ0FBQ1gsU0FBUyxFQUFFO2dCQUNsQixJQUFJLENBQUNELE1BQU0sQ0FBQ0csS0FBSyxDQUFDLENBQUMsMkNBQTJDLEVBQUUsSUFBSSxDQUFDRixTQUFTLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQ04sS0FBSyxDQUFDaUIsTUFBTSxDQUFDLENBQUM7Z0JBQzdHLDhGQUE4RjtnQkFDOUYsSUFBSSxDQUFDakIsS0FBSyxDQUFDa0IsS0FBSztnQkFDaEIsd0JBQXdCO2dCQUN4QixJQUFJLENBQUNuQixJQUFJO2dCQUVULHdEQUF3RDtnQkFDeEQsSUFBSSxDQUFDLElBQUksQ0FBQ2EsU0FBUyxFQUFFO29CQUNuQixJQUFJLENBQUNQLE1BQU0sQ0FBQ0csS0FBSyxDQUFDLENBQUMsNkRBQTZELENBQUM7b0JBRWpGLElBQUksQ0FBQ0ksU0FBUyxHQUFHQyxXQUFXO3dCQUMxQixJQUFJLENBQUNOLFlBQVk7b0JBQ25CLEdBQUcsSUFBSSxDQUFDSCxjQUFjO29CQUN0QixnREFBZ0Q7b0JBQ2hELElBQUksQ0FBQ0ssU0FBUyxHQUFHSyxLQUFLQyxHQUFHLEtBQUssSUFBSSxDQUFDWCxjQUFjO2dCQUNuRDtZQUNGLE9BR0ssSUFBSSxJQUFJLENBQUNLLFNBQVMsRUFBRTtnQkFDdkIsTUFBTU0sTUFBTUQsS0FBS0MsR0FBRztnQkFDcEIsaUVBQWlFO2dCQUNqRSxJQUFJLElBQUksQ0FBQ04sU0FBUyxHQUFHTSxLQUFLO29CQUN4QixJQUFJLENBQUNWLE1BQU0sQ0FBQ0csS0FBSyxDQUFDLENBQUMsOERBQThELEVBQUUsSUFBSSxDQUFDQyxTQUFTLEdBQUdNLElBQUksRUFBRSxDQUFDO29CQUMzRyxNQUFNSSxJQUFBQSxZQUFLLEVBQUMsSUFBSSxDQUFDVixTQUFTLEdBQUdNO29CQUM3QixJQUFJLENBQUNWLE1BQU0sQ0FBQ0csS0FBSyxDQUFDLENBQUMsZ0NBQWdDLENBQUM7Z0JBQ3RELE9BR0s7b0JBQ0gsSUFBSSxDQUFDSCxNQUFNLENBQUNHLEtBQUssQ0FBQyxDQUFDLG9FQUFvRSxDQUFDO29CQUN4RixNQUFNVyxJQUFBQSxZQUFLLEVBQUM7Z0JBQ2Q7WUFDRjtRQUNGO1FBRUEsZ0VBQWdFO1FBQ2hFLElBQUksQ0FBQ2xCLFVBQVUsR0FBRztJQUNwQjtJQUVBLG9FQUFvRSxHQUNwRSxNQUFNbUIsUUFBUUMsWUFBc0IsRUFBaUI7UUFDbkQsT0FBTyxNQUFNLElBQUlDLFFBQVEsQ0FBQ0M7WUFDeEIsNkRBQTZEO1lBQzdELElBQUlGLGNBQWMsSUFBSSxDQUFDckIsS0FBSyxDQUFDd0IsT0FBTyxDQUFDRDtpQkFFaEMsSUFBSSxDQUFDdkIsS0FBSyxDQUFDeUIsSUFBSSxDQUFDRjtZQUVyQix5REFBeUQ7WUFDekQsS0FBSyxJQUFJLENBQUNQLFlBQVk7UUFDeEI7SUFDRjtBQUNGIn0=
@@ -0,0 +1,292 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "EmbedsBuilder", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return EmbedsBuilder;
9
+ }
10
+ });
11
+ let EmbedsBuilder = class EmbedsBuilder extends Array {
12
+ #currentEmbedIndex;
13
+ /**
14
+ * Adds a new field to the embed fields array.
15
+ *
16
+ * @param {string} name - Field name
17
+ * @param {string} value - Field value
18
+ * @param {?boolean} [inline=false] - Field should be inline or not.
19
+ * @returns {EmbedsBuilder}
20
+ */ addField(name, value, inline) {
21
+ if (this.#currentEmbed.fields === undefined) {
22
+ this.#currentEmbed.fields = [];
23
+ }
24
+ this.#currentEmbed.fields.push({
25
+ name,
26
+ value,
27
+ inline
28
+ });
29
+ return this;
30
+ }
31
+ /**
32
+ * Creates a blank embed.
33
+ *
34
+ * @returns {EmbedsBuilder}
35
+ */ newEmbed() {
36
+ if (this.length >= 10) {
37
+ throw new Error('Maximum embed count exceeded. You can not have more than 10 embeds.');
38
+ }
39
+ this.push({});
40
+ this.setCurrentEmbed();
41
+ return this;
42
+ }
43
+ /**
44
+ * Set the current embed author.
45
+ *
46
+ * @param {string} name - Name of the author
47
+ * @param {?Omit<DiscordEmbedAuthor, 'name'>} [options] - Extra author options
48
+ * @returns {EmbedsBuilder}
49
+ */ setAuthor(name, options) {
50
+ this.#currentEmbed.author = {
51
+ ...this.#currentEmbed.author,
52
+ ...options,
53
+ name
54
+ };
55
+ return this;
56
+ }
57
+ /**
58
+ * Set the color on the side of the current embed.
59
+ *
60
+ * @param {(number | string)} color - The color, in base16 or hex color code
61
+ * @returns {EmbedsBuilder}
62
+ */ setColor(color) {
63
+ if (typeof color === 'string') {
64
+ const convertedValue = parseInt(color.replace('#', ''), 16);
65
+ color = Number.isNaN(convertedValue) ? 0 : convertedValue;
66
+ }
67
+ this.#currentEmbed.color = color;
68
+ return this;
69
+ }
70
+ /**
71
+ * Set the current embed to a different index.
72
+ *
73
+ * WARNING: Only use this method if you know what you're doing. Make sure to set it back to the latest when you're done.
74
+ *
75
+ * @param {?number} [index] - The index of the embed in the EmbedsBuilder array
76
+ * @returns {EmbedsBuilder}
77
+ */ setCurrentEmbed(index) {
78
+ if (index === undefined) {
79
+ this.#currentEmbedIndex = this.length - 1;
80
+ return this;
81
+ }
82
+ if (index >= this.length || index < 0) {
83
+ throw new Error('Can not set the current embed to a index out of bounds.');
84
+ }
85
+ this.#currentEmbedIndex = index;
86
+ return this;
87
+ }
88
+ /**
89
+ * Set the description of the current embed.
90
+ *
91
+ * @param {string} description - Description
92
+ * @returns {EmbedsBuilder}
93
+ */ setDescription(description) {
94
+ this.#currentEmbed.description = description;
95
+ return this;
96
+ }
97
+ /**
98
+ * Overwrite all fields on the current embed.
99
+ *
100
+ * @param {DiscordEmbedField[]} fields
101
+ * @returns {EmbedsBuilder}
102
+ */ setFields(fields) {
103
+ this.#currentEmbed.fields = fields;
104
+ return this;
105
+ }
106
+ /**
107
+ * Set the footer in the current embed.
108
+ *
109
+ * @param {string} text - The text to display in the footer
110
+ * @param {?Omit<DiscordEmbedFooter, 'text'>} [options]
111
+ * @returns {EmbedsBuilder}
112
+ */ setFooter(text, options) {
113
+ this.#currentEmbed.footer = {
114
+ ...this.#currentEmbed.footer,
115
+ ...options,
116
+ text
117
+ };
118
+ return this;
119
+ }
120
+ /**
121
+ * Set the image in the current embed.
122
+ *
123
+ * @param {string} url - URL of the image
124
+ * @param {?Omit<DiscordEmbedImage, 'url'>} [options]
125
+ * @returns {EmbedsBuilder}
126
+ */ setImage(url, options) {
127
+ this.#currentEmbed.image = {
128
+ ...this.#currentEmbed.image,
129
+ ...options,
130
+ url
131
+ };
132
+ return this;
133
+ }
134
+ /**
135
+ * Set the provider of the current embed.
136
+ *
137
+ * @param {string} name
138
+ * @param {?string} [url]
139
+ * @returns {EmbedsBuilder}
140
+ */ setProvider(name, url) {
141
+ this.#currentEmbed.provider = {
142
+ name,
143
+ url
144
+ };
145
+ return this;
146
+ }
147
+ /**
148
+ * Set the color of the current embed to a random value.
149
+ *
150
+ * @returns {EmbedsBuilder}
151
+ */ setRandomColor() {
152
+ return this.setColor(Math.floor(Math.random() * (0xffffff + 1)));
153
+ }
154
+ /**
155
+ * Set the title of the current embed.
156
+ *
157
+ * @param {string} title
158
+ * @param {?string} [url]
159
+ * @returns {EmbedsBuilder}
160
+ */ setTitle(title, url) {
161
+ this.#currentEmbed.title = title;
162
+ if (url) {
163
+ this.setUrl(url);
164
+ }
165
+ return this;
166
+ }
167
+ /**
168
+ * Set the timestamp of the current embed.
169
+ *
170
+ * @param {?(string | number | Date)} [timestamp]
171
+ * @returns {EmbedsBuilder}
172
+ */ setTimestamp(timestamp) {
173
+ this.#currentEmbed.timestamp = new Date(timestamp).toISOString();
174
+ return this;
175
+ }
176
+ /**
177
+ * Set the thumbnail of the current embed.
178
+ *
179
+ * @param {string} url - URL of the image
180
+ * @param {?Omit<DiscordEmbedThumbnail, 'url'>} [options]
181
+ * @returns {EmbedsBuilder}
182
+ */ setThumbnail(url, options) {
183
+ this.#currentEmbed.thumbnail = {
184
+ ...this.#currentEmbed.thumbnail,
185
+ ...options,
186
+ url
187
+ };
188
+ return this;
189
+ }
190
+ /**
191
+ * Set the URL of the current embed title.
192
+ *
193
+ * @param {string} url
194
+ * @returns {EmbedsBuilder}
195
+ */ setUrl(url) {
196
+ this.#currentEmbed.url = url;
197
+ return this;
198
+ }
199
+ /**
200
+ * Set the video of the current embed.
201
+ *
202
+ * @param {string} url
203
+ * @param {?Omit<DiscordEmbedVideo, 'url'>} [options]
204
+ * @returns {EmbedsBuilder}
205
+ */ setVideo(url, options) {
206
+ this.#currentEmbed.video = {
207
+ ...this.#currentEmbed.video,
208
+ ...options,
209
+ url
210
+ };
211
+ return this;
212
+ }
213
+ /**
214
+ * Validate all embeds available against current known Discord limits to help prevent bad requests.
215
+ *
216
+ * @returns {EmbedsBuilder}
217
+ */ validate() {
218
+ let totalCharacters = 0;
219
+ if (this.length > 10) {
220
+ throw new Error('You can not have more than 10 embeds on a single message.');
221
+ }
222
+ this.forEach(({ author, description, fields, footer, title }, index)=>{
223
+ if (title) {
224
+ const trimmedTitle = title.trim();
225
+ if (trimmedTitle.length > 256) {
226
+ throw new Error(`Title of embed ${index} can not be longer than 256 characters.`);
227
+ }
228
+ totalCharacters += trimmedTitle.length;
229
+ }
230
+ if (description) {
231
+ const trimmedDescription = description.trim();
232
+ if (trimmedDescription.length > 4096) {
233
+ throw new Error(`Description of embed ${index} can not be longer than 4096 characters.`);
234
+ }
235
+ totalCharacters += trimmedDescription.length;
236
+ }
237
+ if (fields) {
238
+ if (fields.length > 25) {
239
+ throw new Error(`embed ${index} can not have more than 25 fields.`);
240
+ }
241
+ fields.forEach(({ name, value }, fieldIndex)=>{
242
+ const trimmedName = name.trim();
243
+ const trimmedValue = value.trim();
244
+ if (trimmedName.length > 256) {
245
+ throw new Error(`Name of field ${fieldIndex} on embed ${index} can not be longer than 256 characters.`);
246
+ }
247
+ if (trimmedValue.length > 4096) {
248
+ throw new Error(`Value of field ${fieldIndex} on embed ${index} can not be longer than 1024 characters.`);
249
+ }
250
+ totalCharacters += trimmedName.length;
251
+ totalCharacters += trimmedValue.length;
252
+ });
253
+ }
254
+ if (footer) {
255
+ const trimmedFooterText = footer.text.trim();
256
+ if (trimmedFooterText.length > 2048) {
257
+ throw new Error(`Footer text of embed ${index} can not be longer than 2048 characters.`);
258
+ }
259
+ totalCharacters += trimmedFooterText.length;
260
+ }
261
+ if (author) {
262
+ const trimmedAuthorName = author.name.trim();
263
+ if (trimmedAuthorName.length > 256) {
264
+ throw new Error(`Author name of embed ${index} can not be longer than 256 characters.`);
265
+ }
266
+ totalCharacters += trimmedAuthorName.length;
267
+ }
268
+ });
269
+ if (totalCharacters > 6000) {
270
+ throw new Error('Total character length of all embeds can not exceed 6000 characters.');
271
+ }
272
+ return this;
273
+ }
274
+ /**
275
+ * Returns the current embed.
276
+ *
277
+ * @readonly
278
+ * @type {DiscordEmbed}
279
+ */ get #currentEmbed() {
280
+ if (this.length === 0) {
281
+ this.newEmbed();
282
+ this.setCurrentEmbed();
283
+ }
284
+ return this[this.#currentEmbedIndex];
285
+ }
286
+ constructor(...args){
287
+ super(...args);
288
+ this.#currentEmbedIndex = 0;
289
+ }
290
+ };
291
+
292
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9idWlsZGVycy9lbWJlZHMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUge1xuICBEaXNjb3JkRW1iZWQsXG4gIERpc2NvcmRFbWJlZEF1dGhvcixcbiAgRGlzY29yZEVtYmVkRmllbGQsXG4gIERpc2NvcmRFbWJlZEZvb3RlcixcbiAgRGlzY29yZEVtYmVkSW1hZ2UsXG4gIERpc2NvcmRFbWJlZFRodW1ibmFpbCxcbiAgRGlzY29yZEVtYmVkVmlkZW8sXG59IGZyb20gJ0BkaXNjb3JkZW5vL3R5cGVzJ1xuXG4vKipcbiAqIEEgYnVpbGRlciB0byBoZWxwIGNyZWF0ZSBEaXNjb3JkIGVtYmVkcy5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAY2xhc3MgRW1iZWRzQnVpbGRlclxuICogQHR5cGVkZWYge0VtYmVkc0J1aWxkZXJ9XG4gKiBAZXh0ZW5kcyB7QXJyYXk8RGlzY29yZEVtYmVkPn1cbiAqIEBleGFtcGxlXG4gKiBjb25zdCBlbWJlZHMgPSBuZXcgRW1iZWRCdWlsZGVyKClcbiAqICAuc2V0VGl0bGUoJ015IEVtYmVkJylcbiAqICAuc2V0RGVzY3JpcHRpb24oJ1RoaXMgaXMgbXkgbmV3IGVtYmVkJylcbiAqICAubmV3RW1iZWQoKVxuICogIC5zZXRUaXRsZSgnTXkgU2Vjb25kIEVtYmVkJylcbiAqL1xuZXhwb3J0IGNsYXNzIEVtYmVkc0J1aWxkZXIgZXh0ZW5kcyBBcnJheTxEaXNjb3JkRW1iZWQ+IHtcbiAgI2N1cnJlbnRFbWJlZEluZGV4OiBudW1iZXIgPSAwXG5cbiAgLyoqXG4gICAqIEFkZHMgYSBuZXcgZmllbGQgdG8gdGhlIGVtYmVkIGZpZWxkcyBhcnJheS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBGaWVsZCBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIEZpZWxkIHZhbHVlXG4gICAqIEBwYXJhbSB7P2Jvb2xlYW59IFtpbmxpbmU9ZmFsc2VdIC0gRmllbGQgc2hvdWxkIGJlIGlubGluZSBvciBub3QuXG4gICAqIEByZXR1cm5zIHtFbWJlZHNCdWlsZGVyfVxuICAgKi9cbiAgYWRkRmllbGQobmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nLCBpbmxpbmU/OiBib29sZWFuKTogdGhpcyB7XG4gICAgaWYgKHRoaXMuI2N1cnJlbnRFbWJlZC5maWVsZHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy4jY3VycmVudEVtYmVkLmZpZWxkcyA9IFtdXG4gICAgfVxuXG4gICAgdGhpcy4jY3VycmVudEVtYmVkLmZpZWxkcy5wdXNoKHtcbiAgICAgIG5hbWUsXG4gICAgICB2YWx1ZSxcbiAgICAgIGlubGluZSxcbiAgICB9KVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgYmxhbmsgZW1iZWQuXG4gICAqXG4gICAqIEByZXR1cm5zIHtFbWJlZHNCdWlsZGVyfVxuICAgKi9cbiAgbmV3RW1iZWQoKTogdGhpcyB7XG4gICAgaWYgKHRoaXMubGVuZ3RoID49IDEwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01heGltdW0gZW1iZWQgY291bnQgZXhjZWVkZWQuIFlvdSBjYW4gbm90IGhhdmUgbW9yZSB0aGFuIDEwIGVtYmVkcy4nKVxuICAgIH1cblxuICAgIHRoaXMucHVzaCh7fSlcbiAgICB0aGlzLnNldEN1cnJlbnRFbWJlZCgpXG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgY3VycmVudCBlbWJlZCBhdXRob3IuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gTmFtZSBvZiB0aGUgYXV0aG9yXG4gICAqIEBwYXJhbSB7P09taXQ8RGlzY29yZEVtYmVkQXV0aG9yLCAnbmFtZSc+fSBbb3B0aW9uc10gLSBFeHRyYSBhdXRob3Igb3B0aW9uc1xuICAgKiBAcmV0dXJucyB7RW1iZWRzQnVpbGRlcn1cbiAgICovXG4gIHNldEF1dGhvcihuYW1lOiBzdHJpbmcsIG9wdGlvbnM/OiBPbWl0PERpc2NvcmRFbWJlZEF1dGhvciwgJ25hbWUnPik6IHRoaXMge1xuICAgIHRoaXMuI2N1cnJlbnRFbWJlZC5hdXRob3IgPSB7XG4gICAgICAuLi50aGlzLiNjdXJyZW50RW1iZWQuYXV0aG9yLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIG5hbWUsXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGNvbG9yIG9uIHRoZSBzaWRlIG9mIHRoZSBjdXJyZW50IGVtYmVkLlxuICAgKlxuICAgKiBAcGFyYW0geyhudW1iZXIgfCBzdHJpbmcpfSBjb2xvciAtIFRoZSBjb2xvciwgaW4gYmFzZTE2IG9yIGhleCBjb2xvciBjb2RlXG4gICAqIEByZXR1cm5zIHtFbWJlZHNCdWlsZGVyfVxuICAgKi9cbiAgc2V0Q29sb3IoY29sb3I6IG51bWJlciB8IHN0cmluZyk6IHRoaXMge1xuICAgIGlmICh0eXBlb2YgY29sb3IgPT09ICdzdHJpbmcnKSB7XG4gICAgICBjb25zdCBjb252ZXJ0ZWRWYWx1ZSA9IHBhcnNlSW50KGNvbG9yLnJlcGxhY2UoJyMnLCAnJyksIDE2KVxuICAgICAgY29sb3IgPSBOdW1iZXIuaXNOYU4oY29udmVydGVkVmFsdWUpID8gMCA6IGNvbnZlcnRlZFZhbHVlXG4gICAgfVxuXG4gICAgdGhpcy4jY3VycmVudEVtYmVkLmNvbG9yID0gY29sb3JcblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBjdXJyZW50IGVtYmVkIHRvIGEgZGlmZmVyZW50IGluZGV4LlxuICAgKlxuICAgKiBXQVJOSU5HOiBPbmx5IHVzZSB0aGlzIG1ldGhvZCBpZiB5b3Uga25vdyB3aGF0IHlvdSdyZSBkb2luZy4gTWFrZSBzdXJlIHRvIHNldCBpdCBiYWNrIHRvIHRoZSBsYXRlc3Qgd2hlbiB5b3UncmUgZG9uZS5cbiAgICpcbiAgICogQHBhcmFtIHs/bnVtYmVyfSBbaW5kZXhdIC0gVGhlIGluZGV4IG9mIHRoZSBlbWJlZCBpbiB0aGUgRW1iZWRzQnVpbGRlciBhcnJheVxuICAgKiBAcmV0dXJucyB7RW1iZWRzQnVpbGRlcn1cbiAgICovXG4gIHNldEN1cnJlbnRFbWJlZChpbmRleD86IG51bWJlcik6IHRoaXMge1xuICAgIGlmIChpbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLiNjdXJyZW50RW1iZWRJbmRleCA9IHRoaXMubGVuZ3RoIC0gMVxuXG4gICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIGlmIChpbmRleCA+PSB0aGlzLmxlbmd0aCB8fCBpbmRleCA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2FuIG5vdCBzZXQgdGhlIGN1cnJlbnQgZW1iZWQgdG8gYSBpbmRleCBvdXQgb2YgYm91bmRzLicpXG4gICAgfVxuXG4gICAgdGhpcy4jY3VycmVudEVtYmVkSW5kZXggPSBpbmRleFxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBjdXJyZW50IGVtYmVkLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGVzY3JpcHRpb24gLSBEZXNjcmlwdGlvblxuICAgKiBAcmV0dXJucyB7RW1iZWRzQnVpbGRlcn1cbiAgICovXG4gIHNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uOiBzdHJpbmcpOiB0aGlzIHtcbiAgICB0aGlzLiNjdXJyZW50RW1iZWQuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvblxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBPdmVyd3JpdGUgYWxsIGZpZWxkcyBvbiB0aGUgY3VycmVudCBlbWJlZC5cbiAgICpcbiAgICogQHBhcmFtIHtEaXNjb3JkRW1iZWRGaWVsZFtdfSBmaWVsZHNcbiAgICogQHJldHVybnMge0VtYmVkc0J1aWxkZXJ9XG4gICAqL1xuICBzZXRGaWVsZHMoZmllbGRzOiBEaXNjb3JkRW1iZWRGaWVsZFtdKTogdGhpcyB7XG4gICAgdGhpcy4jY3VycmVudEVtYmVkLmZpZWxkcyA9IGZpZWxkc1xuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGZvb3RlciBpbiB0aGUgY3VycmVudCBlbWJlZC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSBUaGUgdGV4dCB0byBkaXNwbGF5IGluIHRoZSBmb290ZXJcbiAgICogQHBhcmFtIHs/T21pdDxEaXNjb3JkRW1iZWRGb290ZXIsICd0ZXh0Jz59IFtvcHRpb25zXVxuICAgKiBAcmV0dXJucyB7RW1iZWRzQnVpbGRlcn1cbiAgICovXG4gIHNldEZvb3Rlcih0ZXh0OiBzdHJpbmcsIG9wdGlvbnM/OiBPbWl0PERpc2NvcmRFbWJlZEZvb3RlciwgJ3RleHQnPik6IHRoaXMge1xuICAgIHRoaXMuI2N1cnJlbnRFbWJlZC5mb290ZXIgPSB7XG4gICAgICAuLi50aGlzLiNjdXJyZW50RW1iZWQuZm9vdGVyLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIHRleHQsXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGltYWdlIGluIHRoZSBjdXJyZW50IGVtYmVkLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIC0gVVJMIG9mIHRoZSBpbWFnZVxuICAgKiBAcGFyYW0gez9PbWl0PERpc2NvcmRFbWJlZEltYWdlLCAndXJsJz59IFtvcHRpb25zXVxuICAgKiBAcmV0dXJucyB7RW1iZWRzQnVpbGRlcn1cbiAgICovXG4gIHNldEltYWdlKHVybDogc3RyaW5nLCBvcHRpb25zPzogT21pdDxEaXNjb3JkRW1iZWRJbWFnZSwgJ3VybCc+KTogdGhpcyB7XG4gICAgdGhpcy4jY3VycmVudEVtYmVkLmltYWdlID0ge1xuICAgICAgLi4udGhpcy4jY3VycmVudEVtYmVkLmltYWdlLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIHVybCxcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgcHJvdmlkZXIgb2YgdGhlIGN1cnJlbnQgZW1iZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7P3N0cmluZ30gW3VybF1cbiAgICogQHJldHVybnMge0VtYmVkc0J1aWxkZXJ9XG4gICAqL1xuICBzZXRQcm92aWRlcihuYW1lOiBzdHJpbmcsIHVybD86IHN0cmluZyk6IHRoaXMge1xuICAgIHRoaXMuI2N1cnJlbnRFbWJlZC5wcm92aWRlciA9IHtcbiAgICAgIG5hbWUsXG4gICAgICB1cmwsXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGNvbG9yIG9mIHRoZSBjdXJyZW50IGVtYmVkIHRvIGEgcmFuZG9tIHZhbHVlLlxuICAgKlxuICAgKiBAcmV0dXJucyB7RW1iZWRzQnVpbGRlcn1cbiAgICovXG4gIHNldFJhbmRvbUNvbG9yKCk6IHRoaXMge1xuICAgIHJldHVybiB0aGlzLnNldENvbG9yKE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqICgweGZmZmZmZiArIDEpKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHRpdGxlIG9mIHRoZSBjdXJyZW50IGVtYmVkLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGl0bGVcbiAgICogQHBhcmFtIHs/c3RyaW5nfSBbdXJsXVxuICAgKiBAcmV0dXJucyB7RW1iZWRzQnVpbGRlcn1cbiAgICovXG4gIHNldFRpdGxlKHRpdGxlOiBzdHJpbmcsIHVybD86IHN0cmluZyk6IHRoaXMge1xuICAgIHRoaXMuI2N1cnJlbnRFbWJlZC50aXRsZSA9IHRpdGxlXG5cbiAgICBpZiAodXJsKSB7XG4gICAgICB0aGlzLnNldFVybCh1cmwpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHRpbWVzdGFtcCBvZiB0aGUgY3VycmVudCBlbWJlZC5cbiAgICpcbiAgICogQHBhcmFtIHs/KHN0cmluZyB8IG51bWJlciB8IERhdGUpfSBbdGltZXN0YW1wXVxuICAgKiBAcmV0dXJucyB7RW1iZWRzQnVpbGRlcn1cbiAgICovXG4gIHNldFRpbWVzdGFtcCh0aW1lc3RhbXA/OiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlKTogdGhpcyB7XG4gICAgdGhpcy4jY3VycmVudEVtYmVkLnRpbWVzdGFtcCA9IG5ldyBEYXRlKHRpbWVzdGFtcCEpLnRvSVNPU3RyaW5nKClcblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSB0aHVtYm5haWwgb2YgdGhlIGN1cnJlbnQgZW1iZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgLSBVUkwgb2YgdGhlIGltYWdlXG4gICAqIEBwYXJhbSB7P09taXQ8RGlzY29yZEVtYmVkVGh1bWJuYWlsLCAndXJsJz59IFtvcHRpb25zXVxuICAgKiBAcmV0dXJucyB7RW1iZWRzQnVpbGRlcn1cbiAgICovXG4gIHNldFRodW1ibmFpbCh1cmw6IHN0cmluZywgb3B0aW9ucz86IE9taXQ8RGlzY29yZEVtYmVkVGh1bWJuYWlsLCAndXJsJz4pOiB0aGlzIHtcbiAgICB0aGlzLiNjdXJyZW50RW1iZWQudGh1bWJuYWlsID0ge1xuICAgICAgLi4udGhpcy4jY3VycmVudEVtYmVkLnRodW1ibmFpbCxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICB1cmwsXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIFVSTCBvZiB0aGUgY3VycmVudCBlbWJlZCB0aXRsZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICAgKiBAcmV0dXJucyB7RW1iZWRzQnVpbGRlcn1cbiAgICovXG4gIHNldFVybCh1cmw6IHN0cmluZyk6IHRoaXMge1xuICAgIHRoaXMuI2N1cnJlbnRFbWJlZC51cmwgPSB1cmxcblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSB2aWRlbyBvZiB0aGUgY3VycmVudCBlbWJlZC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICAgKiBAcGFyYW0gez9PbWl0PERpc2NvcmRFbWJlZFZpZGVvLCAndXJsJz59IFtvcHRpb25zXVxuICAgKiBAcmV0dXJucyB7RW1iZWRzQnVpbGRlcn1cbiAgICovXG4gIHNldFZpZGVvKHVybDogc3RyaW5nLCBvcHRpb25zPzogT21pdDxEaXNjb3JkRW1iZWRWaWRlbywgJ3VybCc+KTogdGhpcyB7XG4gICAgdGhpcy4jY3VycmVudEVtYmVkLnZpZGVvID0ge1xuICAgICAgLi4udGhpcy4jY3VycmVudEVtYmVkLnZpZGVvLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIHVybCxcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGFsbCBlbWJlZHMgYXZhaWxhYmxlIGFnYWluc3QgY3VycmVudCBrbm93biBEaXNjb3JkIGxpbWl0cyB0byBoZWxwIHByZXZlbnQgYmFkIHJlcXVlc3RzLlxuICAgKlxuICAgKiBAcmV0dXJucyB7RW1iZWRzQnVpbGRlcn1cbiAgICovXG4gIHZhbGlkYXRlKCk6IHRoaXMge1xuICAgIGxldCB0b3RhbENoYXJhY3RlcnMgPSAwXG5cbiAgICBpZiAodGhpcy5sZW5ndGggPiAxMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgY2FuIG5vdCBoYXZlIG1vcmUgdGhhbiAxMCBlbWJlZHMgb24gYSBzaW5nbGUgbWVzc2FnZS4nKVxuICAgIH1cblxuICAgIHRoaXMuZm9yRWFjaCgoeyBhdXRob3IsIGRlc2NyaXB0aW9uLCBmaWVsZHMsIGZvb3RlciwgdGl0bGUgfSwgaW5kZXgpID0+IHtcbiAgICAgIGlmICh0aXRsZSkge1xuICAgICAgICBjb25zdCB0cmltbWVkVGl0bGUgPSB0aXRsZS50cmltKClcblxuICAgICAgICBpZiAodHJpbW1lZFRpdGxlLmxlbmd0aCA+IDI1Nikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGl0bGUgb2YgZW1iZWQgJHtpbmRleH0gY2FuIG5vdCBiZSBsb25nZXIgdGhhbiAyNTYgY2hhcmFjdGVycy5gKVxuICAgICAgICB9XG5cbiAgICAgICAgdG90YWxDaGFyYWN0ZXJzICs9IHRyaW1tZWRUaXRsZS5sZW5ndGhcbiAgICAgIH1cblxuICAgICAgaWYgKGRlc2NyaXB0aW9uKSB7XG4gICAgICAgIGNvbnN0IHRyaW1tZWREZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uLnRyaW0oKVxuXG4gICAgICAgIGlmICh0cmltbWVkRGVzY3JpcHRpb24ubGVuZ3RoID4gNDA5Nikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRGVzY3JpcHRpb24gb2YgZW1iZWQgJHtpbmRleH0gY2FuIG5vdCBiZSBsb25nZXIgdGhhbiA0MDk2IGNoYXJhY3RlcnMuYClcbiAgICAgICAgfVxuXG4gICAgICAgIHRvdGFsQ2hhcmFjdGVycyArPSB0cmltbWVkRGVzY3JpcHRpb24ubGVuZ3RoXG4gICAgICB9XG5cbiAgICAgIGlmIChmaWVsZHMpIHtcbiAgICAgICAgaWYgKGZpZWxkcy5sZW5ndGggPiAyNSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgZW1iZWQgJHtpbmRleH0gY2FuIG5vdCBoYXZlIG1vcmUgdGhhbiAyNSBmaWVsZHMuYClcbiAgICAgICAgfVxuXG4gICAgICAgIGZpZWxkcy5mb3JFYWNoKCh7IG5hbWUsIHZhbHVlIH0sIGZpZWxkSW5kZXgpID0+IHtcbiAgICAgICAgICBjb25zdCB0cmltbWVkTmFtZSA9IG5hbWUudHJpbSgpXG4gICAgICAgICAgY29uc3QgdHJpbW1lZFZhbHVlID0gdmFsdWUudHJpbSgpXG5cbiAgICAgICAgICBpZiAodHJpbW1lZE5hbWUubGVuZ3RoID4gMjU2KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5hbWUgb2YgZmllbGQgJHtmaWVsZEluZGV4fSBvbiBlbWJlZCAke2luZGV4fSBjYW4gbm90IGJlIGxvbmdlciB0aGFuIDI1NiBjaGFyYWN0ZXJzLmApXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHRyaW1tZWRWYWx1ZS5sZW5ndGggPiA0MDk2KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFZhbHVlIG9mIGZpZWxkICR7ZmllbGRJbmRleH0gb24gZW1iZWQgJHtpbmRleH0gY2FuIG5vdCBiZSBsb25nZXIgdGhhbiAxMDI0IGNoYXJhY3RlcnMuYClcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0b3RhbENoYXJhY3RlcnMgKz0gdHJpbW1lZE5hbWUubGVuZ3RoXG4gICAgICAgICAgdG90YWxDaGFyYWN0ZXJzICs9IHRyaW1tZWRWYWx1ZS5sZW5ndGhcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgaWYgKGZvb3Rlcikge1xuICAgICAgICBjb25zdCB0cmltbWVkRm9vdGVyVGV4dCA9IGZvb3Rlci50ZXh0LnRyaW0oKVxuXG4gICAgICAgIGlmICh0cmltbWVkRm9vdGVyVGV4dC5sZW5ndGggPiAyMDQ4KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGb290ZXIgdGV4dCBvZiBlbWJlZCAke2luZGV4fSBjYW4gbm90IGJlIGxvbmdlciB0aGFuIDIwNDggY2hhcmFjdGVycy5gKVxuICAgICAgICB9XG5cbiAgICAgICAgdG90YWxDaGFyYWN0ZXJzICs9IHRyaW1tZWRGb290ZXJUZXh0Lmxlbmd0aFxuICAgICAgfVxuXG4gICAgICBpZiAoYXV0aG9yKSB7XG4gICAgICAgIGNvbnN0IHRyaW1tZWRBdXRob3JOYW1lID0gYXV0aG9yLm5hbWUudHJpbSgpXG5cbiAgICAgICAgaWYgKHRyaW1tZWRBdXRob3JOYW1lLmxlbmd0aCA+IDI1Nikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQXV0aG9yIG5hbWUgb2YgZW1iZWQgJHtpbmRleH0gY2FuIG5vdCBiZSBsb25nZXIgdGhhbiAyNTYgY2hhcmFjdGVycy5gKVxuICAgICAgICB9XG5cbiAgICAgICAgdG90YWxDaGFyYWN0ZXJzICs9IHRyaW1tZWRBdXRob3JOYW1lLmxlbmd0aFxuICAgICAgfVxuICAgIH0pXG5cbiAgICBpZiAodG90YWxDaGFyYWN0ZXJzID4gNjAwMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUb3RhbCBjaGFyYWN0ZXIgbGVuZ3RoIG9mIGFsbCBlbWJlZHMgY2FuIG5vdCBleGNlZWQgNjAwMCBjaGFyYWN0ZXJzLicpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGVtYmVkLlxuICAgKlxuICAgKiBAcmVhZG9ubHlcbiAgICogQHR5cGUge0Rpc2NvcmRFbWJlZH1cbiAgICovXG4gIGdldCAjY3VycmVudEVtYmVkKCk6IERpc2NvcmRFbWJlZCB7XG4gICAgaWYgKHRoaXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLm5ld0VtYmVkKClcbiAgICAgIHRoaXMuc2V0Q3VycmVudEVtYmVkKClcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpc1t0aGlzLiNjdXJyZW50RW1iZWRJbmRleF1cbiAgfVxufVxuIl0sIm5hbWVzIjpbIkVtYmVkc0J1aWxkZXIiLCJBcnJheSIsImN1cnJlbnRFbWJlZEluZGV4IiwiYWRkRmllbGQiLCJuYW1lIiwidmFsdWUiLCJpbmxpbmUiLCJjdXJyZW50RW1iZWQiLCJmaWVsZHMiLCJ1bmRlZmluZWQiLCJwdXNoIiwibmV3RW1iZWQiLCJsZW5ndGgiLCJFcnJvciIsInNldEN1cnJlbnRFbWJlZCIsInNldEF1dGhvciIsIm9wdGlvbnMiLCJhdXRob3IiLCJzZXRDb2xvciIsImNvbG9yIiwiY29udmVydGVkVmFsdWUiLCJwYXJzZUludCIsInJlcGxhY2UiLCJOdW1iZXIiLCJpc05hTiIsImluZGV4Iiwic2V0RGVzY3JpcHRpb24iLCJkZXNjcmlwdGlvbiIsInNldEZpZWxkcyIsInNldEZvb3RlciIsInRleHQiLCJmb290ZXIiLCJzZXRJbWFnZSIsInVybCIsImltYWdlIiwic2V0UHJvdmlkZXIiLCJwcm92aWRlciIsInNldFJhbmRvbUNvbG9yIiwiTWF0aCIsImZsb29yIiwicmFuZG9tIiwic2V0VGl0bGUiLCJ0aXRsZSIsInNldFVybCIsInNldFRpbWVzdGFtcCIsInRpbWVzdGFtcCIsIkRhdGUiLCJ0b0lTT1N0cmluZyIsInNldFRodW1ibmFpbCIsInRodW1ibmFpbCIsInNldFZpZGVvIiwidmlkZW8iLCJ2YWxpZGF0ZSIsInRvdGFsQ2hhcmFjdGVycyIsImZvckVhY2giLCJ0cmltbWVkVGl0bGUiLCJ0cmltIiwidHJpbW1lZERlc2NyaXB0aW9uIiwiZmllbGRJbmRleCIsInRyaW1tZWROYW1lIiwidHJpbW1lZFZhbHVlIiwidHJpbW1lZEZvb3RlclRleHQiLCJ0cmltbWVkQXV0aG9yTmFtZSJdLCJtYXBwaW5ncyI6Ijs7OzsrQkF3QmFBOzs7ZUFBQUE7OztBQUFOLElBQUEsQUFBTUEsZ0JBQU4sTUFBTUEsc0JBQXNCQztJQUNqQyxDQUFDQyxpQkFBaUIsQ0FBWTtJQUU5Qjs7Ozs7OztHQU9DLEdBQ0RDLFNBQVNDLElBQVksRUFBRUMsS0FBYSxFQUFFQyxNQUFnQixFQUFRO1FBQzVELElBQUksSUFBSSxDQUFDLENBQUNDLFlBQVksQ0FBQ0MsTUFBTSxLQUFLQyxXQUFXO1lBQzNDLElBQUksQ0FBQyxDQUFDRixZQUFZLENBQUNDLE1BQU0sR0FBRyxFQUFFO1FBQ2hDO1FBRUEsSUFBSSxDQUFDLENBQUNELFlBQVksQ0FBQ0MsTUFBTSxDQUFDRSxJQUFJLENBQUM7WUFDN0JOO1lBQ0FDO1lBQ0FDO1FBQ0Y7UUFFQSxPQUFPLElBQUk7SUFDYjtJQUVBOzs7O0dBSUMsR0FDREssV0FBaUI7UUFDZixJQUFJLElBQUksQ0FBQ0MsTUFBTSxJQUFJLElBQUk7WUFDckIsTUFBTSxJQUFJQyxNQUFNO1FBQ2xCO1FBRUEsSUFBSSxDQUFDSCxJQUFJLENBQUMsQ0FBQztRQUNYLElBQUksQ0FBQ0ksZUFBZTtRQUVwQixPQUFPLElBQUk7SUFDYjtJQUVBOzs7Ozs7R0FNQyxHQUNEQyxVQUFVWCxJQUFZLEVBQUVZLE9BQTBDLEVBQVE7UUFDeEUsSUFBSSxDQUFDLENBQUNULFlBQVks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
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "createEmbeds", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return createEmbeds;
9
+ }
10
+ });
11
+ const _embeds = _export_star(require("./builders/embeds.cjs"), exports);
12
+ function _export_star(from, to) {
13
+ Object.keys(from).forEach(function(k) {
14
+ if (k !== "default" && !Object.prototype.hasOwnProperty.call(to, k)) {
15
+ Object.defineProperty(to, k, {
16
+ enumerable: true,
17
+ get: function() {
18
+ return from[k];
19
+ }
20
+ });
21
+ }
22
+ });
23
+ return from;
24
+ }
25
+ const createEmbeds = ()=>new _embeds.EmbedsBuilder();
26
+
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9idWlsZGVycy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbWJlZHNCdWlsZGVyIH0gZnJvbSAnLi9idWlsZGVycy9lbWJlZHMuanMnXG5cbmV4cG9ydCAqIGZyb20gJy4vYnVpbGRlcnMvZW1iZWRzLmpzJ1xuXG5leHBvcnQgY29uc3QgY3JlYXRlRW1iZWRzID0gKCk6IEVtYmVkc0J1aWxkZXIgPT4gbmV3IEVtYmVkc0J1aWxkZXIoKVxuIl0sIm5hbWVzIjpbImNyZWF0ZUVtYmVkcyIsIkVtYmVkc0J1aWxkZXIiXSwibWFwcGluZ3MiOiI7Ozs7K0JBSWFBOzs7ZUFBQUE7OztxQ0FKaUI7Ozs7Ozs7Ozs7Ozs7O0FBSXZCLE1BQU1BLGVBQWUsSUFBcUIsSUFBSUMscUJBQWEifQ==
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ function _export(target, all) {
6
+ for(var name in all)Object.defineProperty(target, name, {
7
+ enumerable: true,
8
+ get: all[name]
9
+ });
10
+ }
11
+ _export(exports, {
12
+ camelToSnakeCase: function() {
13
+ return camelToSnakeCase;
14
+ },
15
+ camelize: function() {
16
+ return camelize;
17
+ },
18
+ snakeToCamelCase: function() {
19
+ return snakeToCamelCase;
20
+ },
21
+ snakelize: function() {
22
+ return snakelize;
23
+ }
24
+ });
25
+ function camelize(object) {
26
+ if (Array.isArray(object)) {
27
+ return object.map((element)=>camelize(element));
28
+ }
29
+ if (typeof object === 'object' && object !== null) {
30
+ const obj = {};
31
+ Object.keys(object).forEach((key)=>{
32
+ obj[snakeToCamelCase(key)] = camelize(object[key]);
33
+ });
34
+ return obj;
35
+ }
36
+ return object;
37
+ }
38
+ function snakelize(object) {
39
+ if (Array.isArray(object)) {
40
+ return object.map((element)=>snakelize(element));
41
+ }
42
+ if (typeof object === 'object' && object !== null) {
43
+ const obj = {};
44
+ Object.keys(object).forEach((key)=>{
45
+ obj[camelToSnakeCase(key)] = snakelize(object[key]);
46
+ });
47
+ return obj;
48
+ }
49
+ return object;
50
+ }
51
+ function snakeToCamelCase(str) {
52
+ if (!str.includes('_')) return str;
53
+ let result = '';
54
+ for(let i = 0, len = str.length; i < len; ++i){
55
+ if (str[i] === '_') {
56
+ result += str[++i].toUpperCase();
57
+ continue;
58
+ }
59
+ result += str[i];
60
+ }
61
+ return result;
62
+ }
63
+ function camelToSnakeCase(str) {
64
+ let result = '';
65
+ for(let i = 0, len = str.length; i < len; ++i){
66
+ if (str[i] >= 'A' && str[i] <= 'Z') {
67
+ result += `_${str[i].toLowerCase()}`;
68
+ continue;
69
+ }
70
+ result += str[i];
71
+ }
72
+ return result;
73
+ }
74
+
75
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jYXNpbmcudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDYW1lbGl6ZSwgU25ha2VsaXplIH0gZnJvbSAnQGRpc2NvcmRlbm8vdHlwZXMnXG5cbmV4cG9ydCBmdW5jdGlvbiBjYW1lbGl6ZTxUPihvYmplY3Q6IFQpOiBDYW1lbGl6ZTxUPiB7XG4gIGlmIChBcnJheS5pc0FycmF5KG9iamVjdCkpIHtcbiAgICByZXR1cm4gb2JqZWN0Lm1hcCgoZWxlbWVudCkgPT4gY2FtZWxpemUoZWxlbWVudCkpIGFzIENhbWVsaXplPFQ+XG4gIH1cblxuICBpZiAodHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcgJiYgb2JqZWN0ICE9PSBudWxsKSB7XG4gICAgY29uc3Qgb2JqID0ge30gYXMgQ2FtZWxpemU8VD5cbiAgICA7KE9iamVjdC5rZXlzKG9iamVjdCkgYXMgQXJyYXk8a2V5b2YgVD4pLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBqcyBoYWNrXG4gICAgICA7KG9ialtzbmFrZVRvQ2FtZWxDYXNlKGtleSldIGFzIENhbWVsaXplPChUICYgb2JqZWN0KVtrZXlvZiBUXT4pID0gY2FtZWxpemUob2JqZWN0W2tleV0pXG4gICAgfSlcbiAgICByZXR1cm4gb2JqXG4gIH1cbiAgcmV0dXJuIG9iamVjdCBhcyBDYW1lbGl6ZTxUPlxufVxuXG5leHBvcnQgZnVuY3Rpb24gc25ha2VsaXplPFQ+KG9iamVjdDogVCk6IFNuYWtlbGl6ZTxUPiB7XG4gIGlmIChBcnJheS5pc0FycmF5KG9iamVjdCkpIHtcbiAgICByZXR1cm4gb2JqZWN0Lm1hcCgoZWxlbWVudCkgPT4gc25ha2VsaXplKGVsZW1lbnQpKSBhcyBTbmFrZWxpemU8VD5cbiAgfVxuXG4gIGlmICh0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJiBvYmplY3QgIT09IG51bGwpIHtcbiAgICBjb25zdCBvYmogPSB7fSBhcyBTbmFrZWxpemU8VD5cbiAgICA7KE9iamVjdC5rZXlzKG9iamVjdCkgYXMgQXJyYXk8a2V5b2YgVD4pLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBqcyBoYWNrXG4gICAgICA7KG9ialtjYW1lbFRvU25ha2VDYXNlKGtleSldIGFzIFNuYWtlbGl6ZTwoVCAmIG9iamVjdClba2V5b2YgVF0+KSA9IHNuYWtlbGl6ZShvYmplY3Rba2V5XSlcbiAgICB9KVxuICAgIHJldHVybiBvYmpcbiAgfVxuICByZXR1cm4gb2JqZWN0IGFzIFNuYWtlbGl6ZTxUPlxufVxuXG5leHBvcnQgZnVuY3Rpb24gc25ha2VUb0NhbWVsQ2FzZShzdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmICghc3RyLmluY2x1ZGVzKCdfJykpIHJldHVybiBzdHJcblxuICBsZXQgcmVzdWx0ID0gJydcbiAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHN0ci5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuICAgIGlmIChzdHJbaV0gPT09ICdfJykge1xuICAgICAgcmVzdWx0ICs9IHN0clsrK2ldLnRvVXBwZXJDYXNlKClcblxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICByZXN1bHQgKz0gc3RyW2ldXG4gIH1cblxuICByZXR1cm4gcmVzdWx0XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjYW1lbFRvU25ha2VDYXNlKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgbGV0IHJlc3VsdCA9ICcnXG4gIGZvciAobGV0IGkgPSAwLCBsZW4gPSBzdHIubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHtcbiAgICBpZiAoc3RyW2ldID49ICdBJyAmJiBzdHJbaV0gPD0gJ1onKSB7XG4gICAgICByZXN1bHQgKz0gYF8ke3N0cltpXS50b0xvd2VyQ2FzZSgpfWBcblxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICByZXN1bHQgKz0gc3RyW2ldXG4gIH1cblxuICByZXR1cm4gcmVzdWx0XG59XG4iXSwibmFtZXMiOlsiY2FtZWxUb1NuYWtlQ2FzZSIsImNhbWVsaXplIiwic25ha2VUb0NhbWVsQ2FzZSIsInNuYWtlbGl6ZSIsIm9iamVjdCIsIkFycmF5IiwiaXNBcnJheSIsIm1hcCIsImVsZW1lbnQiLCJvYmoiLCJPYmplY3QiLCJrZXlzIiwiZm9yRWFjaCIsImtleSIsInN0ciIsImluY2x1ZGVzIiwicmVzdWx0IiwiaSIsImxlbiIsImxlbmd0aCIsInRvVXBwZXJDYXNlIiwidG9Mb3dlckNhc2UiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0lBbURnQkEsZ0JBQWdCO2VBQWhCQTs7SUFqREFDLFFBQVE7ZUFBUkE7O0lBZ0NBQyxnQkFBZ0I7ZUFBaEJBOztJQWhCQUMsU0FBUztlQUFUQTs7O0FBaEJULFNBQVNGLFNBQVlHLE1BQVM7SUFDbkMsSUFBSUMsTUFBTUMsT0FBTyxDQUFDRixTQUFTO1FBQ3pCLE9BQU9BLE9BQU9HLEdBQUcsQ0FBQyxDQUFDQyxVQUFZUCxTQUFTTztJQUMxQztJQUVBLElBQUksT0FBT0osV0FBVyxZQUFZQSxXQUFXLE1BQU07UUFDakQsTUFBTUssTUFBTSxDQUFDO1FBQ1hDLE9BQU9DLElBQUksQ0FBQ1AsUUFBMkJRLE9BQU8sQ0FBQyxDQUFDQztZQUU5Q0osR0FBRyxDQUFDUCxpQkFBaUJXLEtBQUssR0FBdUNaLFNBQVNHLE1BQU0sQ0FBQ1MsSUFBSTtRQUN6RjtRQUNBLE9BQU9KO0lBQ1Q7SUFDQSxPQUFPTDtBQUNUO0FBRU8sU0FBU0QsVUFBYUMsTUFBUztJQUNwQyxJQUFJQyxNQUFNQyxPQUFPLENBQUNGLFNBQVM7UUFDekIsT0FBT0EsT0FBT0csR0FBRyxDQUFDLENBQUNDLFVBQVlMLFVBQVVLO0lBQzNDO0lBRUEsSUFBSSxPQUFPSixXQUFXLFlBQVlBLFdBQVcsTUFBTTtRQUNqRCxNQUFNSyxNQUFNLENBQUM7UUFDWEMsT0FBT0MsSUFBSSxDQUFDUCxRQUEyQlEsT0FBTyxDQUFDLENBQUNDO1lBRTlDSixHQUFHLENBQUNULGlCQUFpQmEsS0FBSyxHQUF3Q1YsVUFBVUMsTUFBTSxDQUFDUyxJQUFJO1FBQzNGO1FBQ0EsT0FBT0o7SUFDVDtJQUNBLE9BQU9MO0FBQ1Q7QUFFTyxTQUFTRixpQkFBaUJZLEdBQVc7SUFDMUMsSUFBSSxDQUFDQSxJQUFJQyxRQUFRLENBQUMsTUFBTSxPQUFPRDtJQUUvQixJQUFJRSxTQUFTO0lBQ2IsSUFBSyxJQUFJQyxJQUFJLEdBQUdDLE1BQU1KLElBQUlLLE1BQU0sRUFBRUYsSUFBSUMsS0FBSyxFQUFFRCxFQUFHO1FBQzlDLElBQUlILEdBQUcsQ0FBQ0csRUFBRSxLQUFLLEtBQUs7WUFDbEJELFVBQVVGLEdBQUcsQ0FBQyxFQUFFRyxFQUFFLENBQUNHLFdBQVc7WUFFOUI7UUFDRjtRQUVBSixVQUFVRixHQUFHLENBQUNHLEVBQUU7SUFDbEI7SUFFQSxPQUFPRDtBQUNUO0FBRU8sU0FBU2hCLGlCQUFpQmMsR0FBVztJQUMxQyxJQUFJRSxTQUFTO0lBQ2IsSUFBSyxJQUFJQyxJQUFJLEdBQUdDLE1BQU1KLElBQUlLLE1BQU0sRUFBRUYsSUFBSUMsS0FBSyxFQUFFRCxFQUFHO1FBQzlDLElBQUlILEdBQUcsQ0FBQ0csRUFBRSxJQUFJLE9BQU9ILEdBQUcsQ0FBQ0csRUFBRSxJQUFJLEtBQUs7WUFDbENELFVBQVUsQ0FBQyxDQUFDLEVBQUVGLEdBQUcsQ0FBQ0csRUFBRSxDQUFDSSxXQUFXLEdBQUcsQ0FBQztZQUVwQztRQUNGO1FBRUFMLFVBQVVGLEdBQUcsQ0FBQ0csRUFBRTtJQUNsQjtJQUVBLE9BQU9EO0FBQ1QifQ==