paste.gg 1.0.1 → 1.0.5

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.
package/LICENSE CHANGED
@@ -1,21 +1,21 @@
1
- MIT License
2
-
3
- Copyright (c) 2020 Seren_Modz 21
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
1
+ MIT License
2
+
3
+ Copyright (c) 2021 Seren_Modz 21
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
21
  SOFTWARE.
package/README.md CHANGED
@@ -1,84 +1,105 @@
1
- # paste.gg
2
- A wrapper for the paste.gg api. I have created this in a short amount of time and will expect more updates in the future. The main purpose of this is to help users from having to create API calls. <br/>
3
-
4
- **[Documentation](https://github.com/ascclemens/paste/blob/master/api.md#api)** <br/>
5
- **[GitHub](https://github.com/SerenModz21/paste.gg)** <br/>
6
-
7
- > Install with npm
8
- ```
9
- npm install paste.gg
10
- ```
11
- <br/>
12
-
13
- > Install with yarn
14
- ```
15
- yarn add paste.gg
16
- ```
17
- <br/>
18
-
19
- > Get started with paste.gg
20
- ```ts
21
- import PasteGG from "paste.gg"
22
-
23
- // If you want to be anonymous
24
- const pasteGG = new PasteGG()
25
-
26
- // If you want to use an api key
27
- const pasteGG = new PasteGG("apiKeyHere")
28
- ```
29
- <br/>
30
-
31
- > Get information about a post
32
- ```ts
33
- await pasteGG.get("idHere")
34
-
35
- // If you would like to include file contents
36
- await pasteGG.get("idHere", true)
37
- ```
38
- <br/>
39
-
40
- > Post a new paste ([Click here for more options](https://github.com/ascclemens/paste/blob/master/api.md#post-pastes))
41
- ```ts
42
- await pasteGG.post({
43
- name: "Paste name", // Optional
44
- description: "Paste description", // Optional
45
- expires: "2020-12-21T02:25:56.428Z", // Optional
46
- files: [{
47
- name: "file.txt", // Optional
48
- content: {
49
- format: "text",
50
- value: "This is where the file content wil lgo"
51
- }
52
- }]
53
- })
54
- ```
55
- <br/>
56
-
57
- > Delete a paste (auth/deletion key needed)
58
- ```ts
59
- // Delete with deletion key
60
- await pasteGG.delete("idHere", "deletionKeyHere")
61
-
62
- // Delete with auth key if not set in constructor
63
- await pasteGG.delete("idHere", "authKeyHere")
64
-
65
- // If you have set your auth key in the class constructor, you can type "auth" for the key
66
- await pasteGG.delete("idHere", "auth")
67
- ```
68
- <br/>
69
-
70
- > Update the post
71
- ```ts
72
- await pasteGG.update("idHere", {
73
- name: "new name", // Optional (if you want to remove the name)
74
- description: "new description"
75
- })
76
- ```
77
- <br/>
78
-
79
- ---
80
- <br/>
81
-
82
- Contributions are more than welcome. If you would like to add to this API, you can open a pull request as I haven't added everything on the API, only the things that will get used more often.
83
-
84
- Copyright © SerenModz21 2018 - 2020
1
+ <div align="center">
2
+ <h1>paste.gg</h1>
3
+ <a href="https://www.npmjs.com/package/paste.gg"><img src="https://img.shields.io/npm/v/paste.gg.svg?maxAge=3600" alt="NPM version" /></a>
4
+ <a href="https://www.npmjs.com/package/paste.gg"><img src="https://img.shields.io/npm/dt/paste.gg.svg?maxAge=3600" alt="NPM downloads" /></a>
5
+ <a href="https://github.com/SerenModz21/paste.gg/actions"><img src="https://github.com/SerenModz21/paste.gg/actions/workflows/codeql-analysis.yml/badge.svg" alt="Build status" /></a>
6
+ <a href="https://github.com/SerenModz21/paste.gg"><img src="https://img.shields.io/github/languages/code-size/SerenModz21/paste.gg" alt="GitHub code size"></a>
7
+ <br />
8
+ <p style="max-width: 600px">
9
+ A library for interacting with the Paste.GG API. I have created this in a short amount of time and will expect more updates in the future. The main purpose of this is to help users from having to create API calls.
10
+ </p>
11
+ </div>
12
+
13
+
14
+ ### Links
15
+
16
+ • **[API Documentation](https://github.com/ascclemens/paste/blob/master/api.md#api)** <br/>
17
+ • **[GitHub](https://github.com/SerenModz21/paste.gg)** <br/>
18
+ • **[NPM](https://www.npmjs.com/package/paste.gg)** <br/>
19
+
20
+
21
+ ### Usages
22
+
23
+ #### Install the stable version
24
+ ```
25
+ npm install paste.gg
26
+
27
+ yarn add paste.gg
28
+ ```
29
+
30
+ #### Install the beta version (git is required)
31
+ ```
32
+ npm install SerenModz21/paste.gg#beta
33
+
34
+ yarn add SerenModz21/paste.gg#beta
35
+ ```
36
+ <br/>
37
+
38
+ #### Get started with paste.gg
39
+ ```ts
40
+ const PasteGG = require("paste.gg");
41
+ // or
42
+ import PasteGG from "paste.gg";
43
+
44
+ // If you want to be anonymous
45
+ const pasteGG = new PasteGG()
46
+
47
+ // If you want to use an api key
48
+ const pasteGG = new PasteGG("apiKeyHere")
49
+ ```
50
+ <br/>
51
+
52
+ #### Get information about a post
53
+ ```ts
54
+ // if you would like to exclude file contents
55
+ await pasteGG.get("idHere")
56
+
57
+ // If you would like to include file contents
58
+ await pasteGG.get("idHere", true)
59
+ ```
60
+ <br/>
61
+
62
+ #### Post a new paste ([Click here for more options](https://github.com/ascclemens/paste/blob/master/api.md#post-pastes))
63
+ ```ts
64
+ await pasteGG.post({
65
+ name: "Paste name", // Optional
66
+ description: "Paste description", // Optional
67
+ expires: "2020-12-21T02:25:56.428Z", // Optional (must be a UTC ISO 8601 string)
68
+ files: [{
69
+ name: "file.txt", // Optional
70
+ content: {
71
+ format: "text",
72
+ value: "This is where the file content will go"
73
+ }
74
+ }]
75
+ })
76
+ ```
77
+ <br/>
78
+
79
+ #### Delete a paste (auth/deletion key needed)
80
+ ```ts
81
+ // Delete with deletion key
82
+ await pasteGG.delete("idHere", "deletionKeyHere")
83
+
84
+ // Delete with auth key if not set in constructor
85
+ await pasteGG.delete("idHere", "authKeyHere")
86
+
87
+ // Leave blank if auth key is in the class constructor
88
+ await pasteGG.delete("idHere")
89
+ ```
90
+ <br/>
91
+
92
+ #### Update the post
93
+ ```ts
94
+ await pasteGG.update("idHere", {
95
+ name: "new name", // Optional (if you want to remove the name)
96
+ description: "new description"
97
+ })
98
+ ```
99
+ <br />
100
+
101
+ ---
102
+
103
+ Contributions are more than welcome. If you would like to add to this API, you can open a pull request as I haven't added everything on the API, only the things that will get used more often.
104
+
105
+ Copyright © SerenModz21 2018 - 2021
package/dist/index.js CHANGED
@@ -1,79 +1,276 @@
1
- "use strict";
2
- var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, privateMap, value) {
3
- if (!privateMap.has(receiver)) {
4
- throw new TypeError("attempted to set private field on non-instance");
5
- }
6
- privateMap.set(receiver, value);
7
- return value;
8
- };
9
- var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, privateMap) {
10
- if (!privateMap.has(receiver)) {
11
- throw new TypeError("attempted to get private field on non-instance");
12
- }
13
- return privateMap.get(receiver);
14
- };
15
- var __importDefault = (this && this.__importDefault) || function (mod) {
16
- return (mod && mod.__esModule) ? mod : { "default": mod };
17
- };
18
- var _auth, _url;
19
- Object.defineProperty(exports, "__esModule", { value: true });
20
- exports.PasteGG = void 0;
21
- const node_fetch_1 = __importDefault(require("node-fetch"));
22
- class PasteGG {
23
- constructor(auth, options = {
24
- baseUrl: "https://api.paste.gg",
25
- version: 1
26
- }) {
27
- _auth.set(this, void 0);
28
- _url.set(this, void 0);
29
- __classPrivateFieldSet(this, _auth, auth);
30
- this.options = options;
31
- __classPrivateFieldSet(this, _url, `${this.options.baseUrl}/v${this.options.version}`);
32
- }
33
- headers(auth, content) {
34
- const headers = {};
35
- if (__classPrivateFieldGet(this, _auth))
36
- headers.Authorization = `Key ${__classPrivateFieldGet(this, _auth)}`;
37
- if (auth?.length)
38
- headers.Authorization = `Key ${auth}`;
39
- if (content)
40
- headers["Content-Type"] = "application/json";
41
- return headers;
42
- }
43
- async get(id, full = false) {
44
- const res = await node_fetch_1.default(`${__classPrivateFieldGet(this, _url)}/pastes/${id}?full=${full}`, {
45
- method: "GET",
46
- headers: this.headers()
47
- });
48
- return res.json();
49
- }
50
- async post(input) {
51
- const res = await node_fetch_1.default(`${__classPrivateFieldGet(this, _url)}/pastes`, {
52
- method: "POST",
53
- headers: this.headers(null, true),
54
- body: JSON.stringify(input)
55
- });
56
- return res.json();
57
- }
58
- async delete(id, key) {
59
- const res = await node_fetch_1.default(`${__classPrivateFieldGet(this, _url)}/pastes/${id}`, {
60
- method: "DELETE",
61
- headers: this.headers(key?.toLowerCase() !== "auth" ? key : null)
62
- });
63
- return res.json();
64
- }
65
- async update(id, options) {
66
- if (!__classPrivateFieldGet(this, _auth))
67
- throw new Error("An auth key is required for this endpoint!");
68
- const res = await node_fetch_1.default(`${__classPrivateFieldGet(this, _url)}/pastes/${id}`, {
69
- method: "PATCH",
70
- headers: this.headers(null, true),
71
- body: JSON.stringify(options)
72
- });
73
- return res.json();
74
- }
75
- }
76
- exports.PasteGG = PasteGG;
77
- _auth = new WeakMap(), _url = new WeakMap();
78
- exports.default = PasteGG;
79
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFNQSw0REFBOEI7QUFHOUIsTUFBTSxPQUFPO0lBV1gsWUFBWSxJQUFhLEVBQUUsVUFBMEI7UUFDbkQsT0FBTyxFQUFFLHNCQUFzQjtRQUMvQixPQUFPLEVBQUUsQ0FBQztLQUNYO1FBYkQsd0JBQXVCO1FBQ3ZCLHVCQUFzQjtRQWFwQix1QkFBQSxJQUFJLFNBQVMsSUFBSSxFQUFDO1FBQ2xCLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLHVCQUFBLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxLQUFLLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUM7SUFDakUsQ0FBQztJQUVPLE9BQU8sQ0FBQyxJQUFhLEVBQUUsT0FBaUI7UUFDOUMsTUFBTSxPQUFPLEdBQVksRUFBRSxDQUFBO1FBRTNCO1lBQWdCLE9BQU8sQ0FBQyxhQUFhLEdBQUcsT0FBTyxtQ0FBVSxFQUFFLENBQUE7UUFDM0QsSUFBSSxJQUFJLEVBQUUsTUFBTTtZQUFFLE9BQU8sQ0FBQyxhQUFhLEdBQUcsT0FBTyxJQUFJLEVBQUUsQ0FBQTtRQUN2RCxJQUFJLE9BQU87WUFBRSxPQUFPLENBQUMsY0FBYyxDQUFDLEdBQUcsa0JBQWtCLENBQUE7UUFFekQsT0FBTyxPQUFPLENBQUE7SUFDaEIsQ0FBQztJQVFNLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBVSxFQUFFLE9BQWdCLEtBQUs7UUFDaEQsTUFBTSxHQUFHLEdBQUcsTUFBTSxvQkFBSyxDQUFDLEdBQUcsa0NBQVMsV0FBVyxFQUFFLFNBQVMsSUFBSSxFQUFFLEVBQUU7WUFDaEUsTUFBTSxFQUFFLEtBQUs7WUFDYixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRTtTQUN4QixDQUFDLENBQUE7UUFFRixPQUFPLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtJQUNuQixDQUFDO0lBT00sS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFnQjtRQUNoQyxNQUFNLEdBQUcsR0FBRyxNQUFNLG9CQUFLLENBQUMsR0FBRyxrQ0FBUyxTQUFTLEVBQUU7WUFDN0MsTUFBTSxFQUFFLE1BQU07WUFDZCxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDO1lBQ2pDLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQztTQUM1QixDQUFDLENBQUM7UUFFSCxPQUFPLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtJQUNuQixDQUFDO0lBUU0sS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFVLEVBQUUsR0FBVztRQUN6QyxNQUFNLEdBQUcsR0FBRyxNQUFNLG9CQUFLLENBQUMsR0FBRyxrQ0FBUyxXQUFXLEVBQUUsRUFBRSxFQUFFO1lBQ25ELE1BQU0sRUFBRSxRQUFRO1lBQ2hCLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxXQUFXLEVBQUUsS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1NBQ2xFLENBQUMsQ0FBQTtRQUVGLE9BQU8sR0FBRyxDQUFDLElBQUksRUFBRSxDQUFBO0lBQ25CLENBQUM7SUFRTSxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQVUsRUFBRSxPQUFtQjtRQUNqRCxJQUFJLG9DQUFXO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO1FBRS9FLE1BQU0sR0FBRyxHQUFHLE1BQU0sb0JBQUssQ0FBQyxHQUFHLGtDQUFTLFdBQVcsRUFBRSxFQUFFLEVBQUU7WUFDbkQsTUFBTSxFQUFFLE9BQU87WUFDZixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDO1lBQ2pDLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQztTQUM5QixDQUFDLENBQUE7UUFFRixPQUFPLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtJQUNuQixDQUFDO0NBQ0Y7QUFHUSwwQkFBTzs7QUFEaEIsa0JBQWUsT0FBTyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcclxuICogQ29weXJpZ2h0IMKpIFNlcmVuTW9kejIxIDIwMTggLSAyMDIwIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXHJcbiAqIFVuYXV0aG9yaXplZCBkaXN0cmlidXRpb24gb2YgYW55IGNvZGUgd2l0aGluIHRoaXMgcHJvamVjdCBtYXkgcmVzdWx0IGluIGNvbnNlcXVlbmNlcyBjaG9zZW4gYnkgdGhlIEJvYXJkIE1lbWJlcnMuXHJcbiAqIFJlZmVyIHRvIHRoZSBSRUFETUUgZm9yIG1vcmUgaW5mb3JtYXRpb24uXHJcbiAqL1xyXG5cclxuaW1wb3J0IGZldGNoIGZyb20gXCJub2RlLWZldGNoXCJcclxuaW1wb3J0IHsgUGFzdGVHR09wdGlvbnMsIFBhc3RlT3V0cHV0LCBQb3N0UGFzdGUsIElIZWFkZXIsIFVwZGF0ZVBvc3QgfSBmcm9tIFwiLi9pbnRlcmZhY2VzXCJcclxuXHJcbmNsYXNzIFBhc3RlR0cge1xyXG4gIHJlYWRvbmx5ICNhdXRoOiBzdHJpbmc7XHJcbiAgcmVhZG9ubHkgI3VybDogc3RyaW5nO1xyXG4gIHJlYWRvbmx5IG9wdGlvbnM6IFBhc3RlR0dPcHRpb25zO1xyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgUGFzdGVHR1xyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdXRoIE9wdGlvbmFsIGF1dGgga2V5XHJcbiAgICogQHBhcmFtIHtQYXN0ZUdHT3B0aW9uc30gb3B0aW9ucyBPcHRpb25zIGZvciB0aGUgcGFzdGUgc2VydmVyXHJcbiAgICogQGNsYXNzIHtQYXN0ZUdHfVxyXG4gICAqL1xyXG4gIGNvbnN0cnVjdG9yKGF1dGg/OiBzdHJpbmcsIG9wdGlvbnM6IFBhc3RlR0dPcHRpb25zID0ge1xyXG4gICAgYmFzZVVybDogXCJodHRwczovL2FwaS5wYXN0ZS5nZ1wiLFxyXG4gICAgdmVyc2lvbjogMVxyXG4gIH0pIHtcclxuICAgIHRoaXMuI2F1dGggPSBhdXRoO1xyXG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcclxuICAgIHRoaXMuI3VybCA9IGAke3RoaXMub3B0aW9ucy5iYXNlVXJsfS92JHt0aGlzLm9wdGlvbnMudmVyc2lvbn1gO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBoZWFkZXJzKGF1dGg/OiBzdHJpbmcsIGNvbnRlbnQ/OiBib29sZWFuKTogSUhlYWRlciB7XHJcbiAgICBjb25zdCBoZWFkZXJzOiBJSGVhZGVyID0ge31cclxuXHJcbiAgICBpZiAodGhpcy4jYXV0aCkgaGVhZGVycy5BdXRob3JpemF0aW9uID0gYEtleSAke3RoaXMuI2F1dGh9YFxyXG4gICAgaWYgKGF1dGg/Lmxlbmd0aCkgaGVhZGVycy5BdXRob3JpemF0aW9uID0gYEtleSAke2F1dGh9YFxyXG4gICAgaWYgKGNvbnRlbnQpIGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBcImFwcGxpY2F0aW9uL2pzb25cIlxyXG5cclxuICAgIHJldHVybiBoZWFkZXJzXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgYW4gZXhpc3RpbmcgcGFzdGUuXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGlkIFRoZSBJRCBvZiB0aGUgcGFzdGUuXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBmdWxsIEluY2x1ZGVzIHRoZSBjb250ZW50cyBvZiBmaWxlcyBpZiB0cnVlLlxyXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFBhc3RlT3V0cHV0Pn1cclxuICAgKi9cclxuICBwdWJsaWMgYXN5bmMgZ2V0KGlkOiBzdHJpbmcsIGZ1bGw6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8UGFzdGVPdXRwdXQ+IHtcclxuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGAke3RoaXMuI3VybH0vcGFzdGVzLyR7aWR9P2Z1bGw9JHtmdWxsfWAsIHtcclxuICAgICAgbWV0aG9kOiBcIkdFVFwiLFxyXG4gICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlcnMoKVxyXG4gICAgfSlcclxuXHJcbiAgICByZXR1cm4gcmVzLmpzb24oKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlIGEgbmV3IHBhc3RlLlxyXG4gICAqIEBwYXJhbSB7UG9zdFBhc3RlfSBpbnB1dCBUaGUgaW5mb3JtYXRpb24gdG8gY3JlYXRlIHRoZSBwYXN0ZSB3aXRoLlxyXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFBhc3RlT3V0cHV0Pn1cclxuICAgKi9cclxuICBwdWJsaWMgYXN5bmMgcG9zdChpbnB1dDogUG9zdFBhc3RlKTogUHJvbWlzZTxQYXN0ZU91dHB1dD4ge1xyXG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goYCR7dGhpcy4jdXJsfS9wYXN0ZXNgLCB7XHJcbiAgICAgIG1ldGhvZDogXCJQT1NUXCIsXHJcbiAgICAgIGhlYWRlcnM6IHRoaXMuaGVhZGVycyhudWxsLCB0cnVlKSxcclxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoaW5wdXQpXHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gcmVzLmpzb24oKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGVsZXRlcyBhbiBleGlzdGluZyBwYXN0ZS5cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgVGhlIElEIG9mIHRoZSBwYXN0ZSB0byBkZWxldGUuXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBBdXRoIGtleSBvciBkZWxldGlvbiBrZXksIGVudGVyIFwiYXV0aFwiIGZvciBhdXRoIGtleVxyXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQgfCBQYXN0ZU91dHB1dD59XHJcbiAgICovXHJcbiAgcHVibGljIGFzeW5jIGRlbGV0ZShpZDogc3RyaW5nLCBrZXk6IHN0cmluZyk6IFByb21pc2U8dm9pZCB8IFBhc3RlT3V0cHV0PiB7XHJcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChgJHt0aGlzLiN1cmx9L3Bhc3Rlcy8ke2lkfWAsIHtcclxuICAgICAgbWV0aG9kOiBcIkRFTEVURVwiLFxyXG4gICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlcnMoa2V5Py50b0xvd2VyQ2FzZSgpICE9PSBcImF1dGhcIiA/IGtleSA6IG51bGwpXHJcbiAgICB9KVxyXG5cclxuICAgIHJldHVybiByZXMuanNvbigpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVcGRhdGUgYW4gZXhpc3RpbmcgcGFzdGUuXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGlkIFRoZSBJRCBmb3IgdGhlIHBhc3RlIHRvIHVwZGF0ZS5cclxuICAgKiBAcGFyYW0ge1VwZGF0ZVBvc3R9IG9wdGlvbnMgVGhlIG9wdGlvbnMgeW91IHdpc2ggdG8gdXBkYXRlLlxyXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQgfCBQYXN0ZU91dHB1dD59XHJcbiAgICovXHJcbiAgcHVibGljIGFzeW5jIHVwZGF0ZShpZDogc3RyaW5nLCBvcHRpb25zOiBVcGRhdGVQb3N0KTogUHJvbWlzZTx2b2lkIHwgUGFzdGVPdXRwdXQ+IHtcclxuICAgIGlmICghdGhpcy4jYXV0aCkgdGhyb3cgbmV3IEVycm9yKFwiQW4gYXV0aCBrZXkgaXMgcmVxdWlyZWQgZm9yIHRoaXMgZW5kcG9pbnQhXCIpO1xyXG5cclxuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGAke3RoaXMuI3VybH0vcGFzdGVzLyR7aWR9YCwge1xyXG4gICAgICBtZXRob2Q6IFwiUEFUQ0hcIixcclxuICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXJzKG51bGwsIHRydWUpLFxyXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShvcHRpb25zKVxyXG4gICAgfSlcclxuXHJcbiAgICByZXR1cm4gcmVzLmpzb24oKVxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgUGFzdGVHRztcclxuZXhwb3J0IHsgUGFzdGVHRyB9Il19
1
+ "use strict";
2
+ /*
3
+ * Copyright © SerenModz21 2018 - 2021 All Rights Reserved.
4
+ * Unauthorized distribution of any code within this project may result in consequences.
5
+ * Refer to the README for more information.
6
+ */
7
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
8
+ if (kind === "m") throw new TypeError("Private method is not writable");
9
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
10
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
11
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
12
+ };
13
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
14
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
15
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
16
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
17
+ };
18
+ var __importDefault = (this && this.__importDefault) || function (mod) {
19
+ return (mod && mod.__esModule) ? mod : { "default": mod };
20
+ };
21
+ var _PasteGG_auth, _PasteGG_url;
22
+ Object.defineProperty(exports, "__esModule", { value: true });
23
+ exports.PasteGG = void 0;
24
+ const node_fetch_1 = __importDefault(require("node-fetch"));
25
+ const querystring_1 = require("querystring");
26
+ const interfaces_1 = require("./interfaces");
27
+ const defaultOptions = {
28
+ baseUrl: "https://api.paste.gg",
29
+ mainUrl: "https://paste.gg",
30
+ version: 1,
31
+ };
32
+ /**
33
+ * The main class for interacting with the Paste.gg API
34
+ */
35
+ class PasteGG {
36
+ /**
37
+ * Create a new instance of PasteGG
38
+ * @param {string} auth Optional auth key
39
+ * @param {Options} options Options for the paste server
40
+ * @class PasteGG
41
+ * @public
42
+ * @example
43
+ * // If you want to be anonymous
44
+ * const pasteGG = new PasteGG()
45
+ *
46
+ * // If you want to use an api key
47
+ * const pasteGG = new PasteGG("apiKeyHere")
48
+ */
49
+ constructor(auth, options = defaultOptions) {
50
+ _PasteGG_auth.set(this, void 0);
51
+ _PasteGG_url.set(this, void 0);
52
+ /**
53
+ * The auth key
54
+ * @type {string}
55
+ * @private
56
+ * @readonly
57
+ */
58
+ __classPrivateFieldSet(this, _PasteGG_auth, auth, "f");
59
+ /**
60
+ * The options for the paste server
61
+ * @type {Options}
62
+ * @public
63
+ * @readonly
64
+ */
65
+ this.options = Object.assign(defaultOptions, options);
66
+ /**
67
+ * The version of the API wrapper
68
+ * @type {string}
69
+ * @public
70
+ * @readonly
71
+ */
72
+ this.version = `v${require("../package.json").version}`;
73
+ /**
74
+ * The full URL for the API
75
+ * @type {string}
76
+ * @private
77
+ * @readonly
78
+ */
79
+ __classPrivateFieldSet(this, _PasteGG_url, `${this.options.baseUrl}/v${this.options.version}`, "f");
80
+ }
81
+ /**
82
+ * Make a request to the API.
83
+ * @param {keyof typeof Methods} method
84
+ * @param {string} path
85
+ * @param {object} body
86
+ * @param {string} key
87
+ * @returns {Promise<T>}
88
+ * @private
89
+ */
90
+ async _request(method, path, body, key) {
91
+ const headers = {};
92
+ if (__classPrivateFieldGet(this, _PasteGG_auth, "f"))
93
+ headers.Authorization = `Key ${__classPrivateFieldGet(this, _PasteGG_auth, "f")}`;
94
+ if (key === null || key === void 0 ? void 0 : key.length)
95
+ headers.Authorization = `Key ${key}`;
96
+ if (method !== "GET")
97
+ headers["Content-Type"] = "application/json";
98
+ let urlPath = `${__classPrivateFieldGet(this, _PasteGG_url, "f")}${path}`;
99
+ if (body && method === "GET")
100
+ urlPath += `?${querystring_1.stringify(body)}`;
101
+ const res = await node_fetch_1.default(urlPath, {
102
+ method,
103
+ headers,
104
+ body: body && method !== "GET" ? JSON.stringify(body) : null,
105
+ });
106
+ return res.json();
107
+ }
108
+ /**
109
+ * Get an existing paste.
110
+ * @see https://github.com/ascclemens/paste/blob/master/api.md#get-pastesid
111
+ * @param {string} id The ID of the paste.
112
+ * @param {boolean} full Includes the contents of files if true.
113
+ * @returns {Promise<Output>}
114
+ * @public
115
+ * @example
116
+ * // if you would like to exclude file contents
117
+ * await pasteGG.get("idHere")
118
+ *
119
+ * // If you would like to include file contents
120
+ * await pasteGG.get("idHere", true)
121
+ */
122
+ async get(id, full = false) {
123
+ if (!(id === null || id === void 0 ? void 0 : id.length)) {
124
+ throw new Error("A paste ID is required to use PasteGG#get()");
125
+ }
126
+ return this._request(interfaces_1.Methods.GET, `/pastes/${id}`, { full });
127
+ }
128
+ /**
129
+ * Create a new paste.
130
+ * @see https://github.com/ascclemens/paste/blob/master/api.md#post-pastes
131
+ * @param {Post} input The information to create the paste with.
132
+ * @returns {Promise<Output>}
133
+ * @public
134
+ * @example
135
+ * await pasteGG.post({
136
+ * name: "Paste name", // Optional
137
+ * description: "Paste description", // Optional
138
+ * expires: "2020-12-21T02:25:56.428Z", // Optional (must be a UTC ISO 8601 string)
139
+ * files: [{
140
+ * name: "file.txt", // Optional
141
+ * content: {
142
+ * format: "text",
143
+ * value: "This is where the file content will go"
144
+ * }
145
+ * }]
146
+ * })
147
+ */
148
+ async post(input) {
149
+ if (!input) {
150
+ throw new Error("An input object is required to use PasteGG#post()");
151
+ }
152
+ const res = await this._request(interfaces_1.Methods.POST, "/pastes", input);
153
+ if (res.result)
154
+ res.result.url = `${this.options.mainUrl}/${res.result.id}`;
155
+ return res;
156
+ }
157
+ /**
158
+ * Deletes an existing paste.
159
+ * @see https://github.com/ascclemens/paste/blob/master/api.md#delete-pastesid
160
+ * @param {string} id The ID of the paste to delete.
161
+ * @param {string} [key] Auth key or deletion key (leave blank if you have set the auth key in the constructor)
162
+ * @returns {Promise<Output | void>}
163
+ * @public
164
+ * @example
165
+ * // Delete with deletion key
166
+ * await pasteGG.delete("idHere", "deletionKeyHere")
167
+ *
168
+ * // Delete with auth key if not set in constructor
169
+ * await pasteGG.delete("idHere", "authKeyHere")
170
+ *
171
+ * // Leave blank if auth key is in the class constructor
172
+ * await pasteGG.delete("idHere")
173
+ */
174
+ async delete(id, key) {
175
+ var _a;
176
+ if (!((_a = __classPrivateFieldGet(this, _PasteGG_auth, "f")) === null || _a === void 0 ? void 0 : _a.length) && !(key === null || key === void 0 ? void 0 : key.length))
177
+ throw new Error("An auth key or deletion key is needed to use PasteGG#delete()");
178
+ return this._request(interfaces_1.Methods.DELETE, `/pastes/${id}`, null, key);
179
+ }
180
+ /**
181
+ * Update an existing paste.
182
+ * @see https://github.com/ascclemens/paste/blob/master/api.md#patch-pastesid
183
+ * @param {string} id The ID for the paste to update.
184
+ * @param {Update} options The options you wish to update.
185
+ * @returns {Promise<Output | void>}
186
+ * @public
187
+ * @example
188
+ * await pasteGG.update("idHere", {
189
+ * name: "new name", // Optional (if you want to remove the name)
190
+ * description: "new description"
191
+ * })
192
+ */
193
+ async update(id, options) {
194
+ var _a;
195
+ if (!((_a = __classPrivateFieldGet(this, _PasteGG_auth, "f")) === null || _a === void 0 ? void 0 : _a.length))
196
+ throw new Error("An auth key is required to use PasteGG#update()");
197
+ if (!options.name)
198
+ options.name = null;
199
+ return this._request(interfaces_1.Methods.PATCH, `/pastes/${id}`, options);
200
+ }
201
+ }
202
+ exports.PasteGG = PasteGG;
203
+ _PasteGG_auth = new WeakMap(), _PasteGG_url = new WeakMap();
204
+ exports.default = PasteGG;
205
+ module.exports = PasteGG; // JS: default import
206
+ module.exports.PasteGG = PasteGG; // JS: deconstruct import
207
+ /**
208
+ * The header options
209
+ * @typedef {IHeader} IHeader
210
+ * @property {string} [Content-Type] The request content type
211
+ * @property {string} [Authorization] Authorization for the request
212
+ */
213
+ /**
214
+ * @typedef {Options} Options
215
+ * @property {string} [baseUrl=https://api.paste.gg] The base URL of the API
216
+ * @property {string} [mainUrl=https://paste.gg] The URL of the main website
217
+ * @property {number} [version=1] The version of the API
218
+ */
219
+ /**
220
+ * @typedef {Result} Result
221
+ * @property {string} id The ID of the created paste
222
+ * @property {string} [name] The name of the created paste
223
+ * @property {string} [url] The URL for the result
224
+ * @property {Author} [author] The author of the paste
225
+ * @property {string} [description] The description of the created paste
226
+ * @property {public | unlisted | private} [visibility=unlisted] The visibility of the created paste
227
+ * @property {string} created_at The date the paste was created
228
+ * @property {string} updated_at The date the paste was last updated
229
+ * @property {string} [expires] The date when the paste expires
230
+ * @property {File[]} [files] The files used in the created paste
231
+ * @property {string} [deletion_key] The deletion key of the created paste
232
+ */
233
+ /**
234
+ * @typedef {Output} Output
235
+ * @property {string} status The output status
236
+ * @property {Result} [result] The result data object
237
+ * @property {string} [error] The error key
238
+ * @property {string} [message] The error message
239
+ */
240
+ /**
241
+ * @typedef {Post} Post
242
+ * @property {string} [name] The name of the paste
243
+ * @property {string} [description] The description of the paste (must be less than 25 KiB)
244
+ * @property {public | unlisted | private} [visibility=unlisted] The visibility of the paste
245
+ * @property {string} [expires] The expiration date of the paste (must be a UTC ISO 8601 string)
246
+ * @property {FileOut[]} files Array of files to add to the paste (at least one file)
247
+ */
248
+ /**
249
+ * @typedef {Author} Author
250
+ * @property {string} [id] The ID of the author
251
+ * @property {string} [username] The username of the author
252
+ * @property {string} [name] The name of the author
253
+ */
254
+ /**
255
+ * @typedef {Update} Update
256
+ * @property {string} [name] The new name of the post
257
+ * @property {string} description The new description of the post
258
+ */
259
+ /**
260
+ * @typedef {File} File
261
+ * @property {string} id The ID of the file
262
+ * @property {string} name The name of the file
263
+ * @property {string | null} highlight_language The syntax highlighting language used
264
+ */
265
+ /**
266
+ * @typedef {Content} Content
267
+ * @property {text | base64 | gzip | xz} format The format of the file
268
+ * @property {string} [highlight_language] The syntax highlighting language to use
269
+ * @property {string} value The value of the file contents
270
+ */
271
+ /**
272
+ * @typedef {FileOut} FileOut
273
+ * @property {string} [name] The name of the file
274
+ * @property {Content} content The content of the file
275
+ */
276
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7O0dBSUc7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVILDREQUErQjtBQUMvQiw2Q0FBc0U7QUFDdEUsNkNBV3NCO0FBRXRCLE1BQU0sY0FBYyxHQUFZO0lBQzlCLE9BQU8sRUFBRSxzQkFBc0I7SUFDL0IsT0FBTyxFQUFFLGtCQUFrQjtJQUMzQixPQUFPLEVBQUUsQ0FBQztDQUNYLENBQUM7QUFFRjs7R0FFRztBQUNILE1BQU0sT0FBTztJQU1YOzs7Ozs7Ozs7Ozs7T0FZRztJQUNILFlBQVksSUFBYSxFQUFFLFVBQW1CLGNBQWM7UUFsQjVELGdDQUF1QjtRQUN2QiwrQkFBc0I7UUFrQnBCOzs7OztXQUtHO1FBQ0gsdUJBQUEsSUFBSSxpQkFBUyxJQUFJLE1BQUEsQ0FBQztRQUNsQjs7Ozs7V0FLRztRQUNILElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBbUIsY0FBYyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3hFOzs7OztXQUtHO1FBQ0gsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3hEOzs7OztXQUtHO1FBQ0gsdUJBQUEsSUFBSSxnQkFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxLQUFLLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLE1BQUEsQ0FBQztJQUNqRSxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSyxLQUFLLENBQUMsUUFBUSxDQUNwQixNQUE0QixFQUM1QixJQUFZLEVBQ1osSUFBYSxFQUNiLEdBQVk7UUFFWixNQUFNLE9BQU8sR0FBWSxFQUFFLENBQUM7UUFDNUIsSUFBSSx1QkFBQSxJQUFJLHFCQUFNO1lBQUUsT0FBTyxDQUFDLGFBQWEsR0FBRyxPQUFPLHVCQUFBLElBQUks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UUFDdkMsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFTLG9CQUFPLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDeEUsQ0FBQztDQUNGO0FBRVEsMEJBQU87O0FBQ2hCLGtCQUFlLE9BQU8sQ0FBQztBQUN2QixNQUFNLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxDQUFDLHFCQUFxQjtBQUMvQyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsQ0FBQyx5QkFBeUI7QUFFM0Q7Ozs7O0dBS0c7QUFFSDs7Ozs7R0FLRztBQUVIOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7OztHQU9HO0FBRUg7Ozs7O0dBS0c7QUFFSDs7OztHQUlHO0FBRUg7Ozs7O0dBS0c7QUFFSDs7Ozs7R0FLRztBQUVIOzs7O0dBSUciLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IMKpIFNlcmVuTW9kejIxIDIwMTggLSAyMDIxIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBVbmF1dGhvcml6ZWQgZGlzdHJpYnV0aW9uIG9mIGFueSBjb2RlIHdpdGhpbiB0aGlzIHByb2plY3QgbWF5IHJlc3VsdCBpbiBjb25zZXF1ZW5jZXMuXG4gKiBSZWZlciB0byB0aGUgUkVBRE1FIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICovXG5cbmltcG9ydCBmZXRjaCBmcm9tIFwibm9kZS1mZXRjaFwiO1xuaW1wb3J0IHsgUGFyc2VkVXJsUXVlcnlJbnB1dCBhcyBJbnB1dCwgc3RyaW5naWZ5IH0gZnJvbSBcInF1ZXJ5c3RyaW5nXCI7XG5pbXBvcnQge1xuICBBdXRob3IsXG4gIENvbnRlbnQsXG4gIEZpbGUsXG4gIElIZWFkZXIsXG4gIE1ldGhvZHMsXG4gIE9wdGlvbnMsXG4gIE91dHB1dCxcbiAgUG9zdCxcbiAgUmVzdWx0LFxuICBVcGRhdGUsXG59IGZyb20gXCIuL2ludGVyZmFjZXNcIjtcblxuY29uc3QgZGVmYXVsdE9wdGlvbnMgPSA8T3B0aW9ucz57XG4gIGJhc2VVcmw6IFwiaHR0cHM6Ly9hcGkucGFzdGUuZ2dcIixcbiAgbWFpblVybDogXCJodHRwczovL3Bhc3RlLmdnXCIsXG4gIHZlcnNpb246IDEsXG59O1xuXG4vKipcbiAqIFRoZSBtYWluIGNsYXNzIGZvciBpbnRlcmFjdGluZyB3aXRoIHRoZSBQYXN0ZS5nZyBBUElcbiAqL1xuY2xhc3MgUGFzdGVHRyB7XG4gIHJlYWRvbmx5ICNhdXRoOiBzdHJpbmc7XG4gIHJlYWRvbmx5ICN1cmw6IHN0cmluZztcbiAgcmVhZG9ubHkgb3B0aW9uczogT3B0aW9ucztcbiAgcmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgUGFzdGVHR1xuICAgKiBAcGFyYW0ge3N0cmluZ30gYXV0aCBPcHRpb25hbCBhdXRoIGtleVxuICAgKiBAcGFyYW0ge09wdGlvbnN9IG9wdGlvbnMgT3B0aW9ucyBmb3IgdGhlIHBhc3RlIHNlcnZlclxuICAgKiBAY2xhc3MgUGFzdGVHR1xuICAgKiBAcHVibGljXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIElmIHlvdSB3YW50IHRvIGJlIGFub255bW91c1xuICAgKiBjb25zdCBwYXN0ZUdHID0gbmV3IFBhc3RlR0coKVxuICAgKlxuICAgKiAvLyBJZiB5b3Ugd2FudCB0byB1c2UgYW4gYXBpIGtleVxuICAgKiBjb25zdCBwYXN0ZUdHID0gbmV3IFBhc3RlR0coXCJhcGlLZXlIZXJlXCIpXG4gICAqL1xuICBjb25zdHJ1Y3RvcihhdXRoPzogc3RyaW5nLCBvcHRpb25zOiBPcHRpb25zID0gZGVmYXVsdE9wdGlvbnMpIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYXV0aCBrZXlcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgdGhpcy4jYXV0aCA9IGF1dGg7XG4gICAgLyoqXG4gICAgICogVGhlIG9wdGlvbnMgZm9yIHRoZSBwYXN0ZSBzZXJ2ZXJcbiAgICAgKiBAdHlwZSB7T3B0aW9uc31cbiAgICAgKiBAcHVibGljXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgdGhpcy5vcHRpb25zID0gT2JqZWN0LmFzc2lnbjxPcHRpb25zLCBPcHRpb25zPihkZWZhdWx0T3B0aW9ucywgb3B0aW9ucyk7XG4gICAgLyoqXG4gICAgICogVGhlIHZlcnNpb24gb2YgdGhlIEFQSSB3cmFwcGVyXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAcHVibGljXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgdGhpcy52ZXJzaW9uID0gYHYke3JlcXVpcmUoXCIuLi9wYWNrYWdlLmpzb25cIikudmVyc2lvbn1gO1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIFVSTCBmb3IgdGhlIEFQSVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICB0aGlzLiN1cmwgPSBgJHt0aGlzLm9wdGlvbnMuYmFzZVVybH0vdiR7dGhpcy5vcHRpb25zLnZlcnNpb259YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYWtlIGEgcmVxdWVzdCB0byB0aGUgQVBJLlxuICAgKiBAcGFyYW0ge2tleW9mIHR5cGVvZiBNZXRob2RzfSBtZXRob2RcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICogQHBhcmFtIHtvYmplY3R9IGJvZHlcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxUPn1cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX3JlcXVlc3Q8VD4oXG4gICAgbWV0aG9kOiBrZXlvZiB0eXBlb2YgTWV0aG9kcyxcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgYm9keT86IG9iamVjdCxcbiAgICBrZXk/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTxUPiB7XG4gICAgY29uc3QgaGVhZGVyczogSUhlYWRlciA9IHt9O1xuICAgIGlmICh0aGlzLiNhdXRoKSBoZWFkZXJzLkF1dGhvcml6YXRpb24gPSBgS2V5ICR7dGhpcy4jYXV0aH1gO1xuICAgIGlmIChrZXk/Lmxlbmd0aCkgaGVhZGVycy5BdXRob3JpemF0aW9uID0gYEtleSAke2tleX1gO1xuICAgIGlmIChtZXRob2QgIT09IFwiR0VUXCIpIGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBcImFwcGxpY2F0aW9uL2pzb25cIjtcblxuICAgIGxldCB1cmxQYXRoID0gYCR7dGhpcy4jdXJsfSR7cGF0aH1gO1xuICAgIGlmIChib2R5ICYmIG1ldGhvZCA9PT0gXCJHRVRcIikgdXJsUGF0aCArPSBgPyR7c3RyaW5naWZ5KDxJbnB1dD5ib2R5KX1gO1xuXG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2godXJsUGF0aCwge1xuICAgICAgbWV0aG9kLFxuICAgICAgaGVhZGVycyxcbiAgICAgIGJvZHk6IGJvZHkgJiYgbWV0aG9kICE9PSBcIkdFVFwiID8gSlNPTi5zdHJpbmdpZnkoYm9keSkgOiBudWxsLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJlcy5qc29uKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFuIGV4aXN0aW5nIHBhc3RlLlxuICAgKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2NjbGVtZW5zL3Bhc3RlL2Jsb2IvbWFzdGVyL2FwaS5tZCNnZXQtcGFzdGVzaWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGlkIFRoZSBJRCBvZiB0aGUgcGFzdGUuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZnVsbCBJbmNsdWRlcyB0aGUgY29udGVudHMgb2YgZmlsZXMgaWYgdHJ1ZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8T3V0cHV0Pn1cbiAgICogQHB1YmxpY1xuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBpZiB5b3Ugd291bGQgbGlrZSB0byBleGNsdWRlIGZpbGUgY29udGVudHNcbiAgICogYXdhaXQgcGFzdGVHRy5nZXQoXCJpZEhlcmVcIilcbiAgICpcbiAgICogLy8gSWYgeW91IHdvdWxkIGxpa2UgdG8gaW5jbHVkZSBmaWxlIGNvbnRlbnRzXG4gICAqIGF3YWl0IHBhc3RlR0cuZ2V0KFwiaWRIZXJlXCIsIHRydWUpXG4gICAqL1xuICBhc3luYyBnZXQoaWQ6IHN0cmluZywgZnVsbDogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTxPdXRwdXQ+IHtcbiAgICBpZiAoIWlkPy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkEgcGFzdGUgSUQgaXMgcmVxdWlyZWQgdG8gdXNlIFBhc3RlR0cjZ2V0KClcIik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3JlcXVlc3Q8T3V0cHV0PihNZXRob2RzLkdFVCwgYC9wYXN0ZXMvJHtpZH1gLCB7IGZ1bGwgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IHBhc3RlLlxuICAgKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2NjbGVtZW5zL3Bhc3RlL2Jsb2IvbWFzdGVyL2FwaS5tZCNwb3N0LXBhc3Rlc1xuICAgKiBAcGFyYW0ge1Bvc3R9IGlucHV0IFRoZSBpbmZvcm1hdGlvbiB0byBjcmVhdGUgdGhlIHBhc3RlIHdpdGguXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPE91dHB1dD59XG4gICAqIEBwdWJsaWNcbiAgICogQGV4YW1wbGVcbiAgICogYXdhaXQgcGFzdGVHRy5wb3N0KHtcbiAgICogICBuYW1lOiBcIlBhc3RlIG5hbWVcIiwgLy8gT3B0aW9uYWxcbiAgICogICBkZXNjcmlwdGlvbjogXCJQYXN0ZSBkZXNjcmlwdGlvblwiLCAvLyBPcHRpb25hbFxuICAgKiAgIGV4cGlyZXM6IFwiMjAyMC0xMi0yMVQwMjoyNTo1Ni40MjhaXCIsIC8vIE9wdGlvbmFsIChtdXN0IGJlIGEgVVRDIElTTyA4NjAxIHN0cmluZylcbiAgICogICBmaWxlczogW3tcbiAgICogICAgIG5hbWU6IFwiZmlsZS50eHRcIiwgLy8gT3B0aW9uYWxcbiAgICogICAgIGNvbnRlbnQ6IHtcbiAgICogICAgICAgZm9ybWF0OiBcInRleHRcIixcbiAgICogICAgICAgdmFsdWU6IFwiVGhpcyBpcyB3aGVyZSB0aGUgZmlsZSBjb250ZW50IHdpbGwgZ29cIlxuICAgKiAgICAgfVxuICAgKiAgIH1dXG4gICAqIH0pXG4gICAqL1xuICBhc3luYyBwb3N0KGlucHV0OiBQb3N0KTogUHJvbWlzZTxPdXRwdXQ+IHtcbiAgICBpZiAoIWlucHV0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBbiBpbnB1dCBvYmplY3QgaXMgcmVxdWlyZWQgdG8gdXNlIFBhc3RlR0cjcG9zdCgpXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuX3JlcXVlc3Q8T3V0cHV0PihNZXRob2RzLlBPU1QsIFwiL3Bhc3Rlc1wiLCBpbnB1dCk7XG4gICAgaWYgKHJlcy5yZXN1bHQpIHJlcy5yZXN1bHQudXJsID0gYCR7dGhpcy5vcHRpb25zLm1haW5Vcmx9LyR7cmVzLnJlc3VsdC5pZH1gO1xuICAgIHJldHVybiByZXM7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlcyBhbiBleGlzdGluZyBwYXN0ZS5cbiAgICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vYXNjY2xlbWVucy9wYXN0ZS9ibG9iL21hc3Rlci9hcGkubWQjZGVsZXRlLXBhc3Rlc2lkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpZCBUaGUgSUQgb2YgdGhlIHBhc3RlIHRvIGRlbGV0ZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtrZXldIEF1dGgga2V5IG9yIGRlbGV0aW9uIGtleSAobGVhdmUgYmxhbmsgaWYgeW91IGhhdmUgc2V0IHRoZSBhdXRoIGtleSBpbiB0aGUgY29uc3RydWN0b3IpXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPE91dHB1dCB8IHZvaWQ+fVxuICAgKiBAcHVibGljXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIERlbGV0ZSB3aXRoIGRlbGV0aW9uIGtleVxuICAgKiBhd2FpdCBwYXN0ZUdHLmRlbGV0ZShcImlkSGVyZVwiLCBcImRlbGV0aW9uS2V5SGVyZVwiKVxuICAgKlxuICAgKiAvLyBEZWxldGUgd2l0aCBhdXRoIGtleSBpZiBub3Qgc2V0IGluIGNvbnN0cnVjdG9yXG4gICAqIGF3YWl0IHBhc3RlR0cuZGVsZXRlKFwiaWRIZXJlXCIsIFwiYXV0aEtleUhlcmVcIilcbiAgICpcbiAgICogLy8gTGVhdmUgYmxhbmsgaWYgYXV0aCBrZXkgaXMgaW4gdGhlIGNsYXNzIGNvbnN0cnVjdG9yXG4gICAqIGF3YWl0IHBhc3RlR0cuZGVsZXRlKFwiaWRIZXJlXCIpXG4gICAqL1xuICBhc3luYyBkZWxldGUoaWQ6IHN0cmluZywga2V5Pzogc3RyaW5nKTogUHJvbWlzZTxPdXRwdXQgfCB2b2lkPiB7XG4gICAgaWYgKCF0aGlzLiNhdXRoPy5sZW5ndGggJiYgIWtleT8ubGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIkFuIGF1dGgga2V5IG9yIGRlbGV0aW9uIGtleSBpcyBuZWVkZWQgdG8gdXNlIFBhc3RlR0cjZGVsZXRlKClcIlxuICAgICAgKTtcblxuICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0PE91dHB1dD4oTWV0aG9kcy5ERUxFVEUsIGAvcGFzdGVzLyR7aWR9YCwgbnVsbCwga2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgYW4gZXhpc3RpbmcgcGFzdGUuXG4gICAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2FzY2NsZW1lbnMvcGFzdGUvYmxvYi9tYXN0ZXIvYXBpLm1kI3BhdGNoLXBhc3Rlc2lkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpZCBUaGUgSUQgZm9yIHRoZSBwYXN0ZSB0byB1cGRhdGUuXG4gICAqIEBwYXJhbSB7VXBkYXRlfSBvcHRpb25zIFRoZSBvcHRpb25zIHlvdSB3aXNoIHRvIHVwZGF0ZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8T3V0cHV0IHwgdm9pZD59XG4gICAqIEBwdWJsaWNcbiAgICogQGV4YW1wbGVcbiAgICogYXdhaXQgcGFzdGVHRy51cGRhdGUoXCJpZEhlcmVcIiwge1xuICAgKiAgIG5hbWU6IFwibmV3IG5hbWVcIiwgLy8gT3B0aW9uYWwgKGlmIHlvdSB3YW50IHRvIHJlbW92ZSB0aGUgbmFtZSlcbiAgICogICBkZXNjcmlwdGlvbjogXCJuZXcgZGVzY3JpcHRpb25cIlxuICAgKiB9KVxuICAgKi9cbiAgYXN5bmMgdXBkYXRlKGlkOiBzdHJpbmcsIG9wdGlvbnM6IFVwZGF0ZSk6IFByb21pc2U8T3V0cHV0IHwgdm9pZD4ge1xuICAgIGlmICghdGhpcy4jYXV0aD8ubGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQW4gYXV0aCBrZXkgaXMgcmVxdWlyZWQgdG8gdXNlIFBhc3RlR0cjdXBkYXRlKClcIik7XG5cbiAgICBpZiAoIW9wdGlvbnMubmFtZSkgb3B0aW9ucy5uYW1lID0gbnVsbDtcbiAgICByZXR1cm4gdGhpcy5fcmVxdWVzdDxPdXRwdXQ+KE1ldGhvZHMuUEFUQ0gsIGAvcGFzdGVzLyR7aWR9YCwgb3B0aW9ucyk7XG4gIH1cbn1cblxuZXhwb3J0IHsgUGFzdGVHRyB9O1xuZXhwb3J0IGRlZmF1bHQgUGFzdGVHRztcbm1vZHVsZS5leHBvcnRzID0gUGFzdGVHRzsgLy8gSlM6IGRlZmF1bHQgaW1wb3J0XG5tb2R1bGUuZXhwb3J0cy5QYXN0ZUdHID0gUGFzdGVHRzsgLy8gSlM6IGRlY29uc3RydWN0IGltcG9ydFxuXG4vKipcbiAqIFRoZSBoZWFkZXIgb3B0aW9uc1xuICogQHR5cGVkZWYge0lIZWFkZXJ9IElIZWFkZXJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbQ29udGVudC1UeXBlXSBUaGUgcmVxdWVzdCBjb250ZW50IHR5cGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbQXV0aG9yaXphdGlvbl0gQXV0aG9yaXphdGlvbiBmb3IgdGhlIHJlcXVlc3RcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPcHRpb25zfSBPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2Jhc2VVcmw9aHR0cHM6Ly9hcGkucGFzdGUuZ2ddIFRoZSBiYXNlIFVSTCBvZiB0aGUgQVBJXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW21haW5Vcmw9aHR0cHM6Ly9wYXN0ZS5nZ10gVGhlIFVSTCBvZiB0aGUgbWFpbiB3ZWJzaXRlXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3ZlcnNpb249MV0gVGhlIHZlcnNpb24gb2YgdGhlIEFQSVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge1Jlc3VsdH0gUmVzdWx0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gaWQgVGhlIElEIG9mIHRoZSBjcmVhdGVkIHBhc3RlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW25hbWVdIFRoZSBuYW1lIG9mIHRoZSBjcmVhdGVkIHBhc3RlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3VybF0gVGhlIFVSTCBmb3IgdGhlIHJlc3VsdFxuICogQHByb3BlcnR5IHtBdXRob3J9IFthdXRob3JdIFRoZSBhdXRob3Igb2YgdGhlIHBhc3RlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2Rlc2NyaXB0aW9uXSBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIGNyZWF0ZWQgcGFzdGVcbiAqIEBwcm9wZXJ0eSB7cHVibGljIHwgdW5saXN0ZWQgfCBwcml2YXRlfSBbdmlzaWJpbGl0eT11bmxpc3RlZF0gVGhlIHZpc2liaWxpdHkgb2YgdGhlIGNyZWF0ZWQgcGFzdGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjcmVhdGVkX2F0IFRoZSBkYXRlIHRoZSBwYXN0ZSB3YXMgY3JlYXRlZFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHVwZGF0ZWRfYXQgVGhlIGRhdGUgdGhlIHBhc3RlIHdhcyBsYXN0IHVwZGF0ZWRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZXhwaXJlc10gVGhlIGRhdGUgd2hlbiB0aGUgcGFzdGUgZXhwaXJlc1xuICogQHByb3BlcnR5IHtGaWxlW119IFtmaWxlc10gVGhlIGZpbGVzIHVzZWQgaW4gdGhlIGNyZWF0ZWQgcGFzdGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZGVsZXRpb25fa2V5XSBUaGUgZGVsZXRpb24ga2V5IG9mIHRoZSBjcmVhdGVkIHBhc3RlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T3V0cHV0fSBPdXRwdXRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzdGF0dXMgVGhlIG91dHB1dCBzdGF0dXNcbiAqIEBwcm9wZXJ0eSB7UmVzdWx0fSBbcmVzdWx0XSBUaGUgcmVzdWx0IGRhdGEgb2JqZWN0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2Vycm9yXSBUaGUgZXJyb3Iga2V5XG4gKiBAcHJvcGVydHkge3N0cmluZ30gW21lc3NhZ2VdIFRoZSBlcnJvciBtZXNzYWdlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7UG9zdH0gUG9zdFxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtuYW1lXSBUaGUgbmFtZSBvZiB0aGUgcGFzdGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZGVzY3JpcHRpb25dIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgcGFzdGUgKG11c3QgYmUgbGVzcyB0aGFuIDI1IEtpQilcbiAqIEBwcm9wZXJ0eSB7cHVibGljIHwgdW5saXN0ZWQgfCBwcml2YXRlfSBbdmlzaWJpbGl0eT11bmxpc3RlZF0gVGhlIHZpc2liaWxpdHkgb2YgdGhlIHBhc3RlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2V4cGlyZXNdIFRoZSBleHBpcmF0aW9uIGRhdGUgb2YgdGhlIHBhc3RlIChtdXN0IGJlIGEgVVRDIElTTyA4NjAxIHN0cmluZylcbiAqIEBwcm9wZXJ0eSB7RmlsZU91dFtdfSBmaWxlcyBBcnJheSBvZiBmaWxlcyB0byBhZGQgdG8gdGhlIHBhc3RlIChhdCBsZWFzdCBvbmUgZmlsZSlcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtBdXRob3J9IEF1dGhvclxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtpZF0gVGhlIElEIG9mIHRoZSBhdXRob3JcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdXNlcm5hbWVdIFRoZSB1c2VybmFtZSBvZiB0aGUgYXV0aG9yXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW25hbWVdIFRoZSBuYW1lIG9mIHRoZSBhdXRob3JcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtVcGRhdGV9IFVwZGF0ZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtuYW1lXSBUaGUgbmV3IG5hbWUgb2YgdGhlIHBvc3RcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkZXNjcmlwdGlvbiBUaGUgbmV3IGRlc2NyaXB0aW9uIG9mIHRoZSBwb3N0XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7RmlsZX0gRmlsZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IGlkIFRoZSBJRCBvZiB0aGUgZmlsZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIGZpbGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgbnVsbH0gaGlnaGxpZ2h0X2xhbmd1YWdlIFRoZSBzeW50YXggaGlnaGxpZ2h0aW5nIGxhbmd1YWdlIHVzZWRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtDb250ZW50fSBDb250ZW50XG4gKiBAcHJvcGVydHkge3RleHQgfCBiYXNlNjQgfCBnemlwIHwgeHp9IGZvcm1hdCBUaGUgZm9ybWF0IG9mIHRoZSBmaWxlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2hpZ2hsaWdodF9sYW5ndWFnZV0gVGhlIHN5bnRheCBoaWdobGlnaHRpbmcgbGFuZ3VhZ2UgdG8gdXNlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBmaWxlIGNvbnRlbnRzXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7RmlsZU91dH0gRmlsZU91dFxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtuYW1lXSBUaGUgbmFtZSBvZiB0aGUgZmlsZVxuICogQHByb3BlcnR5IHtDb250ZW50fSBjb250ZW50IFRoZSBjb250ZW50IG9mIHRoZSBmaWxlXG4gKi9cbiJdfQ==