@discordeno/rest 19.0.0-next.fd8642b → 19.0.0-next.fda3003

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 (40) hide show
  1. package/dist/cjs/index.cjs +25 -0
  2. package/dist/cjs/invalidBucket.cjs +87 -0
  3. package/dist/cjs/manager.cjs +1446 -0
  4. package/dist/cjs/queue.cjs +166 -0
  5. package/dist/cjs/routes.cjs +581 -0
  6. package/dist/cjs/types.cjs +6 -0
  7. package/dist/cjs/typings/routes.cjs +6 -0
  8. package/dist/esm/index.js +8 -0
  9. package/dist/esm/invalidBucket.js +83 -0
  10. package/dist/esm/manager.js +1404 -0
  11. package/dist/esm/queue.js +156 -0
  12. package/dist/esm/routes.js +571 -0
  13. package/dist/esm/types.js +3 -0
  14. package/dist/esm/typings/routes.js +3 -0
  15. package/dist/tsconfig.tsbuildinfo +1 -0
  16. package/dist/types/index.d.ts +7 -0
  17. package/dist/types/index.d.ts.map +1 -0
  18. package/dist/{invalidBucket.d.ts → types/invalidBucket.d.ts} +11 -7
  19. package/dist/types/invalidBucket.d.ts.map +1 -0
  20. package/dist/types/manager.d.ts +12 -0
  21. package/dist/types/manager.d.ts.map +1 -0
  22. package/dist/{queue.d.ts → types/queue.d.ts} +19 -1
  23. package/dist/types/queue.d.ts.map +1 -0
  24. package/dist/types/routes.d.ts +3 -0
  25. package/dist/types/routes.d.ts.map +1 -0
  26. package/dist/types/types.d.ts +2816 -0
  27. package/dist/types/types.d.ts.map +1 -0
  28. package/dist/types/typings/routes.d.ts +277 -0
  29. package/dist/types/typings/routes.d.ts.map +1 -0
  30. package/package.json +30 -24
  31. package/dist/index.d.ts +0 -4
  32. package/dist/index.d.ts.map +0 -1
  33. package/dist/index.js +0 -2
  34. package/dist/invalidBucket.d.ts.map +0 -1
  35. package/dist/invalidBucket.js +0 -2
  36. package/dist/manager.d.ts +0 -3574
  37. package/dist/manager.d.ts.map +0 -1
  38. package/dist/manager.js +0 -2
  39. package/dist/queue.d.ts.map +0 -1
  40. package/dist/queue.js +0 -2
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9
@@ -0,0 +1,8 @@
1
+ export * from './typings/routes.js';
2
+ export * from './invalidBucket.js';
3
+ export * from './manager.js';
4
+ export * from './queue.js';
5
+ export * from './routes.js';
6
+ export * from './types.js';
7
+
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL3R5cGluZ3Mvcm91dGVzLmpzJ1xuZXhwb3J0ICogZnJvbSAnLi9pbnZhbGlkQnVja2V0LmpzJ1xuZXhwb3J0ICogZnJvbSAnLi9tYW5hZ2VyLmpzJ1xuZXhwb3J0ICogZnJvbSAnLi9xdWV1ZS5qcydcbmV4cG9ydCAqIGZyb20gJy4vcm91dGVzLmpzJ1xuZXhwb3J0ICogZnJvbSAnLi90eXBlcy5qcydcbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLHNCQUFxQjtBQUNuQyxjQUFjLHFCQUFvQjtBQUNsQyxjQUFjLGVBQWM7QUFDNUIsY0FBYyxhQUFZO0FBQzFCLGNBQWMsY0FBYTtBQUMzQixjQUFjLGFBQVkifQ==
@@ -0,0 +1,83 @@
1
+ import { delay, logger } from '@discordeno/utils';
2
+ /**
3
+ * A invalid request bucket is used in a similar manner as a leaky bucket but a invalid request bucket can be refilled as needed.
4
+ * It's purpose is to make sure the bot does not hit the limit to getting a 1 hr ban.
5
+ *
6
+ * @param options The options used to configure this bucket.
7
+ * @returns RefillingBucket
8
+ */ export function createInvalidRequestBucket(options) {
9
+ const bucket = {
10
+ invalidRequests: options.current ?? 0,
11
+ max: options.max ?? 10000,
12
+ interval: options.interval ?? 600_000,
13
+ resetAt: options.resetAt,
14
+ safety: options.safety ?? 1,
15
+ errorStatuses: options.errorStatuses ?? [
16
+ 401,
17
+ 403,
18
+ 429
19
+ ],
20
+ activeRequests: options.requested ?? 0,
21
+ processing: false,
22
+ logger: options.logger ?? logger,
23
+ waiting: [],
24
+ requestsAllowed: function() {
25
+ if (bucket.resetAt !== undefined && Date.now() >= bucket.resetAt) {
26
+ bucket.invalidRequests = 0;
27
+ bucket.resetAt = Date.now() + bucket.interval;
28
+ }
29
+ return bucket.max - bucket.invalidRequests - bucket.activeRequests - bucket.safety;
30
+ },
31
+ isRequestAllowed: function() {
32
+ return bucket.requestsAllowed() > 0;
33
+ },
34
+ waitUntilRequestAvailable: async function() {
35
+ // eslint-disable-next-line no-async-promise-executor
36
+ return await new Promise(async (resolve)=>{
37
+ // If whatever amount of requests is left is more than the safety margin, allow the request
38
+ if (bucket.isRequestAllowed()) {
39
+ bucket.activeRequests += 1;
40
+ resolve();
41
+ } else {
42
+ bucket.waiting.push(resolve);
43
+ await bucket.processWaiting();
44
+ }
45
+ });
46
+ },
47
+ processWaiting: async function() {
48
+ // If already processing, that loop will handle all waiting requests.
49
+ if (bucket.processing) return;
50
+ // Mark as processing so other loops don't start
51
+ bucket.processing = true;
52
+ while(bucket.waiting.length > 0){
53
+ bucket.logger.info(`[InvalidBucket] processing waiting queue while loop ran with ${bucket.waiting.length} pending requests to be made. ${JSON.stringify(bucket)}`);
54
+ if (!bucket.isRequestAllowed() && bucket.resetAt !== undefined) {
55
+ bucket.logger.warn(`[InvalidBucket] processing waiting queue is now paused until more requests are available. ${bucket.waiting.length} pending requests. ${JSON.stringify(bucket)}`);
56
+ await delay(bucket.resetAt - Date.now());
57
+ }
58
+ bucket.activeRequests += 1;
59
+ // Resolve the next item in the queue
60
+ bucket.waiting.shift()?.();
61
+ }
62
+ // Mark as false so next pending request can be triggered by new loop.
63
+ bucket.processing = false;
64
+ },
65
+ handleCompletedRequest: function(code, sharedScope) {
66
+ // Since request is complete, we can remove one from requested.
67
+ bucket.activeRequests -= 1;
68
+ // Since it is as a valid request, we don't need to do anything
69
+ if (!bucket.errorStatuses.includes(code)) return;
70
+ // Shared scope is not considered invalid
71
+ if (code === 429 && sharedScope) return;
72
+ // INVALID REQUEST WAS MADE
73
+ if (bucket.resetAt === undefined) {
74
+ bucket.resetAt = Date.now() + bucket.interval;
75
+ }
76
+ bucket.invalidRequests += 1;
77
+ bucket.logger.warn(`[InvalidBucket] an invalid request was made. Increasing invalidRequests count to ${bucket.invalidRequests}`);
78
+ }
79
+ };
80
+ return bucket;
81
+ }
82
+
83
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9pbnZhbGlkQnVja2V0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRlbGF5LCBsb2dnZXIgfSBmcm9tICdAZGlzY29yZGVuby91dGlscydcblxuLyoqXG4gKiBBIGludmFsaWQgcmVxdWVzdCBidWNrZXQgaXMgdXNlZCBpbiBhIHNpbWlsYXIgbWFubmVyIGFzIGEgbGVha3kgYnVja2V0IGJ1dCBhIGludmFsaWQgcmVxdWVzdCBidWNrZXQgY2FuIGJlIHJlZmlsbGVkIGFzIG5lZWRlZC5cbiAqIEl0J3MgcHVycG9zZSBpcyB0byBtYWtlIHN1cmUgdGhlIGJvdCBkb2VzIG5vdCBoaXQgdGhlIGxpbWl0IHRvIGdldHRpbmcgYSAxIGhyIGJhbi5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGlzIGJ1Y2tldC5cbiAqIEByZXR1cm5zIFJlZmlsbGluZ0J1Y2tldFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSW52YWxpZFJlcXVlc3RCdWNrZXQob3B0aW9uczogSW52YWxpZFJlcXVlc3RCdWNrZXRPcHRpb25zKTogSW52YWxpZFJlcXVlc3RCdWNrZXQge1xuICBjb25zdCBidWNrZXQ6IEludmFsaWRSZXF1ZXN0QnVja2V0ID0ge1xuICAgIGludmFsaWRSZXF1ZXN0czogb3B0aW9ucy5jdXJyZW50ID8/IDAsXG4gICAgbWF4OiBvcHRpb25zLm1heCA/PyAxMDAwMCxcbiAgICBpbnRlcnZhbDogb3B0aW9ucy5pbnRlcnZhbCA/PyA2MDBfMDAwLCAvLyAxMCBtaW51dGVzXG4gICAgcmVzZXRBdDogb3B0aW9ucy5yZXNldEF0LFxuICAgIHNhZmV0eTogb3B0aW9ucy5zYWZldHkgPz8gMSxcbiAgICBlcnJvclN0YXR1c2VzOiBvcHRpb25zLmVycm9yU3RhdHVzZXMgPz8gWzQwMSwgNDAzLCA0MjldLFxuICAgIGFjdGl2ZVJlcXVlc3RzOiBvcHRpb25zLnJlcXVlc3RlZCA/PyAwLFxuICAgIHByb2Nlc3Npbmc6IGZhbHNlLFxuICAgIGxvZ2dlcjogb3B0aW9ucy5sb2dnZXIgPz8gbG9nZ2VyLFxuXG4gICAgd2FpdGluZzogW10sXG5cbiAgICByZXF1ZXN0c0FsbG93ZWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChidWNrZXQucmVzZXRBdCAhPT0gdW5kZWZpbmVkICYmIERhdGUubm93KCkgPj0gYnVja2V0LnJlc2V0QXQpIHtcbiAgICAgICAgYnVja2V0LmludmFsaWRSZXF1ZXN0cyA9IDBcbiAgICAgICAgYnVja2V0LnJlc2V0QXQgPSBEYXRlLm5vdygpICsgYnVja2V0LmludGVydmFsXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBidWNrZXQubWF4IC0gYnVja2V0LmludmFsaWRSZXF1ZXN0cyAtIGJ1Y2tldC5hY3RpdmVSZXF1ZXN0cyAtIGJ1Y2tldC5zYWZldHlcbiAgICB9LFxuXG4gICAgaXNSZXF1ZXN0QWxsb3dlZDogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGJ1Y2tldC5yZXF1ZXN0c0FsbG93ZWQoKSA+IDBcbiAgICB9LFxuXG4gICAgd2FpdFVudGlsUmVxdWVzdEF2YWlsYWJsZTogYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWFzeW5jLXByb21pc2UtZXhlY3V0b3JcbiAgICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSkgPT4ge1xuICAgICAgICAvLyBJZiB3aGF0ZXZlciBhbW91bnQgb2YgcmVxdWVzdHMgaXMgbGVmdCBpcyBtb3JlIHRoYW4gdGhlIHNhZmV0eSBtYXJnaW4sIGFsbG93IHRoZSByZXF1ZXN0XG4gICAgICAgIGlmIChidWNrZXQuaXNSZXF1ZXN0QWxsb3dlZCgpKSB7XG4gICAgICAgICAgYnVja2V0LmFjdGl2ZVJlcXVlc3RzICs9IDFcbiAgICAgICAgICByZXNvbHZlKClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBidWNrZXQud2FpdGluZy5wdXNoKHJlc29sdmUpXG4gICAgICAgICAgYXdhaXQgYnVja2V0LnByb2Nlc3NXYWl0aW5nKClcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgcHJvY2Vzc1dhaXRpbmc6IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIElmIGFscmVhZHkgcHJvY2Vzc2luZywgdGhhdCBsb29wIHdpbGwgaGFuZGxlIGFsbCB3YWl0aW5nIHJlcXVlc3RzLlxuICAgICAgaWYgKGJ1Y2tldC5wcm9jZXNzaW5nKSByZXR1cm5cblxuICAgICAgLy8gTWFyayBhcyBwcm9jZXNzaW5nIHNvIG90aGVyIGxvb3BzIGRvbid0IHN0YXJ0XG4gICAgICBidWNrZXQucHJvY2Vzc2luZyA9IHRydWVcblxuICAgICAgd2hpbGUgKGJ1Y2tldC53YWl0aW5nLmxlbmd0aCA+IDApIHtcbiAgICAgICAgYnVja2V0LmxvZ2dlci5pbmZvKFxuICAgICAgICAgIGBbSW52YWxpZEJ1Y2tldF0gcHJvY2Vzc2luZyB3YWl0aW5nIHF1ZXVlIHdoaWxlIGxvb3AgcmFuIHdpdGggJHtidWNrZXQud2FpdGluZy5sZW5ndGh9IHBlbmRpbmcgcmVxdWVzdHMgdG8gYmUgbWFkZS4gJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgIGJ1Y2tldCxcbiAgICAgICAgICApfWAsXG4gICAgICAgIClcblxuICAgICAgICBpZiAoIWJ1Y2tldC5pc1JlcXVlc3RBbGxvd2VkKCkgJiYgYnVja2V0LnJlc2V0QXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGJ1Y2tldC5sb2dnZXIud2FybihcbiAgICAgICAgICAgIGBbSW52YWxpZEJ1Y2tldF0gcHJvY2Vzc2luZyB3YWl0aW5nIHF1ZXVlIGlzIG5vdyBwYXVzZWQgdW50aWwgbW9yZSByZXF1ZXN0cyBhcmUgYXZhaWxhYmxlLiAke1xuICAgICAgICAgICAgICBidWNrZXQud2FpdGluZy5sZW5ndGhcbiAgICAgICAgICAgIH0gcGVuZGluZyByZXF1ZXN0cy4gJHtKU09OLnN0cmluZ2lmeShidWNrZXQpfWAsXG4gICAgICAgICAgKVxuICAgICAgICAgIGF3YWl0IGRlbGF5KGJ1Y2tldC5yZXNldEF0IC0gRGF0ZS5ub3coKSlcbiAgICAgICAgfVxuXG4gICAgICAgIGJ1Y2tldC5hY3RpdmVSZXF1ZXN0cyArPSAxXG4gICAgICAgIC8vIFJlc29sdmUgdGhlIG5leHQgaXRlbSBpbiB0aGUgcXVldWVcbiAgICAgICAgYnVja2V0LndhaXRpbmcuc2hpZnQoKT8uKClcbiAgICAgIH1cblxuICAgICAgLy8gTWFyayBhcyBmYWxzZSBzbyBuZXh0IHBlbmRpbmcgcmVxdWVzdCBjYW4gYmUgdHJpZ2dlcmVkIGJ5IG5ldyBsb29wLlxuICAgICAgYnVja2V0LnByb2Nlc3NpbmcgPSBmYWxzZVxuICAgIH0sXG5cbiAgICBoYW5kbGVDb21wbGV0ZWRSZXF1ZXN0OiBmdW5jdGlvbiAoY29kZSwgc2hhcmVkU2NvcGUpIHtcbiAgICAgIC8vIFNpbmNlIHJlcXVlc3QgaXMgY29tcGxldGUsIHdlIGNhbiByZW1vdmUgb25lIGZyb20gcmVxdWVzdGVkLlxuICAgICAgYnVja2V0LmFjdGl2ZVJlcXVlc3RzIC09IDFcbiAgICAgIC8vIFNpbmNlIGl0IGlzIGFzIGEgdmFsaWQgcmVxdWVzdCwgd2UgZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZ1xuICAgICAgaWYgKCFidWNrZXQuZXJyb3JTdGF0dXNlcy5pbmNsdWRlcyhjb2RlKSkgcmV0dXJuXG4gICAgICAvLyBTaGFyZWQgc2NvcGUgaXMgbm90IGNvbnNpZGVyZWQgaW52YWxpZFxuICAgICAgaWYgKGNvZGUgPT09IDQyOSAmJiBzaGFyZWRTY29wZSkgcmV0dXJuXG5cbiAgICAgIC8vIElOVkFMSUQgUkVRVUVTVCBXQVMgTUFERVxuICAgICAgaWYgKGJ1Y2tldC5yZXNldEF0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYnVja2V0LnJlc2V0QXQgPSBEYXRlLm5vdygpICsgYnVja2V0LmludGVydmFsXG4gICAgICB9XG5cbiAgICAgIGJ1Y2tldC5pbnZhbGlkUmVxdWVzdHMgKz0gMVxuICAgICAgYnVja2V0LmxvZ2dlci53YXJuKGBbSW52YWxpZEJ1Y2tldF0gYW4gaW52YWxpZCByZXF1ZXN0IHdhcyBtYWRlLiBJbmNyZWFzaW5nIGludmFsaWRSZXF1ZXN0cyBjb3VudCB0byAke2J1Y2tldC5pbnZhbGlkUmVxdWVzdHN9YClcbiAgICB9LFxuICB9XG5cbiAgcmV0dXJuIGJ1Y2tldFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEludmFsaWRSZXF1ZXN0QnVja2V0T3B0aW9ucyB7XG4gIC8qKiBjdXJyZW50IGludmFsaWQgYW1vdW50ICovXG4gIGN1cnJlbnQ/OiBudW1iZXJcbiAgLyoqIG1heCBpbnZhbGlkIHJlcXVlc3RzIGFsbG93ZWQgdW50aWwgYmFuLiBEZWZhdWx0cyB0byAxMCwwMDAgKi9cbiAgbWF4PzogbnVtYmVyXG4gIC8qKiBUaGUgdGltZSB0aGF0IGRpc2NvcmQgYWxsb3dzIHRvIG1ha2UgdGhlIG1heCBudW1iZXIgb2YgaW52YWxpZCByZXF1ZXN0cy4gRGVmYXVsdHMgdG8gMTAgbWludXRlcyAqL1xuICBpbnRlcnZhbD86IG51bWJlclxuICAvKiogV2hlbiB0aGUgdGltZW91dCBmb3IgdGhlIGJ1Y2tldCBoYXMgc3RhcnRlZCBhdC4gKi9cbiAgcmVzZXRBdD86IG51bWJlclxuICAvKiogaG93IHNhZmUgdG8gYmUgZnJvbSBtYXguIERlZmF1bHRzIHRvIDEgKi9cbiAgc2FmZXR5PzogbnVtYmVyXG4gIC8qKiBUaGUgcmVxdWVzdCBzdGF0dXNlcyB0aGF0IGNvdW50IGFzIGFuIGludmFsaWQgcmVxdWVzdC4gKi9cbiAgZXJyb3JTdGF0dXNlcz86IG51bWJlcltdXG4gIC8qKiBUaGUgYW1vdW50IG9mIHJlcXVlc3RzIHRoYXQgd2VyZSByZXF1ZXN0ZWQgZnJvbSB0aGlzIGJ1Y2tldC4gKi9cbiAgcmVxdWVzdGVkPzogbnVtYmVyXG4gIC8qKiBUaGUgbG9nZ2VyIHRoYXQgd2lsbCBiZSB1c2VkIGZvciB0aGUgYnVja2V0ICovXG4gIGxvZ2dlcj86IFBpY2s8dHlwZW9mIGxvZ2dlciwgJ2RlYnVnJyB8ICdpbmZvJyB8ICd3YXJuJyB8ICdlcnJvcicgfCAnZmF0YWwnPlxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEludmFsaWRSZXF1ZXN0QnVja2V0IHtcbiAgLyoqIGN1cnJlbnQgaW52YWxpZCBhbW91bnQgKi9cbiAgaW52YWxpZFJlcXVlc3RzOiBudW1iZXJcbiAgLyoqIG1heCBpbnZhbGlkIHJlcXVlc3RzIGFsbG93ZWQgdW50aWwgYmFuLiBEZWZhdWx0cyB0byAxMCwwMDAgKi9cbiAgbWF4OiBudW1iZXJcbiAgLyoqIFRoZSB0aW1lIHRoYXQgZGlzY29yZCBhbGxvd3MgdG8gbWFrZSB0aGUgbWF4IG51bWJlciBvZiBpbnZhbGlkIHJlcXVlc3RzLiBEZWZhdWx0cyB0byAxMCBtaW51dGVzICovXG4gIGludGVydmFsOiBudW1iZXJcbiAgLyoqIFdoZW4gdGhlIHRpbWVvdXQgZm9yIHRoaXMgYnVja2V0IGhhcyBzdGFydGVkIGF0LiAqL1xuICByZXNldEF0OiBudW1iZXIgfCB1bmRlZmluZWRcbiAgLyoqIGhvdyBzYWZlIHRvIGJlIGZyb20gbWF4LiBEZWZhdWx0cyB0byAxICovXG4gIHNhZmV0eTogbnVtYmVyXG4gIC8qKiBUaGUgcmVxdWVzdCBzdGF0dXNlcyB0aGF0IGNvdW50IGFzIGFuIGludmFsaWQgcmVxdWVzdC4gKi9cbiAgZXJyb3JTdGF0dXNlczogbnVtYmVyW11cbiAgLyoqIFRoZSBhbW91bnQgb2YgcmVxdWVzdHMgdGhhdCB3ZXJlIHJlcXVlc3RlZCBmcm9tIHRoaXMgYnVja2V0LiAqL1xuICBhY3RpdmVSZXF1ZXN0czogbnVtYmVyXG4gIC8qKiBUaGUgcmVxdWVzdHMgdGhhdCBhcmUgY3VycmVudGx5IHBlbmRpbmcuICovXG4gIHdhaXRpbmc6IEFycmF5PCh2YWx1ZTogdm9pZCB8IFByb21pc2VMaWtlPHZvaWQ+KSA9PiB2b2lkPlxuICAvKiogV2hldGhlciBvciBub3QgdGhlIHdhaXRpbmcgcXVldWUgaXMgYWxyZWFkeSBwcm9jZXNzaW5nLiAqL1xuICBwcm9jZXNzaW5nOiBib29sZWFuXG4gIC8qKiBUaGUgbG9nZ2VyIHRoYXQgd2lsbCBiZSB1c2VkIGZvciB0aGUgYnVja2V0ICovXG4gIGxvZ2dlcjogUGljazx0eXBlb2YgbG9nZ2VyLCAnZGVidWcnIHwgJ2luZm8nIHwgJ3dhcm4nIHwgJ2Vycm9yJyB8ICdmYXRhbCc+XG5cbiAgLyoqIEdpdmVzIHRoZSBudW1iZXIgb2YgcmVxdWVzdHMgdGhhdCBhcmUgY3VycmVudGx5IGFsbG93ZWQuICovXG4gIHJlcXVlc3RzQWxsb3dlZDogKCkgPT4gbnVtYmVyXG4gIC8qKiBDaGVja3MgaWYgYSByZXF1ZXN0IGlzIGFsbG93ZWQgYXQgdGhpcyB0aW1lLiAqL1xuICBpc1JlcXVlc3RBbGxvd2VkOiAoKSA9PiBib29sZWFuXG4gIC8qKiBXYWl0cyB1bnRpbCBhIHJlcXVlc3QgaXMgYXZhaWxhYmxlICovXG4gIHdhaXRVbnRpbFJlcXVlc3RBdmFpbGFibGU6ICgpID0+IFByb21pc2U8dm9pZD5cbiAgLyoqIEJlZ2lucyBwcm9jZXNzaW5nIHRoZSB3YWl0aW5nIHF1ZXVlIG9mIHJlcXVlc3RzLiAqL1xuICBwcm9jZXNzV2FpdGluZzogKCkgPT4gUHJvbWlzZTx2b2lkPlxuICAvKiogSGFuZGxlciBmb3Igd2hlbmV2ZXIgYSByZXF1ZXN0IGlzIHZhbGlkYXRlZC4gVGhpcyBzaG91bGQgdXBkYXRlIHRoZSByZXF1ZXN0ZWQgdmFsdWVzIG9yIHRyaWdnZXIgYW55IG90aGVyIG5lY2Vzc2FyeSBzdHVmZi4gKi9cbiAgaGFuZGxlQ29tcGxldGVkUmVxdWVzdDogKGNvZGU6IG51bWJlciwgc2hhcmVkU2NvcGU6IGJvb2xlYW4pID0+IHZvaWRcbn1cbiJdLCJuYW1lcyI6WyJkZWxheSIsImxvZ2dlciIsImNyZWF0ZUludmFsaWRSZXF1ZXN0QnVja2V0Iiwib3B0aW9ucyIsImJ1Y2tldCIsImludmFsaWRSZXF1ZXN0cyIsImN1cnJlbnQiLCJtYXgiLCJpbnRlcnZhbCIsInJlc2V0QXQiLCJzYWZldHkiLCJlcnJvclN0YXR1c2VzIiwiYWN0aXZlUmVxdWVzdHMiLCJyZXF1ZXN0ZWQiLCJwcm9jZXNzaW5nIiwid2FpdGluZyIsInJlcXVlc3RzQWxsb3dlZCIsInVuZGVmaW5lZCIsIkRhdGUiLCJub3ciLCJpc1JlcXVlc3RBbGxvd2VkIiwid2FpdFVudGlsUmVxdWVzdEF2YWlsYWJsZSIsIlByb21pc2UiLCJyZXNvbHZlIiwicHVzaCIsInByb2Nlc3NXYWl0aW5nIiwibGVuZ3RoIiwiaW5mbyIsIkpTT04iLCJzdHJpbmdpZnkiLCJ3YXJuIiwic2hpZnQiLCJoYW5kbGVDb21wbGV0ZWRSZXF1ZXN0IiwiY29kZSIsInNoYXJlZFNjb3BlIiwiaW5jbHVkZXMiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLEtBQUssRUFBRUMsTUFBTSxRQUFRLG9CQUFtQjtBQUVqRDs7Ozs7O0NBTUMsR0FDRCxPQUFPLFNBQVNDLDJCQUEyQkMsT0FBb0M7SUFDN0UsTUFBTUMsU0FBK0I7UUFDbkNDLGlCQUFpQkYsUUFBUUcsT0FBTyxJQUFJO1FBQ3BDQyxLQUFLSixRQUFRSSxHQUFHLElBQUk7UUFDcEJDLFVBQVVMLFFBQVFLLFFBQVEsSUFBSTtRQUM5QkMsU0FBU04sUUFBUU0sT0FBTztRQUN4QkMsUUFBUVAsUUFBUU8sTUFBTSxJQUFJO1FBQzFCQyxlQUFlUixRQUFRUSxhQUFhLElBQUk7WUFBQztZQUFLO1lBQUs7U0FBSTtRQUN2REMsZ0JBQWdCVCxRQUFRVSxTQUFTLElBQUk7UUFDckNDLFlBQVk7UUFDWmIsUUFBUUUsUUFBUUYsTUFBTSxJQUFJQTtRQUUxQmMsU0FBUyxFQUFFO1FBRVhDLGlCQUFpQjtZQUNmLElBQUlaLE9BQU9LLE9BQU8sS0FBS1EsYUFBYUMsS0FBS0MsR0FBRyxNQUFNZixPQUFPSyxPQUFPLEVBQUU7Z0JBQ2hFTCxPQUFPQyxlQUFlLEdBQUc7Z0JBQ3pCRCxPQUFPSyxPQUFPLEdBQUdTLEtBQUtDLEdBQUcsS0FBS2YsT0FBT0ksUUFBUTtZQUMvQztZQUVBLE9BQU9KLE9BQU9HLEdBQUcsR0FBR0gsT0FBT0MsZUFBZSxHQUFHRCxPQUFPUSxjQUFjLEdBQUdSLE9BQU9NLE1BQU07UUFDcEY7UUFFQVUsa0JBQWtCO1lBQ2hCLE9BQU9oQixPQUFPWSxlQUFlLEtBQUs7UUFDcEM7UUFFQUssMkJBQTJCO1lBQ3pCLHFEQUFxRDtZQUNyRCxPQUFPLE1BQU0sSUFBSUMsUUFBUSxPQUFPQztnQkFDOUIsMkZBQTJGO2dCQUMzRixJQUFJbkIsT0FBT2dCLGdCQUFnQixJQUFJO29CQUM3QmhCLE9BQU9RLGNBQWMsSUFBSTtvQkFDekJXO2dCQUNGLE9BQU87b0JBQ0xuQixPQUFPVyxPQUFPLENBQUNTLElBQUksQ0FBQ0Q7b0JBQ3BCLE1BQU1uQixPQUFPcUIsY0FBYztnQkFDN0I7WUFDRjtRQUNGO1FBRUFBLGdCQUFnQjtZQUNkLHFFQUFxRTtZQUNyRSxJQUFJckIsT0FBT1UsVUFBVSxFQUFFO1lBRXZCLGdEQUFnRDtZQUNoRFYsT0FBT1UsVUFBVSxHQUFHO1lBRXBCLE1BQU9WLE9BQU9XLE9BQU8sQ0FBQ1csTUFBTSxHQUFHLEVBQUc7Z0JBQ2hDdEIsT0FBT0gsTUFBTSxDQUFDMEIsSUFBSSxDQUNoQixDQUFDLDZEQUE2RCxFQUFFdkIsT0FBT1csT0FBTyxDQUFDVyxNQUFNLENBQUMsOEJBQThCLEVBQUVFLEtBQUtDLFNBQVMsQ0FDbEl6QixRQUNBLENBQUM7Z0JBR0wsSUFBSSxDQUFDQSxPQUFPZ0IsZ0JBQWdCLE1BQU1oQixPQUFPSyxPQUFPLEtBQUtRLFdBQVc7b0JBQzlEYixPQUFPSCxNQUFNLENBQUM2QixJQUFJLENBQ2hCLENBQUMsMEZBQTBGLEVBQ3pGMUIsT0FBT1csT0FBTyxDQUFDVyxNQUFNLENBQ3RCLG1CQUFtQixFQUFFRSxLQUFLQyxTQUFTLENBQUN6QixRQUFRLENBQUM7b0JBRWhELE1BQU1KLE1BQU1JLE9BQU9LLE9BQU8sR0FBR1MsS0FBS0MsR0FBRztnQkFDdkM7Z0JBRUFmLE9BQU9RLGNBQWMsSUFBSTtnQkFDekIscUNBQXFDO2dCQUNyQ1IsT0FBT1csT0FBTyxDQUFDZ0IsS0FBSztZQUN0QjtZQUVBLHNFQUFzRTtZQUN0RTNCLE9BQU9VLFVBQVUsR0FBRztRQUN0QjtRQUVBa0Isd0JBQXdCLFNBQVVDLElBQUksRUFBRUMsV0FBVztZQUNqRCwrREFBK0Q7WUFDL0Q5QixPQUFPUSxjQUFjLElBQUk7WUFDekIsK0RBQStEO1lBQy9ELElBQUksQ0FBQ1IsT0FBT08sYUFBYSxDQUFDd0IsUUFBUSxDQUFDRixPQUFPO1lBQzFDLHlDQUF5QztZQUN6QyxJQUFJQSxTQUFTLE9BQU9DLGFBQWE7WUFFakMsMkJBQTJCO1lBQzNCLElBQUk5QixPQUFPSyxPQUFPLEtBQUtRLFdBQVc7Z0JBQ2hDYixPQUFPSyxPQUFPLEdBQUdTLEtBQUtDLEdBQUcsS0FBS2YsT0FBT0ksUUFBUTtZQUMvQztZQUVBSixPQUFPQyxlQUFlLElBQUk7WUFDMUJELE9BQU9ILE1BQU0sQ0FBQzZCLElBQUksQ0FBQyxDQUFDLGlGQUFpRixFQUFFMUIsT0FBT0MsZUFBZSxDQUFDLENBQUM7UUFDakk7SUFDRjtJQUVBLE9BQU9EO0FBQ1QifQ==