production-cluster-mark 0.1.0
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/CHANGELOG.md +10 -0
- package/LICENSE +21 -0
- package/README.md +21 -0
- package/assets/banner.svg +44 -0
- package/assets/icon.svg +1 -0
- package/dist/index.js +207 -0
- package/package.json +55 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
What changed in each version of this extension, newest first.
|
|
4
|
+
|
|
5
|
+
## 0.1.0
|
|
6
|
+
|
|
7
|
+
- Created the extension.
|
|
8
|
+
- While a production cluster's tab is selected, a red edge runs around the whole window.
|
|
9
|
+
- Clusters named with `prod`, `production` or `prd` count as production automatically.
|
|
10
|
+
- Mark or unmark any cluster as production from its right-click menu in the navigator, or from the command palette.
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Yalton Ruiz
|
|
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
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# production-cluster-mark
|
|
2
|
+
|
|
3
|
+
Makes it obvious at all times that you are working in a production cluster, so you are less likely to change the wrong environment.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
While the selected tab belongs to a production cluster, a red edge runs around the whole Lens window. It draws over nothing you need, and clicks go straight through it.
|
|
8
|
+
|
|
9
|
+
Switch to a staging cluster, or to a tab that is not a cluster, and the edge disappears.
|
|
10
|
+
|
|
11
|
+
## Which clusters count as production
|
|
12
|
+
|
|
13
|
+
- **By name, automatically:** a cluster whose name contains `prod`, `production` or `prd` as a separate word, such as `prod-eu`, `k8s_production` or `prd01`. Names like `preprod` or `nonprod` do not count.
|
|
14
|
+
- **By hand:** right-click a cluster in the navigator and choose **Mark as production** or **Unmark as production**. From the command palette, **Production Cluster Mark: Mark this cluster as production** toggles the cluster you are looking at. Your choice overrides the name rule and is remembered across restarts.
|
|
15
|
+
|
|
16
|
+
## Development
|
|
17
|
+
|
|
18
|
+
1. `npm install`
|
|
19
|
+
2. `npm run build` after every change under `src/`
|
|
20
|
+
|
|
21
|
+
What changed in each version is in [CHANGELOG.md](./CHANGELOG.md).
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 400">
|
|
2
|
+
<defs>
|
|
3
|
+
<linearGradient id="bg" x1="0" y1="0" x2="1" y2="1">
|
|
4
|
+
<stop offset="0" stop-color="#2a2d35"/>
|
|
5
|
+
<stop offset="1" stop-color="#16171b"/>
|
|
6
|
+
</linearGradient>
|
|
7
|
+
<filter id="glow" x="-20%" y="-20%" width="140%" height="140%">
|
|
8
|
+
<feGaussianBlur stdDeviation="10"/>
|
|
9
|
+
</filter>
|
|
10
|
+
</defs>
|
|
11
|
+
<rect width="800" height="400" fill="url(#bg)"/>
|
|
12
|
+
|
|
13
|
+
<!-- A Lens window, marked as production by its red edge -->
|
|
14
|
+
<g transform="translate(190 70)">
|
|
15
|
+
<rect x="0" y="0" width="420" height="260" rx="12" fill="none" stroke="#e53935" stroke-width="10" opacity=".45" filter="url(#glow)"/>
|
|
16
|
+
<rect x="0" y="0" width="420" height="260" rx="12" fill="#1e1f24"/>
|
|
17
|
+
<!-- top bar -->
|
|
18
|
+
<rect x="0" y="0" width="420" height="30" rx="12" fill="#2b2d33"/>
|
|
19
|
+
<rect x="0" y="18" width="420" height="12" fill="#2b2d33"/>
|
|
20
|
+
<circle cx="20" cy="15" r="5" fill="#ff5f57"/>
|
|
21
|
+
<circle cx="36" cy="15" r="5" fill="#febc2e"/>
|
|
22
|
+
<circle cx="52" cy="15" r="5" fill="#28c840"/>
|
|
23
|
+
<!-- navigator -->
|
|
24
|
+
<rect x="0" y="30" width="110" height="230" fill="#24262b"/>
|
|
25
|
+
<rect x="14" y="48" width="70" height="8" rx="4" fill="#4a4d55"/>
|
|
26
|
+
<rect x="22" y="68" width="62" height="8" rx="4" fill="#e53935"/>
|
|
27
|
+
<rect x="22" y="88" width="54" height="8" rx="4" fill="#4a4d55"/>
|
|
28
|
+
<rect x="22" y="108" width="66" height="8" rx="4" fill="#4a4d55"/>
|
|
29
|
+
<rect x="22" y="128" width="48" height="8" rx="4" fill="#4a4d55"/>
|
|
30
|
+
<!-- tab and content -->
|
|
31
|
+
<rect x="110" y="30" width="120" height="26" fill="#1e1f24"/>
|
|
32
|
+
<rect x="110" y="30" width="120" height="3" fill="#e53935"/>
|
|
33
|
+
<text x="124" y="48" font-family="Helvetica,Arial,sans-serif" font-size="12" font-weight="700" fill="#e6e6e6">prod-eu</text>
|
|
34
|
+
<rect x="110" y="56" width="310" height="1" fill="#34363c"/>
|
|
35
|
+
<rect x="130" y="76" width="130" height="10" rx="5" fill="#3b3e45"/>
|
|
36
|
+
<rect x="130" y="100" width="260" height="60" rx="6" fill="#2a2c32"/>
|
|
37
|
+
<rect x="130" y="172" width="120" height="60" rx="6" fill="#2a2c32"/>
|
|
38
|
+
<rect x="262" y="172" width="128" height="60" rx="6" fill="#2a2c32"/>
|
|
39
|
+
<!-- the red edge -->
|
|
40
|
+
<rect x="3" y="3" width="414" height="254" rx="10" fill="none" stroke="#e53935" stroke-width="6"/>
|
|
41
|
+
</g>
|
|
42
|
+
|
|
43
|
+
<text x="400" y="372" text-anchor="middle" font-family="Helvetica,Arial,sans-serif" font-size="22" font-weight="700" letter-spacing="5" fill="#e53935">PRODUCTION CLUSTER MARK</text>
|
|
44
|
+
</svg>
|
package/assets/icon.svg
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><path d="M32 4 60 56H4Z" fill="#e53935" stroke="#fff" stroke-width="3" stroke-linejoin="round"/><rect x="29" y="22" width="6" height="18" rx="3" fill="#fff"/><circle cx="32" cy="47" r="3.5" fill="#fff"/></svg>
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/index.ts
|
|
21
|
+
var index_exports = {};
|
|
22
|
+
__export(index_exports, {
|
|
23
|
+
productionClusterMarkFeature: () => productionClusterMarkFeature
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(index_exports);
|
|
26
|
+
var import_feature_core = require("@k8slens/feature-core");
|
|
27
|
+
|
|
28
|
+
// src/production-overrides.injectable.ts
|
|
29
|
+
var production_overrides_injectable_exports = {};
|
|
30
|
+
__export(production_overrides_injectable_exports, {
|
|
31
|
+
productionOverridesBunch: () => productionOverridesBunch
|
|
32
|
+
});
|
|
33
|
+
var import_persistable_contracts = require("@k8slens/persistable-contracts");
|
|
34
|
+
var productionOverridesBunch = (0, import_persistable_contracts.getPersistableMapInjectableBunch)()({
|
|
35
|
+
id: "production-overrides"
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
// src/production-state.injectable.ts
|
|
39
|
+
var production_state_injectable_exports = {};
|
|
40
|
+
__export(production_state_injectable_exports, {
|
|
41
|
+
productionStateInjectable: () => productionStateInjectable
|
|
42
|
+
});
|
|
43
|
+
var import_cluster_contracts = require("@k8slens/cluster-contracts");
|
|
44
|
+
var import_injectable = require("@k8slens/injectable");
|
|
45
|
+
var import_main_view_contracts = require("@k8slens/main-view-contracts");
|
|
46
|
+
var import_mobx = require("mobx");
|
|
47
|
+
|
|
48
|
+
// src/is-production-name.ts
|
|
49
|
+
var productionNamePattern = /(^|[^a-z])(prod|production|prd)([^a-z]|$)/i;
|
|
50
|
+
var isProductionName = (name) => productionNamePattern.test(name);
|
|
51
|
+
|
|
52
|
+
// src/production-state.injectable.ts
|
|
53
|
+
var productionStateInjectable = (0, import_injectable.getInjectable2)({
|
|
54
|
+
id: "production-cluster-mark-state",
|
|
55
|
+
consumptions: [import_cluster_contracts.allClusterRecordsReactiveInjectionToken, import_main_view_contracts.activeTabClusterIdReactiveInjectionToken],
|
|
56
|
+
instantiate: (di) => {
|
|
57
|
+
const activeClusterId = di.inject(import_main_view_contracts.activeTabClusterIdReactiveInjectionToken)();
|
|
58
|
+
const overrides = import_mobx.observable.box(void 0, { deep: false });
|
|
59
|
+
const clusterRecords = import_mobx.observable.box(void 0, { deep: false });
|
|
60
|
+
void di.inject(productionOverridesBunch.persistable)().then((0, import_mobx.action)((map) => overrides.set(map)));
|
|
61
|
+
void di.inject(import_cluster_contracts.allClusterRecordsReactiveInjectionToken)().then((0, import_mobx.action)((records) => clusterRecords.set(records)));
|
|
62
|
+
const nameOf = (clusterId) => {
|
|
63
|
+
var _a, _b;
|
|
64
|
+
return (_b = (_a = clusterRecords.get()) == null ? void 0 : _a.get().find((record) => record.id === clusterId)) == null ? void 0 : _b.name.get();
|
|
65
|
+
};
|
|
66
|
+
const isProduction = (clusterId) => {
|
|
67
|
+
var _a;
|
|
68
|
+
const override = (_a = overrides.get()) == null ? void 0 : _a.get(clusterId);
|
|
69
|
+
if (override !== void 0) {
|
|
70
|
+
return override;
|
|
71
|
+
}
|
|
72
|
+
const name = nameOf(clusterId);
|
|
73
|
+
return name ? isProductionName(name) : false;
|
|
74
|
+
};
|
|
75
|
+
const activeProductionCluster = (0, import_mobx.computed)(() => {
|
|
76
|
+
const clusterId = activeClusterId.get();
|
|
77
|
+
if (!clusterId || !isProduction(clusterId)) {
|
|
78
|
+
return void 0;
|
|
79
|
+
}
|
|
80
|
+
return { id: clusterId, name: nameOf(clusterId) ?? clusterId };
|
|
81
|
+
});
|
|
82
|
+
const setProduction = (0, import_mobx.action)((clusterId, value) => {
|
|
83
|
+
var _a;
|
|
84
|
+
(_a = overrides.get()) == null ? void 0 : _a.set(clusterId, value);
|
|
85
|
+
});
|
|
86
|
+
return () => ({
|
|
87
|
+
isProduction,
|
|
88
|
+
activeProductionCluster,
|
|
89
|
+
isActiveClusterProduction: (0, import_mobx.computed)(() => activeProductionCluster.get() !== void 0),
|
|
90
|
+
activeClusterId,
|
|
91
|
+
toggle: (clusterId) => setProduction(clusterId, !isProduction(clusterId))
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
// src/production-top-bar-item.injectable.tsx
|
|
97
|
+
var production_top_bar_item_injectable_exports = {};
|
|
98
|
+
__export(production_top_bar_item_injectable_exports, {
|
|
99
|
+
default: () => production_top_bar_item_injectable_default
|
|
100
|
+
});
|
|
101
|
+
var import_top_bar_contracts = require("@k8slens/top-bar-contracts");
|
|
102
|
+
var import_use_inject = require("@k8slens/use-inject");
|
|
103
|
+
var import_mobx_react = require("mobx-react");
|
|
104
|
+
var import_react_dom = require("react-dom");
|
|
105
|
+
|
|
106
|
+
// lens-stylesheet:/Users/yruiz/.k8slens/extensions/production-cluster-mark/src/production-overlay.module.scss
|
|
107
|
+
var production_overlay_module_exports = {};
|
|
108
|
+
__export(production_overlay_module_exports, {
|
|
109
|
+
default: () => production_overlay_module_default,
|
|
110
|
+
stylesheet: () => stylesheet
|
|
111
|
+
});
|
|
112
|
+
var import_stylesheet_contracts = require("@k8slens/stylesheet-contracts");
|
|
113
|
+
var stylesheet = (0, import_stylesheet_contracts.asStylesheet)({ id: "production-cluster-mark/src/production-overlay.module.scss", css: ".production-overlay-module__frame___NgSBa {\n position: fixed;\n inset: 0;\n z-index: 2147483646;\n pointer-events: none;\n border: 3px solid #e53935;\n}" });
|
|
114
|
+
var production_overlay_module_default = { "frame": "production-overlay-module__frame___NgSBa" };
|
|
115
|
+
|
|
116
|
+
// src/production-top-bar-item.injectable.tsx
|
|
117
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
118
|
+
var ProductionMark = (0, import_mobx_react.observer)(() => {
|
|
119
|
+
const cluster = (0, import_use_inject.useInject)(productionStateInjectable)().activeProductionCluster.get();
|
|
120
|
+
return cluster ? (0, import_react_dom.createPortal)(/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: production_overlay_module_default.frame, "aria-hidden": true }), document.body) : null;
|
|
121
|
+
});
|
|
122
|
+
var production_top_bar_item_injectable_default = (0, import_top_bar_contracts.getTopBarItemInjectableBunch)({
|
|
123
|
+
id: "production-cluster-mark-top-bar-item",
|
|
124
|
+
side: "left",
|
|
125
|
+
orderNumber: 1e3,
|
|
126
|
+
Component: ProductionMark
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
// src/toggle-production-command.injectable.ts
|
|
130
|
+
var toggle_production_command_injectable_exports = {};
|
|
131
|
+
__export(toggle_production_command_injectable_exports, {
|
|
132
|
+
default: () => toggle_production_command_injectable_default
|
|
133
|
+
});
|
|
134
|
+
var import_command_palette_contracts = require("@k8slens/command-palette-contracts");
|
|
135
|
+
var import_mobx2 = require("mobx");
|
|
136
|
+
var toggle_production_command_injectable_default = (0, import_command_palette_contracts.getCommandInjectableBunch)({
|
|
137
|
+
id: "production-cluster-mark.toggle-production",
|
|
138
|
+
title: {
|
|
139
|
+
instantiate: (di) => {
|
|
140
|
+
const state = di.inject(productionStateInjectable)();
|
|
141
|
+
return () => (0, import_mobx2.computed)(
|
|
142
|
+
() => state.isActiveClusterProduction.get() ? "Production Cluster Mark: Unmark this cluster as production" : "Production Cluster Mark: Mark this cluster as production"
|
|
143
|
+
);
|
|
144
|
+
}
|
|
145
|
+
},
|
|
146
|
+
isActive: {
|
|
147
|
+
instantiate: (di) => {
|
|
148
|
+
const state = di.inject(productionStateInjectable)();
|
|
149
|
+
return () => (0, import_mobx2.computed)(() => state.activeClusterId.get() !== void 0);
|
|
150
|
+
}
|
|
151
|
+
},
|
|
152
|
+
action: {
|
|
153
|
+
instantiate: (di) => {
|
|
154
|
+
const state = di.inject(productionStateInjectable)();
|
|
155
|
+
return () => () => {
|
|
156
|
+
const clusterId = state.activeClusterId.get();
|
|
157
|
+
if (clusterId) {
|
|
158
|
+
state.toggle(clusterId);
|
|
159
|
+
}
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
// src/toggle-production-menu-item.injectable.tsx
|
|
166
|
+
var toggle_production_menu_item_injectable_exports = {};
|
|
167
|
+
__export(toggle_production_menu_item_injectable_exports, {
|
|
168
|
+
default: () => toggle_production_menu_item_injectable_default
|
|
169
|
+
});
|
|
170
|
+
var import_cluster_contracts2 = require("@k8slens/cluster-contracts");
|
|
171
|
+
var import_drop_down_menu_items = require("@k8slens/drop-down-menu-items");
|
|
172
|
+
var import_navigator_contracts = require("@k8slens/navigator-contracts");
|
|
173
|
+
var import_use_inject2 = require("@k8slens/use-inject");
|
|
174
|
+
var import_mobx_react2 = require("mobx-react");
|
|
175
|
+
var import_jsx_runtime2 = require("react/jsx-runtime");
|
|
176
|
+
var ToggleProduction = (0, import_mobx_react2.observer)(({ data }) => {
|
|
177
|
+
const state = (0, import_use_inject2.useInject)(productionStateInjectable)();
|
|
178
|
+
const clusterId = data.ids[data.ids.length - 1];
|
|
179
|
+
return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_drop_down_menu_items.DropDownMenuItemRow, { $onClick: () => state.toggle(clusterId), children: state.isProduction(clusterId) ? "Unmark as production" : "Mark as production" });
|
|
180
|
+
});
|
|
181
|
+
var toggle_production_menu_item_injectable_default = (0, import_navigator_contracts.getNavigatorItemMenuItemInjectableBunch)({
|
|
182
|
+
id: "production-cluster-mark-toggle-production",
|
|
183
|
+
forItemsOfKind: import_cluster_contracts2.clusterNavigatorItemKind,
|
|
184
|
+
orderNumber: import_navigator_contracts.navigatorItemDropDownMenuOrderNumbers.sectionEnd + 100,
|
|
185
|
+
Component: ToggleProduction
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
// import-glob:./**/*.injectable.(ts|tsx)/proof-of-uniqueness/f0f503a8-0847-46a4-952e-f28789969c8e
|
|
189
|
+
var modules = [production_overrides_injectable_exports, production_state_injectable_exports, production_top_bar_item_injectable_exports, toggle_production_command_injectable_exports, toggle_production_menu_item_injectable_exports];
|
|
190
|
+
var f0f503a8_0847_46a4_952e_f28789969c8e_default = modules;
|
|
191
|
+
|
|
192
|
+
// import-glob:./**/!(_*).(scss|css)/proof-of-uniqueness/c22b4662-b9e6-46c4-a34d-adee436ad5be
|
|
193
|
+
var modules2 = [production_overlay_module_exports];
|
|
194
|
+
var c22b4662_b9e6_46c4_a34d_adee436ad5be_default = modules2;
|
|
195
|
+
|
|
196
|
+
// src/index.ts
|
|
197
|
+
var productionClusterMarkFeature = (0, import_feature_core.getFeature)({
|
|
198
|
+
id: "production-cluster-mark",
|
|
199
|
+
register: (di) => {
|
|
200
|
+
(0, import_feature_core.registerInjectablesFromModules)(di, [...f0f503a8_0847_46a4_952e_f28789969c8e_default, ...c22b4662_b9e6_46c4_a34d_adee436ad5be_default]);
|
|
201
|
+
}
|
|
202
|
+
});
|
|
203
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
204
|
+
0 && (module.exports = {
|
|
205
|
+
productionClusterMarkFeature
|
|
206
|
+
});
|
|
207
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIiwgIi4uL3NyYy9wcm9kdWN0aW9uLW92ZXJyaWRlcy5pbmplY3RhYmxlLnRzIiwgIi4uL3NyYy9wcm9kdWN0aW9uLXN0YXRlLmluamVjdGFibGUudHMiLCAiLi4vc3JjL2lzLXByb2R1Y3Rpb24tbmFtZS50cyIsICIuLi9zcmMvcHJvZHVjdGlvbi10b3AtYmFyLWl0ZW0uaW5qZWN0YWJsZS50c3giLCAibGVucy1zdHlsZXNoZWV0Oi9Vc2Vycy95cnVpei8uazhzbGVucy9leHRlbnNpb25zL3Byb2R1Y3Rpb24tY2x1c3Rlci1tYXJrL3NyYy9wcm9kdWN0aW9uLW92ZXJsYXkubW9kdWxlLnNjc3MiLCAiLi4vc3JjL3RvZ2dsZS1wcm9kdWN0aW9uLWNvbW1hbmQuaW5qZWN0YWJsZS50cyIsICIuLi9zcmMvdG9nZ2xlLXByb2R1Y3Rpb24tbWVudS1pdGVtLmluamVjdGFibGUudHN4IiwgImltcG9ydC1nbG9iOi4vKiovKi5pbmplY3RhYmxlLih0c3x0c3gpL3Byb29mLW9mLXVuaXF1ZW5lc3MvZjBmNTAzYTgtMDg0Ny00NmE0LTk1MmUtZjI4Nzg5OTY5YzhlIiwgImltcG9ydC1nbG9iOi4vKiovIShfKikuKHNjc3N8Y3NzKS9wcm9vZi1vZi11bmlxdWVuZXNzL2MyMmI0NjYyLWI5ZTYtNDZjNC1hMzRkLWFkZWU0MzZhZDViZSJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHsgZ2V0RmVhdHVyZSwgcmVnaXN0ZXJJbmplY3RhYmxlc0Zyb21Nb2R1bGVzIH0gZnJvbSBcIkBrOHNsZW5zL2ZlYXR1cmUtY29yZVwiO1xuaW1wb3J0IG1vZHVsZXNXaXRoSW5qZWN0YWJsZXMgZnJvbSBcIi4vKiovKi5pbmplY3RhYmxlLih0c3x0c3gpXCI7XG5pbXBvcnQgc3R5bGVzaGVldHMgZnJvbSBcIi4vKiovIShfKikuKHNjc3N8Y3NzKVwiO1xuLy8gaW1wb3J0IHsgcGxhY2Vob2xkZXJTdGF0dXNCYXJJdGVtSW5qZWN0YWJsZSB9IGZyb20gXCIuL3BsYWNlaG9sZGVyLmluamVjdGFibGVcIjtcblxuZXhwb3J0IGNvbnN0IHByb2R1Y3Rpb25DbHVzdGVyTWFya0ZlYXR1cmUgPSBnZXRGZWF0dXJlKHtcbiAgaWQ6IFwicHJvZHVjdGlvbi1jbHVzdGVyLW1hcmtcIixcbiAgcmVnaXN0ZXI6IChkaSkgPT4ge1xuICAgIC8vIEF1dG8tZGlzY292ZXJzIGV2ZXJ5IGAqLmluamVjdGFibGUuKHRzfHRzeClgIGZpbGUgdW5kZXIgdGhpcyBkaXJlY3RvcnkgYW5kIHJlZ2lzdGVyc1xuICAgIC8vIGl0LiBQcmVmZXJyZWQgb3ZlciByZWdpc3RlcmluZyBpbmplY3RhYmxlcyBvbmUgYnkgb25lIFx1MjAxNCBhZGRpbmcgYSBuZXcgaW5qZWN0YWJsZSBmaWxlXG4gICAgLy8gYXV0b21hdGljYWxseSB3aXJlcyBpdCB1cDsgeW91IGNhbid0IGZvcmdldCB0byByZWdpc3RlciBpdC5cbiAgICAvLyBFdmVyeSBgLnNjc3NgLCBgLmNzc2AsIGAubW9kdWxlLnNjc3NgIGFuZCBgLm1vZHVsZS5jc3NgIHlvdSBpbXBvcnQgYmVjb21lcyBhIHN0eWxlc2hlZXRcbiAgICAvLyBpbmplY3RhYmxlIHdoZW4gdGhlIGV4dGVuc2lvbiBidWlsZHMsIGFuZCByaWRlcyBhbG9uZyBoZXJlIHRoZSBzYW1lIHdheTsgYSBgX3BhcnRpYWwuc2Nzc2BcbiAgICAvLyBzdGF5cyBvdXQgb2YgdGhlIGdsb2IuXG4gICAgcmVnaXN0ZXJJbmplY3RhYmxlc0Zyb21Nb2R1bGVzKGRpLCBbLi4ubW9kdWxlc1dpdGhJbmplY3RhYmxlcywgLi4uc3R5bGVzaGVldHNdKTtcblxuICAgIC8vIEVxdWl2YWxlbnQgbWFudWFsIGFsdGVybmF0aXZlIFx1MjAxNCB1bmNvbW1lbnQgdGhlIGltcG9ydCBhYm92ZSBhbmQgcGljayB0aGlzIGlmIHlvdSB3YW50XG4gICAgLy8gZXhwbGljaXQgY29udHJvbCBvdmVyIHdoaWNoIGluamVjdGFibGVzIGdldCByZWdpc3RlcmVkIChlLmcuIHRvIGdhdGUgdGhlbSBiZWhpbmQgYSBmbGFnKS5cbiAgICAvLyBkaS5yZWdpc3RlcihwbGFjZWhvbGRlclN0YXR1c0Jhckl0ZW1JbmplY3RhYmxlKTtcbiAgfSxcbn0pO1xuIiwgImltcG9ydCB7IGdldFBlcnNpc3RhYmxlTWFwSW5qZWN0YWJsZUJ1bmNoIH0gZnJvbSBcIkBrOHNsZW5zL3BlcnNpc3RhYmxlLWNvbnRyYWN0c1wiO1xuXG4vLyBDbHVzdGVyIGlkIC0+IHdoZXRoZXIgdGhlIHVzZXIgaGFzIGV4cGxpY2l0bHkgbWFya2VkIGl0IGFzIHByb2R1Y3Rpb24gKHRydWUpIG9yIG5vdCAoZmFsc2UpLlxuLy8gQ2x1c3RlcnMgd2l0aG91dCBhbiBlbnRyeSBmYWxsIGJhY2sgdG8gZGV0ZWN0aW9uIGJ5IG5hbWUuXG5leHBvcnQgY29uc3QgcHJvZHVjdGlvbk92ZXJyaWRlc0J1bmNoID0gZ2V0UGVyc2lzdGFibGVNYXBJbmplY3RhYmxlQnVuY2g8c3RyaW5nLCBib29sZWFuPigpKHtcbiAgaWQ6IFwicHJvZHVjdGlvbi1vdmVycmlkZXNcIixcbn0pO1xuIiwgImltcG9ydCB7IGFsbENsdXN0ZXJSZWNvcmRzUmVhY3RpdmVJbmplY3Rpb25Ub2tlbiwgdHlwZSBDbHVzdGVyUmVjb3JkIH0gZnJvbSBcIkBrOHNsZW5zL2NsdXN0ZXItY29udHJhY3RzXCI7XG5pbXBvcnQgeyBnZXRJbmplY3RhYmxlMiB9IGZyb20gXCJAazhzbGVucy9pbmplY3RhYmxlXCI7XG5pbXBvcnQgeyBhY3RpdmVUYWJDbHVzdGVySWRSZWFjdGl2ZUluamVjdGlvblRva2VuIH0gZnJvbSBcIkBrOHNsZW5zL21haW4tdmlldy1jb250cmFjdHNcIjtcbmltcG9ydCB7IGFjdGlvbiwgY29tcHV0ZWQsIHR5cGUgSUNvbXB1dGVkVmFsdWUsIG9ic2VydmFibGUsIHR5cGUgT2JzZXJ2YWJsZU1hcCB9IGZyb20gXCJtb2J4XCI7XG5pbXBvcnQgeyBpc1Byb2R1Y3Rpb25OYW1lIH0gZnJvbSBcIi4vaXMtcHJvZHVjdGlvbi1uYW1lXCI7XG5pbXBvcnQgeyBwcm9kdWN0aW9uT3ZlcnJpZGVzQnVuY2ggfSBmcm9tIFwiLi9wcm9kdWN0aW9uLW92ZXJyaWRlcy5pbmplY3RhYmxlXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWN0aXZlUHJvZHVjdGlvbkNsdXN0ZXIge1xuICByZWFkb25seSBpZDogc3RyaW5nO1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjb25zdCBwcm9kdWN0aW9uU3RhdGVJbmplY3RhYmxlID0gZ2V0SW5qZWN0YWJsZTIoe1xuICBpZDogXCJwcm9kdWN0aW9uLWNsdXN0ZXItbWFyay1zdGF0ZVwiLFxuICBjb25zdW1wdGlvbnM6IFthbGxDbHVzdGVyUmVjb3Jkc1JlYWN0aXZlSW5qZWN0aW9uVG9rZW4sIGFjdGl2ZVRhYkNsdXN0ZXJJZFJlYWN0aXZlSW5qZWN0aW9uVG9rZW5dLFxuXG4gIGluc3RhbnRpYXRlOiAoZGkpID0+IHtcbiAgICBjb25zdCBhY3RpdmVDbHVzdGVySWQgPSBkaS5pbmplY3QoYWN0aXZlVGFiQ2x1c3RlcklkUmVhY3RpdmVJbmplY3Rpb25Ub2tlbikoKTtcbiAgICBjb25zdCBvdmVycmlkZXMgPSBvYnNlcnZhYmxlLmJveDxPYnNlcnZhYmxlTWFwPHN0cmluZywgYm9vbGVhbj4gfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCwgeyBkZWVwOiBmYWxzZSB9KTtcbiAgICBjb25zdCBjbHVzdGVyUmVjb3JkcyA9IG9ic2VydmFibGUuYm94PElDb21wdXRlZFZhbHVlPENsdXN0ZXJSZWNvcmRbXT4gfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCwgeyBkZWVwOiBmYWxzZSB9KTtcblxuICAgIHZvaWQgZGkuaW5qZWN0KHByb2R1Y3Rpb25PdmVycmlkZXNCdW5jaC5wZXJzaXN0YWJsZSkoKS50aGVuKGFjdGlvbigobWFwKSA9PiBvdmVycmlkZXMuc2V0KG1hcCkpKTtcbiAgICB2b2lkIGRpLmluamVjdChhbGxDbHVzdGVyUmVjb3Jkc1JlYWN0aXZlSW5qZWN0aW9uVG9rZW4pKCkudGhlbihhY3Rpb24oKHJlY29yZHMpID0+IGNsdXN0ZXJSZWNvcmRzLnNldChyZWNvcmRzKSkpO1xuXG4gICAgY29uc3QgbmFtZU9mID0gKGNsdXN0ZXJJZDogc3RyaW5nKSA9PlxuICAgICAgY2x1c3RlclJlY29yZHMuZ2V0KCk/LmdldCgpLmZpbmQoKHJlY29yZCkgPT4gcmVjb3JkLmlkID09PSBjbHVzdGVySWQpPy5uYW1lLmdldCgpO1xuXG4gICAgY29uc3QgaXNQcm9kdWN0aW9uID0gKGNsdXN0ZXJJZDogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBvdmVycmlkZSA9IG92ZXJyaWRlcy5nZXQoKT8uZ2V0KGNsdXN0ZXJJZCk7XG5cbiAgICAgIGlmIChvdmVycmlkZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBvdmVycmlkZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbmFtZSA9IG5hbWVPZihjbHVzdGVySWQpO1xuXG4gICAgICByZXR1cm4gbmFtZSA/IGlzUHJvZHVjdGlvbk5hbWUobmFtZSkgOiBmYWxzZTtcbiAgICB9O1xuXG4gICAgY29uc3QgYWN0aXZlUHJvZHVjdGlvbkNsdXN0ZXIgPSBjb21wdXRlZCgoKTogQWN0aXZlUHJvZHVjdGlvbkNsdXN0ZXIgfCB1bmRlZmluZWQgPT4ge1xuICAgICAgY29uc3QgY2x1c3RlcklkID0gYWN0aXZlQ2x1c3RlcklkLmdldCgpO1xuXG4gICAgICBpZiAoIWNsdXN0ZXJJZCB8fCAhaXNQcm9kdWN0aW9uKGNsdXN0ZXJJZCkpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHsgaWQ6IGNsdXN0ZXJJZCwgbmFtZTogbmFtZU9mKGNsdXN0ZXJJZCkgPz8gY2x1c3RlcklkIH07XG4gICAgfSk7XG5cbiAgICBjb25zdCBzZXRQcm9kdWN0aW9uID0gYWN0aW9uKChjbHVzdGVySWQ6IHN0cmluZywgdmFsdWU6IGJvb2xlYW4pID0+IHtcbiAgICAgIG92ZXJyaWRlcy5nZXQoKT8uc2V0KGNsdXN0ZXJJZCwgdmFsdWUpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuICgpID0+ICh7XG4gICAgICBpc1Byb2R1Y3Rpb24sXG4gICAgICBhY3RpdmVQcm9kdWN0aW9uQ2x1c3RlcixcbiAgICAgIGlzQWN0aXZlQ2x1c3RlclByb2R1Y3Rpb246IGNvbXB1dGVkKCgpID0+IGFjdGl2ZVByb2R1Y3Rpb25DbHVzdGVyLmdldCgpICE9PSB1bmRlZmluZWQpLFxuICAgICAgYWN0aXZlQ2x1c3RlcklkLFxuICAgICAgdG9nZ2xlOiAoY2x1c3RlcklkOiBzdHJpbmcpID0+IHNldFByb2R1Y3Rpb24oY2x1c3RlcklkLCAhaXNQcm9kdWN0aW9uKGNsdXN0ZXJJZCkpLFxuICAgIH0pO1xuICB9LFxufSk7XG4iLCAiLy8gXCJwcm9kXCIsIFwicHJvZHVjdGlvblwiIG9yIFwicHJkXCIgYXMgYSBzZXBhcmF0ZSB3b3JkOiBtYXRjaGVzIFwicHJvZC1ldVwiLCBcIms4c19wcm9kdWN0aW9uXCIsIFwicHJkMDFcIixcbi8vIGJ1dCBub3QgXCJwcmVwcm9kXCIgb3IgXCJub25wcm9kXCIuXG5jb25zdCBwcm9kdWN0aW9uTmFtZVBhdHRlcm4gPSAvKF58W15hLXpdKShwcm9kfHByb2R1Y3Rpb258cHJkKShbXmEtel18JCkvaTtcblxuZXhwb3J0IGNvbnN0IGlzUHJvZHVjdGlvbk5hbWUgPSAobmFtZTogc3RyaW5nKSA9PiBwcm9kdWN0aW9uTmFtZVBhdHRlcm4udGVzdChuYW1lKTtcbiIsICJpbXBvcnQgeyBnZXRUb3BCYXJJdGVtSW5qZWN0YWJsZUJ1bmNoIH0gZnJvbSBcIkBrOHNsZW5zL3RvcC1iYXItY29udHJhY3RzXCI7XG5pbXBvcnQgeyB1c2VJbmplY3QgfSBmcm9tIFwiQGs4c2xlbnMvdXNlLWluamVjdFwiO1xuaW1wb3J0IHsgb2JzZXJ2ZXIgfSBmcm9tIFwibW9ieC1yZWFjdFwiO1xuaW1wb3J0IHsgY3JlYXRlUG9ydGFsIH0gZnJvbSBcInJlYWN0LWRvbVwiO1xuaW1wb3J0IHsgcHJvZHVjdGlvblN0YXRlSW5qZWN0YWJsZSB9IGZyb20gXCIuL3Byb2R1Y3Rpb24tc3RhdGUuaW5qZWN0YWJsZVwiO1xuaW1wb3J0IHN0eWxlcyBmcm9tIFwiLi9wcm9kdWN0aW9uLW92ZXJsYXkubW9kdWxlLnNjc3NcIjtcblxuLy8gVGFrZXMgbm8gcm9vbSBpbiB0aGUgdG9wIGJhcjogaXQgb25seSBob3N0cyB0aGUgd2luZG93LXdpZGUgZWRnZSwgcG9ydGFsbGVkIHRvIHRoZSBib2R5LlxuY29uc3QgUHJvZHVjdGlvbk1hcmsgPSBvYnNlcnZlcigoKSA9PiB7XG4gIGNvbnN0IGNsdXN0ZXIgPSB1c2VJbmplY3QocHJvZHVjdGlvblN0YXRlSW5qZWN0YWJsZSkoKS5hY3RpdmVQcm9kdWN0aW9uQ2x1c3Rlci5nZXQoKTtcblxuICByZXR1cm4gY2x1c3RlciA/IGNyZWF0ZVBvcnRhbCg8ZGl2IGNsYXNzTmFtZT17c3R5bGVzLmZyYW1lfSBhcmlhLWhpZGRlbiAvPiwgZG9jdW1lbnQuYm9keSkgOiBudWxsO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGdldFRvcEJhckl0ZW1JbmplY3RhYmxlQnVuY2goe1xuICBpZDogXCJwcm9kdWN0aW9uLWNsdXN0ZXItbWFyay10b3AtYmFyLWl0ZW1cIixcbiAgc2lkZTogXCJsZWZ0XCIsXG4gIG9yZGVyTnVtYmVyOiAxMDAwLFxuICBDb21wb25lbnQ6IFByb2R1Y3Rpb25NYXJrLFxufSk7XG4iLCAiaW1wb3J0IHsgYXNTdHlsZXNoZWV0IH0gZnJvbSBcIkBrOHNsZW5zL3N0eWxlc2hlZXQtY29udHJhY3RzXCI7XG5leHBvcnQgY29uc3Qgc3R5bGVzaGVldCA9IGFzU3R5bGVzaGVldCh7IGlkOiBcInByb2R1Y3Rpb24tY2x1c3Rlci1tYXJrL3NyYy9wcm9kdWN0aW9uLW92ZXJsYXkubW9kdWxlLnNjc3NcIiwgY3NzOiBcIi5wcm9kdWN0aW9uLW92ZXJsYXktbW9kdWxlX19mcmFtZV9fX05nU0JhIHtcXG4gIHBvc2l0aW9uOiBmaXhlZDtcXG4gIGluc2V0OiAwO1xcbiAgei1pbmRleDogMjE0NzQ4MzY0NjtcXG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xcbiAgYm9yZGVyOiAzcHggc29saWQgI2U1MzkzNTtcXG59XCIgfSk7XG5leHBvcnQgZGVmYXVsdCB7XCJmcmFtZVwiOlwicHJvZHVjdGlvbi1vdmVybGF5LW1vZHVsZV9fZnJhbWVfX19OZ1NCYVwifTsiLCAiaW1wb3J0IHsgZ2V0Q29tbWFuZEluamVjdGFibGVCdW5jaCB9IGZyb20gXCJAazhzbGVucy9jb21tYW5kLXBhbGV0dGUtY29udHJhY3RzXCI7XG5pbXBvcnQgeyBjb21wdXRlZCB9IGZyb20gXCJtb2J4XCI7XG5pbXBvcnQgeyBwcm9kdWN0aW9uU3RhdGVJbmplY3RhYmxlIH0gZnJvbSBcIi4vcHJvZHVjdGlvbi1zdGF0ZS5pbmplY3RhYmxlXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGdldENvbW1hbmRJbmplY3RhYmxlQnVuY2goe1xuICBpZDogXCJwcm9kdWN0aW9uLWNsdXN0ZXItbWFyay50b2dnbGUtcHJvZHVjdGlvblwiLFxuICB0aXRsZToge1xuICAgIGluc3RhbnRpYXRlOiAoZGkpID0+IHtcbiAgICAgIGNvbnN0IHN0YXRlID0gZGkuaW5qZWN0KHByb2R1Y3Rpb25TdGF0ZUluamVjdGFibGUpKCk7XG5cbiAgICAgIHJldHVybiAoKSA9PlxuICAgICAgICBjb21wdXRlZCgoKSA9PlxuICAgICAgICAgIHN0YXRlLmlzQWN0aXZlQ2x1c3RlclByb2R1Y3Rpb24uZ2V0KClcbiAgICAgICAgICAgID8gXCJQcm9kdWN0aW9uIENsdXN0ZXIgTWFyazogVW5tYXJrIHRoaXMgY2x1c3RlciBhcyBwcm9kdWN0aW9uXCJcbiAgICAgICAgICAgIDogXCJQcm9kdWN0aW9uIENsdXN0ZXIgTWFyazogTWFyayB0aGlzIGNsdXN0ZXIgYXMgcHJvZHVjdGlvblwiLFxuICAgICAgICApO1xuICAgIH0sXG4gIH0sXG4gIGlzQWN0aXZlOiB7XG4gICAgaW5zdGFudGlhdGU6IChkaSkgPT4ge1xuICAgICAgY29uc3Qgc3RhdGUgPSBkaS5pbmplY3QocHJvZHVjdGlvblN0YXRlSW5qZWN0YWJsZSkoKTtcblxuICAgICAgcmV0dXJuICgpID0+IGNvbXB1dGVkKCgpID0+IHN0YXRlLmFjdGl2ZUNsdXN0ZXJJZC5nZXQoKSAhPT0gdW5kZWZpbmVkKTtcbiAgICB9LFxuICB9LFxuICBhY3Rpb246IHtcbiAgICBpbnN0YW50aWF0ZTogKGRpKSA9PiB7XG4gICAgICBjb25zdCBzdGF0ZSA9IGRpLmluamVjdChwcm9kdWN0aW9uU3RhdGVJbmplY3RhYmxlKSgpO1xuXG4gICAgICByZXR1cm4gKCkgPT4gKCkgPT4ge1xuICAgICAgICBjb25zdCBjbHVzdGVySWQgPSBzdGF0ZS5hY3RpdmVDbHVzdGVySWQuZ2V0KCk7XG5cbiAgICAgICAgaWYgKGNsdXN0ZXJJZCkge1xuICAgICAgICAgIHN0YXRlLnRvZ2dsZShjbHVzdGVySWQpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0sXG4gIH0sXG59KTtcbiIsICJpbXBvcnQgeyBjbHVzdGVyTmF2aWdhdG9ySXRlbUtpbmQgfSBmcm9tIFwiQGs4c2xlbnMvY2x1c3Rlci1jb250cmFjdHNcIjtcbmltcG9ydCB7IERyb3BEb3duTWVudUl0ZW1Sb3cgfSBmcm9tIFwiQGs4c2xlbnMvZHJvcC1kb3duLW1lbnUtaXRlbXNcIjtcbmltcG9ydCB7XG4gIGdldE5hdmlnYXRvckl0ZW1NZW51SXRlbUluamVjdGFibGVCdW5jaCxcbiAgbmF2aWdhdG9ySXRlbURyb3BEb3duTWVudU9yZGVyTnVtYmVycyxcbiAgdHlwZSBOYXZpZ2F0b3JJdGVtT2ZLaW5kLFxufSBmcm9tIFwiQGs4c2xlbnMvbmF2aWdhdG9yLWNvbnRyYWN0c1wiO1xuaW1wb3J0IHsgdXNlSW5qZWN0IH0gZnJvbSBcIkBrOHNsZW5zL3VzZS1pbmplY3RcIjtcbmltcG9ydCB7IG9ic2VydmVyIH0gZnJvbSBcIm1vYngtcmVhY3RcIjtcbmltcG9ydCB7IHByb2R1Y3Rpb25TdGF0ZUluamVjdGFibGUgfSBmcm9tIFwiLi9wcm9kdWN0aW9uLXN0YXRlLmluamVjdGFibGVcIjtcblxuY29uc3QgVG9nZ2xlUHJvZHVjdGlvbiA9IG9ic2VydmVyKCh7IGRhdGEgfTogeyBkYXRhOiBOYXZpZ2F0b3JJdGVtT2ZLaW5kPHR5cGVvZiBjbHVzdGVyTmF2aWdhdG9ySXRlbUtpbmQ+IH0pID0+IHtcbiAgY29uc3Qgc3RhdGUgPSB1c2VJbmplY3QocHJvZHVjdGlvblN0YXRlSW5qZWN0YWJsZSkoKTtcbiAgY29uc3QgY2x1c3RlcklkID0gZGF0YS5pZHNbZGF0YS5pZHMubGVuZ3RoIC0gMV07XG5cbiAgcmV0dXJuIChcbiAgICA8RHJvcERvd25NZW51SXRlbVJvdyAkb25DbGljaz17KCkgPT4gc3RhdGUudG9nZ2xlKGNsdXN0ZXJJZCl9PlxuICAgICAge3N0YXRlLmlzUHJvZHVjdGlvbihjbHVzdGVySWQpID8gXCJVbm1hcmsgYXMgcHJvZHVjdGlvblwiIDogXCJNYXJrIGFzIHByb2R1Y3Rpb25cIn1cbiAgICA8L0Ryb3BEb3duTWVudUl0ZW1Sb3c+XG4gICk7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgZ2V0TmF2aWdhdG9ySXRlbU1lbnVJdGVtSW5qZWN0YWJsZUJ1bmNoKHtcbiAgaWQ6IFwicHJvZHVjdGlvbi1jbHVzdGVyLW1hcmstdG9nZ2xlLXByb2R1Y3Rpb25cIixcbiAgZm9ySXRlbXNPZktpbmQ6IGNsdXN0ZXJOYXZpZ2F0b3JJdGVtS2luZCxcbiAgb3JkZXJOdW1iZXI6IG5hdmlnYXRvckl0ZW1Ecm9wRG93bk1lbnVPcmRlck51bWJlcnMuc2VjdGlvbkVuZCArIDEwMCxcbiAgQ29tcG9uZW50OiBUb2dnbGVQcm9kdWN0aW9uLFxufSk7XG4iLCAiaW1wb3J0ICogYXMgbW9kdWxlMCBmcm9tICcuL3Byb2R1Y3Rpb24tb3ZlcnJpZGVzLmluamVjdGFibGUudHMnO2ltcG9ydCAqIGFzIG1vZHVsZTEgZnJvbSAnLi9wcm9kdWN0aW9uLXN0YXRlLmluamVjdGFibGUudHMnO2ltcG9ydCAqIGFzIG1vZHVsZTIgZnJvbSAnLi9wcm9kdWN0aW9uLXRvcC1iYXItaXRlbS5pbmplY3RhYmxlLnRzeCc7aW1wb3J0ICogYXMgbW9kdWxlMyBmcm9tICcuL3RvZ2dsZS1wcm9kdWN0aW9uLWNvbW1hbmQuaW5qZWN0YWJsZS50cyc7aW1wb3J0ICogYXMgbW9kdWxlNCBmcm9tICcuL3RvZ2dsZS1wcm9kdWN0aW9uLW1lbnUtaXRlbS5pbmplY3RhYmxlLnRzeCdcblxuY29uc3QgbW9kdWxlcyA9IFttb2R1bGUwLG1vZHVsZTEsbW9kdWxlMixtb2R1bGUzLG1vZHVsZTRdO1xuXG5leHBvcnQgZGVmYXVsdCBtb2R1bGVzO1xuZXhwb3J0IGNvbnN0IGZpbGVuYW1lcyA9IFsncHJvZHVjdGlvbi1vdmVycmlkZXMuaW5qZWN0YWJsZS50cycsJ3Byb2R1Y3Rpb24tc3RhdGUuaW5qZWN0YWJsZS50cycsJ3Byb2R1Y3Rpb24tdG9wLWJhci1pdGVtLmluamVjdGFibGUudHN4JywndG9nZ2xlLXByb2R1Y3Rpb24tY29tbWFuZC5pbmplY3RhYmxlLnRzJywndG9nZ2xlLXByb2R1Y3Rpb24tbWVudS1pdGVtLmluamVjdGFibGUudHN4J11cbiIsICJpbXBvcnQgKiBhcyBtb2R1bGUwIGZyb20gJy4vcHJvZHVjdGlvbi1vdmVybGF5Lm1vZHVsZS5zY3NzJ1xuXG5jb25zdCBtb2R1bGVzID0gW21vZHVsZTBdO1xuXG5leHBvcnQgZGVmYXVsdCBtb2R1bGVzO1xuZXhwb3J0IGNvbnN0IGZpbGVuYW1lcyA9IFsncHJvZHVjdGlvbi1vdmVybGF5Lm1vZHVsZS5zY3NzJ11cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLDBCQUEyRDs7O0FDQTNEO0FBQUE7QUFBQTtBQUFBO0FBQUEsbUNBQWlEO0FBSTFDLElBQU0sK0JBQTJCLCtEQUFrRCxFQUFFO0FBQUEsRUFDMUYsSUFBSTtBQUNOLENBQUM7OztBQ05EO0FBQUE7QUFBQTtBQUFBO0FBQUEsK0JBQTRFO0FBQzVFLHdCQUErQjtBQUMvQixpQ0FBeUQ7QUFDekQsa0JBQXNGOzs7QUNEdEYsSUFBTSx3QkFBd0I7QUFF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RCxJQUFPLHFEQUFRLG9FQUF3QztBQUFBLEVBQ3JELElBQUk7QUFBQSxFQUNKLGdCQUFnQjtBQUFBLEVBQ2hCLGFBQWEsaUVBQXNDLGFBQWE7QUFBQSxFQUNoRSxXQUFXO0FBQ2IsQ0FBQzs7O0FDekJELElBQU0sVUFBVSxDQUFDLHlDQUFRLHFDQUFRLDRDQUFRLDhDQUFRLDhDQUFPO0FBRXhELElBQU8sK0NBQVE7OztBQ0ZmLElBQU1DLFdBQVUsQ0FBQyxpQ0FBTztBQUV4QixJQUFPLCtDQUFRQTs7O0FUQ1IsSUFBTSxtQ0FBK0IsZ0NBQVc7QUFBQSxFQUNyRCxJQUFJO0FBQUEsRUFDSixVQUFVLENBQUMsT0FBTztBQU9oQiw0REFBK0IsSUFBSSxDQUFDLEdBQUcsOENBQXdCLEdBQUcsNENBQVcsQ0FBQztBQUFBLEVBS2hGO0FBQ0YsQ0FBQzsiLAogICJuYW1lcyI6IFsiaW1wb3J0X21vYngiLCAiaW1wb3J0X2NsdXN0ZXJfY29udHJhY3RzIiwgImltcG9ydF91c2VfaW5qZWN0IiwgImltcG9ydF9tb2J4X3JlYWN0IiwgImltcG9ydF9qc3hfcnVudGltZSIsICJtb2R1bGVzIl0KfQo=
|
package/package.json
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "production-cluster-mark",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Draws a red edge around the Lens window while you work in a production cluster, so you always know you are in production.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"author": "Yalton Ruiz",
|
|
7
|
+
"keywords": [
|
|
8
|
+
"lens-extension"
|
|
9
|
+
],
|
|
10
|
+
"type": "commonjs",
|
|
11
|
+
"main": "./dist/index.js",
|
|
12
|
+
"files": [
|
|
13
|
+
"dist",
|
|
14
|
+
"assets",
|
|
15
|
+
"README.md",
|
|
16
|
+
"CHANGELOG.md",
|
|
17
|
+
"LICENSE"
|
|
18
|
+
],
|
|
19
|
+
"lensExtension": {
|
|
20
|
+
"icon": "assets/icon.svg",
|
|
21
|
+
"banner": "assets/banner.svg"
|
|
22
|
+
},
|
|
23
|
+
"scripts": {
|
|
24
|
+
"build": "lens-types-check && lens-package-build --entry-point ./src/index.ts",
|
|
25
|
+
"clean": "rimraf dist/"
|
|
26
|
+
},
|
|
27
|
+
"dependencies": {
|
|
28
|
+
"@k8slens/cluster-contracts": "^2.1.2",
|
|
29
|
+
"@k8slens/command-palette-contracts": "^1.0.2",
|
|
30
|
+
"@k8slens/drop-down-menu-items": "^1.1.3",
|
|
31
|
+
"@k8slens/element-components": "^3.9.0",
|
|
32
|
+
"@k8slens/feature-core": "^7.5.2",
|
|
33
|
+
"@k8slens/icon": "^4.0.0",
|
|
34
|
+
"@k8slens/injectable": "^26.2.1",
|
|
35
|
+
"@k8slens/main-view-contracts": "^1.3.2",
|
|
36
|
+
"@k8slens/navigator-contracts": "^2.0.2",
|
|
37
|
+
"@k8slens/notifications-contracts": "^1.0.2",
|
|
38
|
+
"@k8slens/persistable-contracts": "^1.0.2",
|
|
39
|
+
"@k8slens/status-bar-contracts": "^1.0.2",
|
|
40
|
+
"@k8slens/stylesheet-contracts": "^1.0.0",
|
|
41
|
+
"@k8slens/top-bar-contracts": "^1.0.2",
|
|
42
|
+
"@k8slens/use-inject": "^1.0.2",
|
|
43
|
+
"mobx": "^6.15.0",
|
|
44
|
+
"mobx-react": "^9.2.1",
|
|
45
|
+
"react": "^19.2.0",
|
|
46
|
+
"react-dom": "^19.2.0"
|
|
47
|
+
},
|
|
48
|
+
"devDependencies": {
|
|
49
|
+
"@k8slens/package-build": "^3.0.0",
|
|
50
|
+
"@k8slens/typescript": "^8.0.0",
|
|
51
|
+
"@types/react": "^19.2.0",
|
|
52
|
+
"@types/react-dom": "^19.3.0",
|
|
53
|
+
"rimraf": "^4.4.1"
|
|
54
|
+
}
|
|
55
|
+
}
|