diff --git a/Resources/CSS/popup.css b/Resources/CSS/popup.css
index c5058af..27e831f 100644
--- a/Resources/CSS/popup.css
+++ b/Resources/CSS/popup.css
@@ -39,7 +39,7 @@ nav {
flex: 1;
vertical-align: middle;
text-align: right;
- padding: 8px 8px 0 0;
+ padding: 9px 9px 0 0;
}
.title {
diff --git a/Resources/HTML/options.html b/Resources/HTML/options.html
index bad1b1e..b08103b 100644
--- a/Resources/HTML/options.html
+++ b/Resources/HTML/options.html
@@ -87,6 +87,9 @@
seconds
+
+
+ Set it 0 or leave it empty to disable
diff --git a/Resources/HTML/popup.html b/Resources/HTML/popup.html
index 1c09062..5780137 100644
--- a/Resources/HTML/popup.html
+++ b/Resources/HTML/popup.html
@@ -77,6 +77,9 @@
Options
seconds
+
+
+ Set it 0 or leave it empty to disable
diff --git a/Resources/JavaScript/content.js b/Resources/JavaScript/content.js
index a6ff5ab..e1bde96 100644
--- a/Resources/JavaScript/content.js
+++ b/Resources/JavaScript/content.js
@@ -374,6 +374,14 @@ chrome.runtime.onMessage.addListener(function(message, sender, sendResponse) {
break;
}
}
+ if(options.hideonhover != "" && options.hideonhover){
+ document.getElementById(containerId).addEventListener("mouseover", function(event){
+ document.getElementById(containerId).style.display = 'none';
+ setTimeout(function() {
+ document.getElementById(containerId).style.display = 'block';
+ }, options.hideonhover * 1000);
+ });
+ }
requestIds.forEach(function(requestId) {
// Render a request only once.
diff --git a/Resources/JavaScript/library.js b/Resources/JavaScript/library.js
index 0559761..f43687c 100644
--- a/Resources/JavaScript/library.js
+++ b/Resources/JavaScript/library.js
@@ -660,6 +660,7 @@ function restoreOptions() {
timeout: result.timeout ? result.timeout : 3,
hidePanelAfterTimeout: isDefined(result.hidePanelAfterTimeout) ? result.hidePanelAfterTimeout : true,
renderMode: result.renderMode ? result.renderMode : 'microMode',
+ hideonhover: result.hideonhover ?? null,
hiddenRequestHeaders: result.hiddenRequestHeaders ? result.hiddenRequestHeaders.map(item => item.toLowerCase()) : [],
hiddenResponseHeaders: result.hiddenResponseHeaders ? result.hiddenResponseHeaders.map(item => item.toLowerCase()) : [],
shownResponseHeaders: result.shownResponseHeaders ? result.shownResponseHeaders.map(item => item.toLowerCase()) : ['^server$'],
@@ -681,6 +682,7 @@ function restoreOptions() {
timeout: localStorage.timeout ? localStorage.timeout : 3,
hidePanelAfterTimeout: isDefined(localStorage.hidePanelAfterTimeout) ? localStorage.hidePanelAfterTimeout : true,
renderMode: localStorage.renderMode ? localStorage.renderMode : 'microMode',
+ hideonhover: localStorage.hideonhover ?? null,
hiddenRequestHeaders: isDefined(localStorage.hiddenRequestHeaders) ? JSON.parse(localStorage.hiddenRequestHeaders).map(item => item.toLowerCase()) : [],
hiddenResponseHeaders: isDefined(localStorage.hiddenResponseHeaders) ? JSON.parse(localStorage.hiddenResponseHeaders).map(item => item.toLowerCase()) : [],
shownResponseHeaders: isDefined(localStorage.shownResponseHeaders) ? JSON.parse(localStorage.shownResponseHeaders).map(item => item.toLowerCase()) : ['^Server$'],
diff --git a/Resources/JavaScript/options.js b/Resources/JavaScript/options.js
index 33fd94a..642c185 100644
--- a/Resources/JavaScript/options.js
+++ b/Resources/JavaScript/options.js
@@ -13,7 +13,8 @@ document.addEventListener('DOMContentLoaded', function() {
timeout: document.getElementById('timeout').value,
hidePanelAfterTimeout: parseInt(document.getElementById('hidePanelAfterTimeout').value, 10) === 1,
renderMode: document.getElementById('renderMode').value,
- theme: document.getElementById('theme').value
+ theme: document.getElementById('theme').value,
+ hideonhover: document.getElementById('hideonhover').value
};
multiSelectFields.forEach(function(fieldId) {
@@ -37,6 +38,7 @@ document.addEventListener('DOMContentLoaded', function() {
localStorage.hidePanelAfterTimeout = parseInt(document.getElementById('hidePanelAfterTimeout').value, 10) === 1;
localStorage.renderMode = document.getElementById('renderMode').value;
localStorage.theme = document.getElementById('theme').value;
+ localStorage.hideonhover = document.getElementById('hideonhover').value;
multiSelectFields.forEach(function(fieldId) {
localStorage[fieldId] = JSON.stringify(updatedValues[fieldId]);
@@ -91,6 +93,7 @@ document.addEventListener('DOMContentLoaded', function() {
theme: result.theme ? result.theme : 'light',
tabRequestLimit: result.tabRequestLimit ? result.tabRequestLimit : 25,
timeout: result.timeout ? result.timeout : 3,
+ hideonhover: result.hideonhover ?? null,
hidePanelAfterTimeout: isDefined(result.hidePanelAfterTimeout) ? result.hidePanelAfterTimeout : true,
renderMode: result.renderMode ? result.renderMode : 'microMode',
hiddenRequestHeaders: result.hiddenRequestHeaders ? result.hiddenRequestHeaders : [],
@@ -106,6 +109,7 @@ document.addEventListener('DOMContentLoaded', function() {
theme: localStorage.theme ? localStorage.theme : 'light',
tabRequestLimit: localStorage.tabRequestLimit ? localStorage.tabRequestLimit : 25,
timeout: localStorage.timeout ? localStorage.timeout : 3,
+ hideonhover: localStorage.hideonhover ?? null,
hidePanelAfterTimeout: isDefined(localStorage.hidePanelAfterTimeout) ? localStorage.hidePanelAfterTimeout : true,
renderMode: localStorage.renderMode ? localStorage.renderMode : 'microMode',
hiddenRequestHeaders: isDefined(localStorage.hiddenRequestHeaders) ? JSON.parse(localStorage.hiddenRequestHeaders) : [],
@@ -124,6 +128,7 @@ document.addEventListener('DOMContentLoaded', function() {
document.getElementById('hidePanelAfterTimeout').value = options.hidePanelAfterTimeout ? 1 : 0;
document.getElementById('renderMode').value = options.renderMode;
document.getElementById('theme').value = options.theme;
+ document.getElementById('hideonhover').value = options.hideonhover;
options.hiddenRequestHeaders.forEach(function(element) {
addElement(element, 'newHiddenRequestHeader', 'hiddenRequestHeaders');
@@ -157,6 +162,9 @@ document.addEventListener('DOMContentLoaded', function() {
document.getElementById('theme').addEventListener('change', function() {
saveOptions();
});
+ document.getElementById('hideonhover').addEventListener('keyup', function() {
+ saveOptions();
+ });
let multiSelectFields = {
'hiddenRequestHeaders': {addId: 'addHiddenRequestHeader', newId: 'newHiddenRequestHeader'},
diff --git a/_locales/en/messages.json b/_locales/en/messages.json
index dc3dd93..045ec7b 100644
--- a/_locales/en/messages.json
+++ b/_locales/en/messages.json
@@ -386,5 +386,13 @@
"contentMessagesProEnableResponseTimes": {
"description": "enable response times",
"message": "enable response times"
+ },
+ "hideonhover": {
+ "description": "Hide on hover for",
+ "message": "Hide on hover for"
+ },
+ "hideonhovernote": {
+ "description": "leave it empty to disable",
+ "message": "leave it empty to disable"
}
}
diff --git a/assets/css/content.css b/assets/css/content.css
new file mode 100644
index 0000000..d0db696
--- /dev/null
+++ b/assets/css/content.css
@@ -0,0 +1,767 @@
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ * {
+ float: none;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .normalMode,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .microMode {
+ border: 0;
+ letter-spacing: initial;
+ -webkit-font-smoothing: initial;
+ -moz-osx-font-smoothing: initial;
+ font-size: 11px !important;
+ line-height: 13px !important;
+ font-family: 'Lucida Grande', 'Helvetica Neue', Helvetica, Arial, sans-serif !important;
+ height: auto;
+ margin: 0;
+ padding: 0;
+ text-align: left;
+ text-shadow: none;
+ visibility: visible;
+ white-space: nowrap;
+ max-height: 100%;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ a,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ div,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ details,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ summary,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ input,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ label,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ p,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ p:hover,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ mark,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ mark:hover,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ table,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ span,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ span:hover,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ td,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ td:hover,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ tr,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ tr:hover {
+ background: transparent none;
+ border: 0;
+ box-shadow: none;
+ cursor: text;
+ flex-direction: row;
+ font-size: 11px !important;
+ font-weight: normal;
+ font-style: normal;
+ height: inherit;
+ line-height: 13px !important;
+ font-family: 'Lucida Grande', 'Helvetica Neue', Helvetica, Arial, sans-serif !important;
+ margin: 0;
+ min-height: inherit;
+ outline: none;
+ padding: 0;
+ position: relative;
+ text-align: left;
+ text-shadow: none;
+ text-transform: none;
+ transform: none;
+ vertical-align: top;
+ visibility: visible;
+ white-space: nowrap;
+ width: auto;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ {
+ box-sizing: border-box;
+ display: block;
+ overflow-y: auto;
+ overflow-x: visible;
+ position: fixed;
+ z-index: 2147483646;
+ min-width: 350px;
+ top: auto !important;
+ right: auto !important;
+ bottom: auto !important;
+ left: auto !important;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ.topLeft[open],
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ.topRight[open] {
+ padding-top: 30px;
+ animation: fadeIn 500ms;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ.bottomLeft[open],
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ.bottomRight[open] {
+ padding-bottom: 30px;
+ animation: fadeIn 500ms;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ.topLeft[open] #toolBar,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ.topRight[open] #toolBar {
+ top: 0;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ.bottomLeft[open] #toolBar.microMode,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ.bottomRight[open] #toolBar.microMode {
+ bottom: 0;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ.topLeft[open] #toolBar.microMode,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ.bottomLeft[open] #toolBar.microMode {
+ left: 0;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ.topRight[open] #toolBar.microMode,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ.bottomRight[open] #toolBar.microMode {
+ right: 0;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ.topLeft .microMode,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ.topRight .microMode {
+ margin-top: -1px;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ.bottomLeft .microMode,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ.bottomRight .microMode {
+ margin-bottom: -1px;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ.topLeft {
+ top: 0.5em !important;
+ left: 0.5em !important;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ.bottomLeft {
+ bottom: 0.5em !important;
+ left: 0.5em !important;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ.topRight {
+ top: 0.5em !important;
+ right: 0.5em !important;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ.bottomRight {
+ bottom: 0.5em !important;
+ right: 0.5em !important;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ.noMargin.topLeft {
+ top: 0 !important;
+ left: 0 !important;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ.noMargin.bottomLeft {
+ bottom: 0 !important;
+ left: 0 !important;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ.noMargin.topRight {
+ top: 0 !important;
+ right: 0 !important;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ.noMargin.bottomRight {
+ bottom: 0 !important;
+ right: 0 !important;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ div {
+ display: block;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ summary:before {
+ display: none;
+ color: inherit;
+ font-size: inherit;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ summary::-webkit-details-marker {
+ display: inherit;
+}
+
+/*#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ div {*/
+/*border: 1px solid #af0000 !important;*/
+/*}*/
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ p,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ p:hover {
+ padding: 1px 0;
+ font-size: 1em;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ table {
+ width: 100%;
+ border-collapse: collapse;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ mark,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ mark:hover {
+ color: rgb(50, 50, 50);
+ background-color: rgba(255, 238, 34, 0.9);
+ padding: 0 2px;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ input {
+ -webkit-appearance: textfield;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ label {
+ cursor: pointer;
+ display: inline;
+ height: inherit;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ input[type=checkbox] {
+ -webkit-appearance: checkbox;
+ cursor: pointer;
+ display: inline;
+ height: inherit;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .noSelect {
+ -moz-user-select: none;
+ user-select: none;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ ::-moz-selection {
+ text-shadow: none;
+ color: #f7f7f7;
+ background-color: #ff9640;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ ::selection {
+ text-shadow: none;
+ color: #f7f7f7;
+ background-color: #ff9640;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .separator {
+ margin: 4px 0;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ #toolBar {
+ position: fixed;
+ top: inherit;
+ right: inherit;
+ bottom: inherit;
+ left: inherit;
+ padding: 2px;
+ z-index: 2147483647;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .thankYou {
+ color: #cc0000;
+ padding-right: 0.5rem;
+ padding-left: 2px;
+ padding-top: 2px;
+ cursor: pointer;
+ text-decoration: none;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .eye {
+ cursor: pointer;
+ height: 24px;
+ width: 100%;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ.topRight .eye,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ.bottomRight .eye {
+ text-align: right;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ.topLeft .eye,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ.bottomLeft .eye {
+ text-align: left;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .eye svg {
+ padding-right: 0.5em;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .eye:after,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .eye:before {
+ display: none;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .eye::-webkit-details-marker {
+ display: none;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .eye::details-marker {
+ display: none;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .eye svg path {
+ fill: rgba(34, 34, 34, 0.76);
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .eye:hover svg path {
+ animation: attentionHover 250ms ease-in;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ #toolBar.microMode {
+ min-width: 350px;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .toolBar {
+ /*position: fixed;*/
+ /*bottom: 0;*/
+ width: 100%;
+ display: flex;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .toolBar .requestTypes {
+ flex: 1;
+ text-align: right;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ #toolBar .button,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .toolBar .requestTypes div.type {
+ cursor: pointer;
+ display: inline-block;
+ border: 1px solid;
+ border-radius: 3px;
+ font-size: 14px;
+ font-weight: 400;
+ line-height: 1;
+ padding: 2px 7px;
+ margin: 0 0 0 0.5em;
+ text-align: left;
+ text-decoration: none;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .toolBar .requestTypes div.type.active {
+ font-weight: bold;
+ animation: activated 1500ms;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ #toolBar .button {
+ box-sizing: border-box;
+ margin: 0;
+ width: 100%;
+ text-align: center;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .toolBar input {
+ outline: none;
+ display: inline-block;
+ margin-right: 0.5em;
+ min-height: auto;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .toolBar .filter {
+ padding-top: 2px;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ #inlineFilterInput {
+ border: 1px solid;
+ padding: 0 2px;
+ box-sizing: border-box;
+ color: #333;
+ background-color: whitesmoke;
+ width: 130px;
+ border-radius: 2px;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ input::-webkit-input-placeholder { /* Chrome */
+ color: rgb(119, 119, 119);
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ input:-ms-input-placeholder { /* IE 10+ */
+ color: rgb(119, 119, 119);
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ input::-moz-placeholder { /* Firefox 19+ */
+ color: rgb(119, 119, 119);
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ input:-moz-placeholder { /* Firefox 4 - 18 */
+ color: rgb(119, 119, 119);
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ td,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ td:hover {
+ overflow-x: hidden;
+ text-overflow: ellipsis;
+ padding: 1px 4px 1px 0;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .normalMode {
+ border-radius: 2px;
+ box-sizing: border-box;
+ display: block;
+ margin-top: 0.5em;
+ padding: 0.5em;
+ position: relative;
+ width: 550px;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .microMode {
+ border-radius: 2px;
+ box-sizing: border-box;
+ display: block;
+ padding: 1px 4em 1px 3px;
+ position: relative;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .fadeOut {
+ animation: fadeOut 500ms forwards;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .fadeOutFast {
+ animation: fadeOut 0.3s forwards;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .attention {
+ animation: attention 2000ms ease-in;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .teaser {
+ animation: attention 2000ms ease-in;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ #toolBar .teaser {
+ padding: 2px;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .teaser a {
+ cursor: pointer;
+ text-decoration: none;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .teaser a:hover {
+ text-decoration: underline;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .ttcOk {
+ animation: ttcOk 1500ms ease-in;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .ttcOk:hover {
+ animation: ttcOkHover 1500ms ease-in;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .ttcMeh {
+ animation: ttcMeh 1500ms ease-in;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .ttcMeh:hover {
+ animation: ttcMehHover 1500ms ease-in;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .ttcOhOh {
+ animation: ttcOhOh 1500ms ease-in;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .ttcOhOh:hover {
+ animation: ttcOhOhHover 1500ms ease-in;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ td.key {
+ box-sizing: border-box;
+ width: 130px;
+ max-width: 130px;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ td.value {
+ box-sizing: border-box;
+ max-width: 390px;
+ width: 390px;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .value span,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .key span {
+ color: inherit;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ a.location,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .sectionTitle {
+ display: inline-block;
+ max-width: 470px;
+ margin-right: 22px;
+ overflow-x: hidden;
+ font-weight: normal;
+ text-decoration: none;
+ text-overflow: ellipsis;
+ padding: 2px 0 3px 0;
+ position: relative;
+ white-space: nowrap;
+ z-index: 1;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .sectionTitle:focus {
+ outline: none;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .microMode span {
+ display: inline-block;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .url {
+ margin-bottom: 2px;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .microMode .url {
+ margin: 0;
+ display: inline-block;
+ padding: 0;
+ font-weight: normal;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .sectionTitle:hover,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .location:hover {
+ text-decoration: underline;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .sectionCookieTitle {
+ text-align: right;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .sectionTitle {
+ font-weight: bold;
+ cursor: pointer;
+ text-decoration: none;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ a.location,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ a.location:hover {
+ border: none;
+ margin-left: 0.5em;
+ padding: 0;
+ cursor: pointer;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .cutoff {
+ display: block;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .closeButton {
+ cursor: pointer;
+ position: absolute;
+ top: 4px;
+ right: 8px;
+ font-size: 13px !important;
+ text-align: right;
+ width: 25px;
+ height: 25px;
+ z-index: 1;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .hidden {
+ display: none;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .visible {
+ /*transition: opacity 0.4s cubic-bezier(0.22, 0.61, 0.36, 1);*/
+ position: relative;
+ z-index: 1;
+ visibility: visible;
+ overflow: inherit;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ [data-request-type]:after {
+ font-size: 5em;
+ font-weight: bold;
+ opacity: 0.1;
+ display: inline-block;
+ position: absolute;
+ top: 0.75em;
+ right: 0.5em;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .microMode[data-request-type]:after {
+ font-size: 1em;
+ font-weight: bold;
+ opacity: 0.5;
+ display: inline-block;
+ position: absolute;
+ top: 0;
+ right: 4px;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .visible[data-request-type]:after {
+ animation: attention 500ms ease-in;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .visible[data-request-type]:hover:after {
+ animation: attentionHover 250ms ease-in;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ [data-request-type="main_frame"]:after {
+ content: '__MSG_contentMessagesRequestTypeDoc__';
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ [data-request-type="sub_frame"]:after {
+ content: '__MSG_contentMessagesRequestTypeFrame__';
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ [data-request-type="xmlhttprequest"]:after {
+ content: '__MSG_contentMessagesRequestTypeXhr__';
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .downPointingTriangleRightSide:after {
+ content: '\25bc'; /* ▼ */
+ font-size: 9px;
+ width: 13px;
+ display: inline-block;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .leftPointingTriangle:after {
+ content: '\25c0'; /* ◀ */
+ font-size: 9px;
+ width: 13px;
+ display: inline-block;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .rightPointingTriangle:before {
+ content: '\25b6'; /* ▶ */
+ font-size: 9px;
+ width: 13px;
+ display: inline-block;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .status {
+ display: inline-block;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .status:before {
+ display: inline-block;
+ font-size: 12px;
+ width: 14px;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .status2xx:before {
+ color: #00aa00;
+ content: '\2714'; /* ✔ */
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .status3xx:before {
+ color: #ff7800;
+ content: '\279c'; /* ➜ */
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .status4xx:before {
+ color: #c60000;
+ content: '\2716'; /* ✖ */
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .status5xx:before {
+ color: #c60000;
+ content: '\2716'; /* ✖ */
+}
+
+@keyframes fadeIn {
+ from {
+ opacity: 0;
+ }
+ to {
+ opacity: 1;
+ }
+}
+
+@keyframes fadeOut {
+ from {
+ opacity: 1;
+ }
+ to {
+ opacity: 0;
+ }
+}
+
+@keyframes activated {
+ from {
+ background-color: rgba(0, 135, 0, 0.25);
+ color: #008700;
+ }
+ to {
+ background-color: inherit;
+ color: inherit;
+ }
+}
+
+@keyframes attention {
+ from {
+ color: #ff7800;
+ }
+ to {
+ color: inherit;
+ }
+}
+
+@keyframes attentionHover {
+ from {
+ fill: #ff7800;
+ color: #ff7800;
+ }
+ to {
+ fill: inherit;
+ color: inherit;
+ }
+}
+
+@keyframes attentionBackground {
+ from {
+ background-position: 100% 0;
+ }
+ to {
+ background-position: 50% 0;
+ }
+}
+
+@keyframes ttcOk {
+ from {
+ color: #008700;
+ }
+ to {
+ color: inherit;
+ }
+}
+
+@keyframes ttcOkHover {
+ from {
+ color: #008700;
+ }
+ to {
+ color: inherit;
+ }
+}
+
+@keyframes ttcMeh {
+ from {
+ color: #ff7800;
+ }
+ to {
+ color: inherit;
+ }
+}
+
+@keyframes ttcMehHover {
+ from {
+ color: #ff7800;
+ }
+ to {
+ color: inherit;
+ }
+}
+
+@keyframes ttcOhOh {
+ from {
+ color: #c60000;
+ }
+ to {
+ color: inherit;
+ }
+}
+
+@keyframes ttcOhOhHover {
+ from {
+ color: #c60000;
+ }
+ to {
+ color: inherit;
+ }
+}
+
+@media print {
+ #httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ {
+ display: none;
+ }
+}
diff --git a/assets/css/contentDark.css b/assets/css/contentDark.css
new file mode 100644
index 0000000..0e2a2aa
--- /dev/null
+++ b/assets/css/contentDark.css
@@ -0,0 +1,67 @@
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ div,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ label,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ span,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ p,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .normalMode,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .microMode,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .value,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .location,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .sectionTitle,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .button:hover,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .closeButton:hover,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .toolBar .requestTypes .type:hover,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .toolBar .requestTypes .type.active,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ tr:hover .key {
+ transition: color 75ms;
+ color: #ddd;
+ border-color: #ddd;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .button,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .closeButton,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .key,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .location:hover,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .sectionTitle:hover,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .downPointingTriangle:before,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .rightPointingTriangle:before,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .toolBar .requestTypes .type,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .toolBar .requestTypes .type.active:hover,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ tr:hover .value {
+ transition: color 75ms;
+ color: #bbb;
+ border-color: #bbb;
+ cursor: pointer;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .cookieTable:not(:first-child) {
+ border-top: 1px dotted #777;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .separator {
+ border-top: 1px solid #777;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .normalMode {
+ background: rgba(20, 20, 20, 0.85);
+ border: 1px solid #777;
+ box-shadow: 0 1px 2px 1px rgba(0, 0, 0, 0.26);
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .microMode {
+ background: rgba(20, 20, 20, 0.85);
+ border: 1px solid #777;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .toolBar .requestTypes .type,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ #inlineFilterInput {
+ border-color: #777;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ #toolBar {
+ background: rgba(20, 20, 20, 0.85);
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .toolBar .requestTypes .type.active {
+ background: rgba(20, 20, 20, 0.85);
+}
diff --git a/assets/css/contentLight.css b/assets/css/contentLight.css
new file mode 100644
index 0000000..ee49f38
--- /dev/null
+++ b/assets/css/contentLight.css
@@ -0,0 +1,67 @@
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ div,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ label,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ span,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ p,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .normalMode,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .microMode,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .value,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .location,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .sectionTitle,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .button:hover,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .closeButton:hover,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .toolBar .requestTypes .type:hover,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .toolBar .requestTypes .type.active,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ tr:hover .key {
+ transition: color 75ms;
+ color: rgb(50, 50, 50);
+ border-color: rgb(50, 50, 50);
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .button,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .closeButton,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .key,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .location:hover,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .sectionTitle:hover,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .downPointingTriangle:before,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .rightPointingTriangle:before,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .toolBar .requestTypes .type,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .toolBar .requestTypes .type.active:hover,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ tr:hover .value {
+ transition: color 75ms;
+ color: rgb(130, 130, 130);
+ border-color: rgb(130, 130, 130);
+ cursor: pointer;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .cookieTable:not(:first-child) {
+ border-top: 1px dotted #b3b3b3;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .separator {
+ border-top: 1px solid #b3b3b3;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .normalMode {
+ background: rgba(221, 221, 221, 0.95);
+ border: 1px solid #b3b3b3;
+ box-shadow: 0 1px 2px 1px rgba(0, 0, 0, 0.26);
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .microMode {
+ background: rgba(221, 221, 221, 0.95);
+ border: 1px solid #b3b3b3;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .toolBar .requestTypes .type,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ #inlineFilterInput {
+ border-color: #b3b3b3;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ #toolBar {
+ background: rgba(221, 221, 221, 0.95);
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .toolBar .requestTypes .type.active {
+ background: rgba(130, 130, 130, 0.3);
+}
diff --git a/assets/css/options.css b/assets/css/options.css
new file mode 100644
index 0000000..153a4df
--- /dev/null
+++ b/assets/css/options.css
@@ -0,0 +1,395 @@
+html body.chromeOptionBody {
+ min-width: 700px;
+ padding: 1em;
+}
+
+html body.chromeOptionBody label.radio span {
+ margin-left: 0.5em;
+}
+
+html.changing-content body {
+ -webkit-transition: -webkit-transform 100ms;
+}
+
+ul {
+ list-style-type: none;
+ padding: 0;
+}
+
+li:hover {
+ color: #777;
+}
+
+p .inlineicon {
+ vertical-align: middle;
+}
+
+#navigation a.active {
+ -webkit-border-start-color: rgb(78, 87, 100);
+ cursor: default;
+}
+
+#helpNavItem {
+ margin-top: 27px;
+}
+
+#navigation li {
+ line-height: 17px;
+ margin: 6px 0;
+ padding-right: 1.5em;
+ display: inline-block;
+}
+
+#navigation a {
+ display: block;
+ background-color: white;
+ color: #999;
+ cursor: pointer;
+ font: inherit;
+ line-height: 17px;
+ padding: 6px 0;
+ -webkit-border-start: 6px solid transparent;
+ -webkit-padding-start: 18px;
+ -webkit-user-select: none;
+ cursor: pointer;
+}
+
+#navigation a {
+ color: #999;
+ text-decoration: none;
+}
+
+#navigation a.active,
+.active > button {
+ color: rgb(70, 78, 90);
+}
+
+.aboutImage {
+ background-color: rgba(221, 221, 221, 0.95);
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#888), to(#aaa));
+ background-image: -webkit-linear-gradient(#888, #aaa);
+ background-image: linear-gradient(#888, #aaa), linear-gradient(#888, #aaa);
+ background-size: 2px 100%;
+ background-position: 0 0, 100% 0;
+ background-repeat: no-repeat;
+ border-top: 1px solid #888;
+ box-shadow: 1px 4px 13px rgb(100, 100, 100);
+ border-radius: 2px;
+}
+
+.aboutImage img {
+ margin: 0 1px;
+}
+
+.aboutImage.right {
+ float: right;
+ clear: right;
+ margin: 0 0 15px 15px;
+}
+
+.aboutImage.left {
+ float: left;
+ clear: left;
+ margin: 15px 15px 0 0;
+}
+
+ul.features li:before {
+ color: #00aa00;
+ content: '\2714'; /* ✔ */
+ display: inline-block;
+ font-size: 13px;
+ width: 20px;
+}
+
+ul.features li {
+ margin: 6px 0;
+}
+
+#elementBox {
+ width: 95%;
+}
+
+label {
+ cursor: default;
+ margin-top: 1px;
+ margin-bottom: 2px;
+ margin-inline-start: 6px;
+ margin-inline-end: 5px;
+}
+
+input[type="checkbox"] + label.radio {
+ line-height: 1.5em;
+}
+
+label[disabled="true"] {
+ color: GrayText;
+}
+
+select {
+ min-width: 120px;
+ -webkit-appearance: none;
+ -webkit-padding-end: 24px;
+ -webkit-padding-start: 10px;
+ /* OVERRIDE */
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAAICAQAAACxSAwfAAAAUklEQVQY02P4z0AMRGZGMaShwCisyhITmb8huMzfEhOxKvuvsGAh208Ik+3ngoX/FbBbClcIUcSAw21QhXxfIIrwKAMpfNsEUYRXGVCEFc6CQwBqq4CCCtU4VgAAAABJRU5ErkJggg==);
+ background-image: -webkit-image-set(url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAAICAQAAACxSAwfAAAAUklEQVQY02P4z0AMRGZGMaShwCisyhITmb8huMzfEhOxKvuvsGAh208Ik+3ngoX/FbBbClcIUcSAw21QhXxfIIrwKAMpfNsEUYRXGVCEFc6CQwBqq4CCCtU4VgAAAABJRU5ErkJggg==) 1x, url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACcAAAAQCAQAAAA/1a6rAAAAQUlEQVR4Xu3MsQnAMBAEMI1+myf9gw0+3ASCenmu+mQn2yGn3S4Mp906DEW3CEPfzTD03QxD380w3OmIUHe9v+u9QwAt93yns5cAAAAASUVORK5CYII=) 2x),
+ -webkit-linear-gradient(#ededed, #ededed 38%, #dedede);
+ background-position: right center;
+ background-repeat: no-repeat;
+ border-radius: 2px;
+ font-family: inherit;
+ font-size: inherit;
+ padding: 2px 20px 2px 5px;
+}
+
+:-webkit-any(button, input[type='button'], input[type='submit']):not(.custom-appearance), select {
+ min-height: 29px;
+ min-width: 4em;
+ padding-bottom: 1px;
+}
+
+.inline-options select {
+ min-height: 1em;
+}
+
+:-webkit-any(button, input[type='button'], input[type='submit']):not(.custom-appearance), select, input[type='checkbox'], input[type='radio'] {
+ -webkit-appearance: none;
+ -webkit-user-select: none;
+ border: 1px solid rgba(0, 0, 0, 0.25);
+ border-radius: 2px;
+ box-shadow: 0 1px 0 rgba(0, 0, 0, 0.08), inset 0 1px 2px rgba(255, 255, 255, 0.75);
+ color: #444;
+ font: inherit;
+ margin: 0 1px 0 0;
+ outline: none;
+ text-shadow: 0 1px 0 rgb(240, 240, 240);
+}
+
+.detail-row {
+ padding: 10px 0;
+ display: flex;
+}
+
+.option-description {
+ float: left;
+ width: 35%;
+ display: inline-block;
+ padding-right: 0.5em;
+}
+
+.option-value {
+ flex: 1;
+}
+
+.manageSubscriptions {
+ font-size: smaller;
+}
+
+.label-container {
+ padding: 8px 0;
+}
+
+/*! AUI Label -> https://docs.atlassian.com/aui/latest/docs/labels.html */
+.aui-label {
+ background: #edf0ff;
+ border: 1px solid #ccc;
+ border-radius: 8px;
+ display: inline-block;
+ font-size: 14px;
+ font-weight: 400;
+ line-height: 1;
+ padding: 1px 7px;
+ margin: 0 8px 0 0;
+ text-align: left;
+ text-decoration: none;
+}
+
+.aui-label, a.aui-label {
+ color: #3572b0;
+}
+
+span.aui-label {
+ color: #484848;
+}
+
+.aui-label.aui-label-closeable.aui-label-split:hover, a.aui-label:active, a.aui-label:focus, a.aui-label:hover {
+ border-color: #707070;
+ text-decoration: none;
+}
+
+.aui-label-split .aui-label-split-main:active, .aui-label-split .aui-label-split-main:focus, .aui-label-split .aui-label-split-main:hover {
+ text-decoration: none;
+}
+
+.aui-label.aui-label-closeable {
+ padding-right: 18px;
+ position: relative;
+ margin-bottom: 0.5em;
+}
+
+.aui-label-closeable .aui-icon-close {
+ cursor: pointer;
+ display: block;
+ float: right;
+ height: 16px;
+ position: absolute;
+ right: 0px;
+ top: 0px;
+ width: 20px;
+ background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAQAAABuBnYAAAAAKUlEQVQI12NgYFj0nwEKwKxF/9P+Q4TgLAgDIQEVQuJiCKBpwWoosrUAzbg31XT4p6QAAAAASUVORK5CYII=') no-repeat 6px 4px;
+}
+
+.aui-icon {
+ background-repeat: no-repeat;
+ background-position: 0 0;
+ border: none;
+ display: inline-block;
+ height: 16px;
+ margin: 0;
+ padding: 0;
+ text-align: left;
+ text-indent: -999em;
+ vertical-align: text-bottom;
+ width: 16px;
+}
+
+mark,
+mark:hover {
+ background-color: rgba(255, 238, 34, 0.9);
+ padding: 0 2px;
+}
+
+.pro {
+ display: inline;
+}
+
+.hidden {
+ display: none;
+}
+
+.status {
+ padding: 1em;
+ border-radius: 0.5em;
+ border: 1px solid;
+}
+
+.status.notice {
+ color: #777;
+ background-color: #f6f7fa;
+ border-color: #c2cbcf;
+}
+
+.status.notice a {
+ color: #777;
+}
+
+.status.information {
+ color: #4c73a1;
+ background-color: #eaf7ff;
+ border-color: #c5dbe6;
+}
+
+.status.information a {
+ color: #4c73a1;
+}
+
+.status.ok {
+ color: #3b7826;
+ background-color: #cdeaca;
+ border-color: #58b548;
+}
+
+.status.ok a {
+ color: #3b7826;
+}
+
+.status.warning {
+ color: #9e7d4a;
+ background-color: #fbf6de;
+ border-color: #b1905c;
+}
+
+.status.warning a {
+ color: #9e7d4a;
+}
+
+.status.error {
+ color: #aa0225;
+ background-color: #f6d3cf;
+ border-color: #d66c68;
+}
+
+.status.error a {
+ color: #aa0225;
+}
+
+.price {
+ color: #777;
+ font-size: smaller;
+}
+
+.button {
+ background: #34d94d;
+ background-image: -webkit-linear-gradient(top, #34d94d, #2bb834);
+ background-image: -moz-linear-gradient(top, #34d94d, #2bb834);
+ background-image: -ms-linear-gradient(top, #34d94d, #2bb834);
+ background-image: -o-linear-gradient(top, #34d94d, #2bb834);
+ background-image: linear-gradient(to bottom, #34d94d, #2bb834);
+ border-radius: 4px;
+ text-shadow: 1px 1px 5px #8f8f8f;
+ color: #ffffff;
+ padding: 4px 12px;
+ text-decoration: none;
+ display: inline-block;
+ margin: 2px;
+ cursor: pointer;
+}
+
+.button:hover {
+ background: #82e885;
+ background-image: -webkit-linear-gradient(top, #82e885, #4fd934);
+ background-image: -moz-linear-gradient(top, #82e885, #4fd934);
+ background-image: -ms-linear-gradient(top, #82e885, #4fd934);
+ background-image: -o-linear-gradient(top, #82e885, #4fd934);
+ background-image: linear-gradient(to bottom, #82e885, #4fd934);
+ color: #ffffff;
+ text-decoration: none;
+}
+
+.currentPlan {
+ background: #3498db;
+ background-image: -webkit-linear-gradient(top, #3498db, #2980b9);
+ background-image: -moz-linear-gradient(top, #3498db, #2980b9);
+ background-image: -ms-linear-gradient(top, #3498db, #2980b9);
+ background-image: -o-linear-gradient(top, #3498db, #2980b9);
+ background-image: linear-gradient(to bottom, #3498db, #2980b9);
+ border-radius: 4px;
+ color: #ffffff;
+ padding: 4px 12px;
+ text-decoration: none;
+ display: inline-block;
+ margin: 2px;
+ pointer-events: none;
+}
+
+.currentPlan:hover {
+ background: #3cb0fd;
+ background-image: -webkit-linear-gradient(top, #3cb0fd, #3498db);
+ background-image: -moz-linear-gradient(top, #3cb0fd, #3498db);
+ background-image: -ms-linear-gradient(top, #3cb0fd, #3498db);
+ background-image: -o-linear-gradient(top, #3cb0fd, #3498db);
+ background-image: linear-gradient(to bottom, #3cb0fd, #3498db);
+ color: #ffffff;
+ text-decoration: none;
+}
+
+ul.checkmark {
+ list-style-type: none;
+}
+
+ul.checkmark li:before {
+ content: "\2713\0020";
+ color: #008700;
+ font-weight: bold;
+ font-family: 'Lucida Sans Unicode', 'Arial Unicode MS', Arial, sans-serif;
+}
\ No newline at end of file
diff --git a/assets/css/popup.css b/assets/css/popup.css
new file mode 100644
index 0000000..27e831f
--- /dev/null
+++ b/assets/css/popup.css
@@ -0,0 +1,171 @@
+body {
+ color: rgb(100, 100, 100);
+ font-family: 'Lucida Grande', 'Helvetica Neue', Helvetica, Arial, sans-serif;
+ font-size: 11px;
+ line-height: 13px;
+ min-width: 200px;
+ margin: 0;
+}
+
+/*
+ * Remove blue outline that Chrome makes when autoselecting the first link
+ */
+*:focus {
+ outline: none;
+}
+
+/*
+ * Shadows are visible under slightly transparent text color
+ */
+h1 {
+ font-size: 12px;
+ font-weight: bold;
+ margin: 4px 8px;
+ text-shadow: 1px 1px 1px white, 0 0 0 black, 1px 1px 1px white;
+ white-space: nowrap;
+ line-height: 23px;
+}
+
+nav {
+ display: flex;
+}
+
+.separator {
+ border-top: 1px solid #b3b3b3;
+ margin: 4px 0;
+}
+
+.menu {
+ flex: 1;
+ vertical-align: middle;
+ text-align: right;
+ padding: 9px 9px 0 0;
+}
+
+.title {
+ width: auto;
+}
+
+.donateButton {
+ position: absolute;
+ top: 4px;
+ left: 4px;
+}
+
+#settings {
+ text-align: left;
+ box-sizing: border-box;
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ border: 1px solid #b3b3b3;
+ border-top: 0;
+ background-color: white;
+ margin: 0;
+ padding: 0.5em;
+ z-index: 1;
+ border-radius: 0 0 4px 4px;
+ box-shadow: 0 1px 2px 1px rgba(0, 0, 0, 0.26);
+}
+
+#settings h2 {
+ font-size: 12px;
+ font-weight: bold;
+ margin: 0 0 4px 0;
+ text-shadow: 1px 1px 1px white, 0 0 0 black, 1px 1px 1px white;
+ white-space: nowrap;
+ line-height: 23px;
+}
+
+#settings .closeButton {
+ cursor: pointer;
+ position: absolute;
+ top: 4px;
+ right: 8px;
+ font-size: 13px !important;
+ text-align: right;
+ width: 25px;
+ height: 25px;
+}
+
+.hidden {
+ display: none;
+}
+
+.visible {
+ transition: opacity 0.4s cubic-bezier(0.22, 0.61, 0.36, 1);
+ height: auto;
+ opacity: 1;
+ position: relative;
+ z-index: 1;
+ visibility: visible;
+ overflow: inherit;
+}
+
+#result {
+ min-width: 550px;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .defaultMessage:hover,
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .defaultMessage {
+ text-align: center;
+ padding: 1em;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .optionsButtonInDefaultMessage {
+ text-align: center;
+}
+
+#settingsIcon {
+ z-index: 2;
+ width: 16px;
+ height: 16px;
+ cursor: pointer;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .normalMode.visible {
+ background: transparent;
+ animation: none;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ #toolBar {
+ border-left: 0;
+ border-bottom: 0;
+ border-right: 0;
+ box-shadow: none;
+ background-color: white;
+ position: fixed;
+ bottom: 0;
+ z-index: 1;
+ width: 100%;
+ padding: 4px;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .toolBar {
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .thankYou {
+ color: #cc0000;
+ padding-right: 0.5rem;
+ padding-top: 2px;
+ cursor: pointer;
+ text-decoration: none;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ {
+ position: relative;
+ z-index: 0;
+ padding-bottom: 30px;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .normalMode {
+ background: transparent;
+ border: none;
+ box-shadow: none;
+ margin-top: 0;
+}
+
+#httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ .normalMode:not(:first-child) {
+ border-top: 1px solid #b3b3b3;
+}
diff --git a/assets/icons/cog.svg b/assets/icons/cog.svg
new file mode 100644
index 0000000..bf2a2bc
--- /dev/null
+++ b/assets/icons/cog.svg
@@ -0,0 +1,52 @@
+
+
diff --git a/assets/icons/eye.png b/assets/icons/eye.png
new file mode 100644
index 0000000..d4b557f
Binary files /dev/null and b/assets/icons/eye.png differ
diff --git a/assets/icons/eye.svg b/assets/icons/eye.svg
new file mode 100644
index 0000000..8fa463c
--- /dev/null
+++ b/assets/icons/eye.svg
@@ -0,0 +1 @@
+
diff --git a/assets/icons/icon128.png b/assets/icons/icon128.png
new file mode 100644
index 0000000..3558181
Binary files /dev/null and b/assets/icons/icon128.png differ
diff --git a/assets/icons/icon16.png b/assets/icons/icon16.png
new file mode 100644
index 0000000..e489cd2
Binary files /dev/null and b/assets/icons/icon16.png differ
diff --git a/assets/icons/icon48.png b/assets/icons/icon48.png
new file mode 100644
index 0000000..540ab25
Binary files /dev/null and b/assets/icons/icon48.png differ
diff --git a/assets/icons/toolbarIcon19.png b/assets/icons/toolbarIcon19.png
new file mode 100644
index 0000000..43115ff
Binary files /dev/null and b/assets/icons/toolbarIcon19.png differ
diff --git a/assets/icons/toolbarIcon38.png b/assets/icons/toolbarIcon38.png
new file mode 100644
index 0000000..19a19f3
Binary files /dev/null and b/assets/icons/toolbarIcon38.png differ
diff --git a/entrypoints/background.ts b/entrypoints/background.ts
new file mode 100644
index 0000000..939fbf9
--- /dev/null
+++ b/entrypoints/background.ts
@@ -0,0 +1,423 @@
+import { browser } from 'wxt/browser';
+import { defineBackground } from 'wxt/utils/define-background';
+
+export default defineBackground(() => {
+ const headerStore: Record = {};
+
+ /**
+ * Is defined helper function
+ */
+ function isDefined(variable: any): boolean {
+ return typeof variable !== 'undefined';
+ }
+
+ /**
+ * Is the tab content ready
+ */
+ function isTabContentReady(tabId: string | number): boolean {
+ return !isDefined(headerStore[tabId]) || !isDefined(headerStore[tabId].isContentReady);
+ }
+
+ /**
+ * Is valid URL
+ */
+ function isValidUrl(url: string): boolean {
+ return Boolean(url && (url.indexOf('http://') === 0 || url.indexOf('https://') === 0));
+ }
+
+ /**
+ * Is the request loggable
+ */
+ function isRequestLoggable(info: any): boolean {
+ return parseInt(String(info.tabId), 10) > 0 && isValidUrl(info.url) &&
+ (info.type === 'main_frame' || info.type === 'sub_frame' || info.type === 'xmlhttprequest');
+ }
+
+ /**
+ * Initialize header storage
+ */
+ function initializeHeaderStore(tabId: string | number, requestId: string): void {
+ tabId = String(tabId);
+ if (!isDefined(headerStore[tabId])) {
+ headerStore[tabId] = { isContentReady: false };
+ }
+ if (!isDefined(headerStore[tabId][requestId])) {
+ headerStore[tabId][requestId] = {};
+ headerStore[tabId][requestId].request = {};
+ headerStore[tabId][requestId].response = {};
+ headerStore[tabId][requestId].timeToFirstByte = {};
+ headerStore[tabId][requestId].timeToHeadersReceived = {};
+ headerStore[tabId][requestId].timeToComplete = {};
+ }
+ }
+
+ /**
+ * Prune store
+ */
+ function pruneHeaderStore(tabId: string): void {
+ browser.storage.local.get('tabRequestLimit').then((result: { tabRequestLimit?: number }) => {
+ const tabRequestLimit = result.tabRequestLimit || 25;
+ const requestIds = Object.keys(headerStore[tabId]);
+ if (requestIds.length > tabRequestLimit) {
+ delete headerStore[tabId][requestIds.splice(1, 1)[0]];
+ }
+ });
+ }
+
+ /**
+ * Reset store for each main_frame (frameId 0) request.
+ */
+ function resetHeaderStore(tabId: string | number, frameId: number, type: string, requestId: string): void {
+ tabId = String(tabId);
+ if (type === 'main_frame' &&
+ parseInt(String(frameId), 10) === 0 &&
+ isDefined(headerStore[tabId]) &&
+ Object.keys(headerStore[tabId]).shift() !== requestId
+ ) {
+ delete headerStore[tabId];
+ }
+ initializeHeaderStore(tabId, requestId);
+ }
+
+ /**
+ * Enable HTTP Header Spy on tabs with valid urls
+ */
+ function enablePopup(tab: chrome.tabs.Tab): void {
+ if (tab.id && isValidUrl(tab.url || '')) {
+ if (browser.action && browser.action.enable) {
+ browser.action.enable(tab.id);
+ }
+ } else if (tab.id) {
+ if (browser.action && browser.action.disable) {
+ browser.action.disable(tab.id);
+ }
+ }
+ }
+
+ /**
+ * Inject styles into content
+ */
+ function injectStyleSheetsIntoContent(tab: chrome.tabs.Tab): void {
+ if (!tab.id || !isValidUrl(tab.url || '')) {
+ return;
+ }
+
+ browser.tabs.sendMessage(
+ tab.id,
+ { msg: 'isStyleSheetInjected' }
+ ).then((response: any) => {
+ if (isDefined(response) && !response.isStyleSheetInjected) {
+ browser.scripting.insertCSS({
+ target: { tabId: tab.id as number },
+ files: ['/assets/css/content.css']
+ }).then(() => {
+ browser.storage.local.get('theme').then((result: { theme?: string }) => {
+ const theme = result.theme || 'dark';
+
+ browser.scripting.insertCSS({
+ target: { tabId: tab.id as number },
+ files: [theme === 'light' ? '/assets/css/contentLight.css' : '/assets/css/contentDark.css']
+ }).then(() => {
+ browser.tabs.sendMessage(
+ tab.id as number,
+ { msg: 'styleSheetIsInjected' }
+ );
+ });
+ });
+ });
+ }
+ }).catch(() => {
+ });
+ }
+
+ /**
+ * Send headers to content script
+ */
+ function sendHeadersToContent(tabId: number, url: string, headers: any, message: string): void {
+ if (!isValidUrl(url) || !isTabContentReady(tabId)) {
+ return;
+ }
+
+ browser.storage.local.get('renderMode').then((result: { renderMode?: string }) => {
+ const renderMode = result.renderMode || 'microMode';
+
+ if (parseInt(String(tabId), 10) <= 0 || renderMode === 'none') {
+ return;
+ }
+
+ browser.tabs.sendMessage(tabId, {
+ msg: message,
+ headers: headers,
+ options: result
+ }).catch(() => {
+ });
+ });
+ }
+
+ browser.webRequest.onBeforeRequest.addListener(
+ (info) => {
+ if (!isRequestLoggable(info)) {
+ return;
+ }
+
+ if (info.type === 'main_frame') {
+ info.frameId = 0;
+ }
+
+ resetHeaderStore(info.tabId, info.frameId || 0, info.type, info.requestId);
+ pruneHeaderStore(String(info.tabId));
+
+ const requestId = String(info.requestId);
+ const tabId = String(info.tabId);
+ let requestIndex = headerStore[tabId][requestId].request.requestIndex;
+
+ if (!isDefined(requestIndex)) {
+ requestIndex = 0;
+ } else {
+ requestIndex++;
+ }
+
+ headerStore[tabId][requestId].request.requestIndex = requestIndex;
+ headerStore[tabId][requestId].request[requestIndex] = info;
+ },
+ { urls: ['http://*/*', 'https://*/*'], types: ['main_frame', 'sub_frame', 'xmlhttprequest'] },
+ ['requestBody']
+ );
+
+ browser.webRequest.onBeforeRedirect.addListener(
+ (info) => {
+ if (!isRequestLoggable(info)) {
+ return;
+ }
+
+ const requestId = String(info.requestId);
+ const tabId = String(info.tabId);
+
+ if (!isDefined(headerStore[tabId]) || !isDefined(headerStore[tabId][requestId])) {
+ return;
+ }
+
+ const requestIndex = headerStore[tabId][requestId].request.requestIndex;
+
+ if (typeof headerStore[tabId][requestId].response[requestIndex] === 'object') {
+ headerStore[tabId][requestId].response[requestIndex] = Object.assign(
+ headerStore[tabId][requestId].response[requestIndex],
+ info
+ );
+ } else {
+ headerStore[tabId][requestId].response[requestIndex] = info;
+ }
+ },
+ { urls: ['http://*/*', 'https://*/*'], types: ['main_frame', 'sub_frame', 'xmlhttprequest'] },
+ ['responseHeaders']
+ );
+
+ browser.webRequest.onCompleted.addListener(
+ (info) => {
+ if (!isRequestLoggable(info)) {
+ return;
+ }
+
+ const requestId = String(info.requestId);
+ const tabId = String(info.tabId);
+
+ if (!isDefined(headerStore[tabId]) || !isDefined(headerStore[tabId][requestId])) {
+ return;
+ }
+
+ const requestIndex = headerStore[tabId][requestId].request.requestIndex;
+
+ headerStore[tabId][requestId].timeToComplete[requestIndex] = { timeStamp: info.timeStamp };
+
+ if (typeof headerStore[tabId][requestId].response[requestIndex] === 'object') {
+ headerStore[tabId][requestId].response[requestIndex] = Object.assign(
+ headerStore[tabId][requestId].response[requestIndex],
+ info
+ );
+ } else {
+ headerStore[tabId][requestId].response[requestIndex] = info;
+ }
+
+ if (!isDefined(headerStore[tabId][requestId].response[requestIndex].responseHeaders)) {
+ headerStore[tabId][requestId].response[requestIndex].responseHeaders = [];
+ }
+
+ delete headerStore[tabId][requestId].request.requestIndex;
+
+ let headers: Record = {};
+ headers[requestId] = headerStore[tabId][requestId];
+ sendHeadersToContent(info.tabId, info.url, headers, 'responseCompleted');
+ },
+ { urls: ['http://*/*', 'https://*/*'], types: ['main_frame', 'sub_frame', 'xmlhttprequest'] }
+ );
+
+ browser.webRequest.onHeadersReceived.addListener(
+ (info) => {
+ if (!isRequestLoggable(info)) {
+ return;
+ }
+
+ const requestId = String(info.requestId);
+ const tabId = String(info.tabId);
+
+ if (!isDefined(headerStore[tabId]) || !isDefined(headerStore[tabId][requestId])) {
+ return;
+ }
+
+ const requestIndex = headerStore[tabId][requestId].request.requestIndex;
+
+ headerStore[tabId][requestId].timeToHeadersReceived[requestIndex] = { timeStamp: info.timeStamp };
+
+ headerStore[tabId][requestId].response[requestIndex] = info;
+ },
+ { urls: ['http://*/*', 'https://*/*'], types: ['main_frame', 'sub_frame', 'xmlhttprequest'] },
+ ['responseHeaders']
+ );
+
+ browser.webRequest.onResponseStarted.addListener(
+ (info) => {
+ if (!isRequestLoggable(info)) {
+ return;
+ }
+
+ const requestId = String(info.requestId);
+ const tabId = String(info.tabId);
+
+ if (!isDefined(headerStore[tabId]) || !isDefined(headerStore[tabId][requestId])) {
+ return;
+ }
+
+ const requestIndex = headerStore[tabId][requestId].request.requestIndex;
+
+ headerStore[tabId][requestId].timeToFirstByte[requestIndex] = { timeStamp: info.timeStamp };
+ },
+ { urls: ['http://*/*', 'https://*/*'], types: ['main_frame', 'sub_frame', 'xmlhttprequest'] }
+ );
+
+ browser.webRequest.onSendHeaders.addListener(
+ (info) => {
+ if (!isRequestLoggable(info)) {
+ return;
+ }
+
+ if (info.type === 'main_frame') {
+ info.frameId = 0;
+ }
+
+ const requestId = String(info.requestId);
+ const tabId = String(info.tabId);
+
+ if (!isDefined(headerStore[tabId]) || !isDefined(headerStore[tabId][requestId])) {
+ return;
+ }
+
+ const requestIndex = headerStore[tabId][requestId].request.requestIndex;
+
+ const url = new URL(info.url);
+ if (url.search.length) {
+ const get = new URLSearchParams(url.search);
+ const parameters: Array<{key: string, value: string}> = [];
+
+ get.forEach((value, key) => {
+ parameters.push({ key, value });
+ });
+
+ (info as any).getData = parameters;
+ }
+
+ if (typeof headerStore[tabId][requestId].request[requestIndex] === 'object') {
+ headerStore[tabId][requestId].request[requestIndex] = Object.assign(
+ headerStore[tabId][requestId].request[requestIndex],
+ info
+ );
+ } else {
+ headerStore[tabId][requestId].request[requestIndex] = info;
+ }
+ },
+ { urls: ['http://*/*', 'https://*/*'], types: ['main_frame', 'sub_frame', 'xmlhttprequest'] },
+ ['requestHeaders']
+ );
+
+ browser.tabs.onActivated.addListener(() => {
+ browser.tabs.query({ active: true, currentWindow: true }).then((tabs) => {
+ const tab = tabs[0];
+ if (tab) {
+ injectStyleSheetsIntoContent(tab);
+ sendHeadersToContent(tab.id as number, tab.url || '', headerStore[String(tab.id)], 'tabActivated');
+ enablePopup(tab);
+ }
+ });
+ });
+
+ browser.tabs.onCreated.addListener((tab) => {
+ if (tab.id) {
+ sendHeadersToContent(tab.id, tab.url || '', headerStore[String(tab.id)], 'tabCreated');
+ enablePopup(tab);
+ }
+ });
+
+ browser.tabs.onUpdated.addListener((tabId, changeInfo, tab) => {
+ if (changeInfo.status !== 'complete' || !isValidUrl(tab.url || '')) {
+ return;
+ }
+
+ if (isDefined(headerStore[tabId]) && isDefined(headerStore[tabId].isContentReady)) {
+ delete headerStore[tabId].isContentReady;
+ }
+
+ browser.storage.local.get('renderMode').then((result) => {
+ const renderMode = result.renderMode || 'microMode';
+
+ if (parseInt(String(tabId), 10) <= 0 || renderMode === 'none') {
+ return;
+ }
+
+ injectStyleSheetsIntoContent(tab);
+ sendHeadersToContent(tabId, tab.url || '', headerStore[String(tabId)], 'tabUpdated');
+ enablePopup(tab);
+ });
+ });
+
+ browser.tabs.onRemoved.addListener((tabId) => {
+ delete headerStore[String(tabId)];
+ });
+
+ browser.runtime.onMessage.addListener((message, sender, sendResponse) => {
+ if (message.msg === 'storeRequestTypeSelection') {
+ browser.storage.local.set({ activeRequestTypes: message.activeRequestTypes });
+ return false;
+ } else if (message.msg === 'getHeadersForTab') {
+ sendResponse({ headerStore: headerStore[String(message.tabId)] || {} });
+ return true;
+ }
+ return false;
+ });
+
+ browser.storage.onChanged.addListener((changes, namespace) => {
+ let activeRequestTypes: string[] = [];
+ let activeRequestTypesDidChange = false;
+
+ for (const key in changes) {
+ if (changes.hasOwnProperty(key)) {
+ if (key === 'activeRequestTypes') {
+ activeRequestTypesDidChange = true;
+ activeRequestTypes = changes[key].newValue;
+ }
+ }
+ }
+
+ if (activeRequestTypesDidChange) {
+ browser.tabs.query({}).then((tabs) => {
+ tabs.forEach((tab) => {
+ if (tab.id && isValidUrl(tab.url || '')) {
+ browser.tabs.sendMessage(tab.id, {
+ msg: 'requestTypeSelectionDidChange',
+ activeRequestTypes: activeRequestTypes
+ }).catch(() => {
+ });
+ }
+ });
+ });
+ }
+ });
+});
diff --git a/entrypoints/content.ts b/entrypoints/content.ts
new file mode 100644
index 0000000..c964e9f
--- /dev/null
+++ b/entrypoints/content.ts
@@ -0,0 +1,208 @@
+import { browser } from 'wxt/browser';
+import Mark from 'mark.js';
+
+export default defineContentScript({
+ matches: ['http://*/*', 'https://*/*'],
+ runAt: 'document_idle',
+ main() {
+ let isStyleSheetInjected = false;
+ const containerId = 'httpHeaderSpy';
+
+ /**
+ * Pauseable Timer
+ */
+ class Timer {
+ private timerId: number = 0;
+ private start: Date = new Date();
+ private remaining: number;
+ private element: HTMLElement | null;
+
+ constructor(private callback: (requestId: string) => void, delay: number, private requestId: string) {
+ this.remaining = delay;
+ this.element = document.getElementById(containerId)?.querySelector(`[data-request-id='${requestId}']`) || null;
+ this.resume();
+ }
+
+ pause() {
+ window.clearTimeout(this.timerId);
+ this.remaining -= new Date().getTime() - this.start.getTime();
+ if (this.element !== null) {
+ this.element.classList.remove('fadeOutFast');
+ }
+ }
+
+ reset(callback: (requestId: string) => void, delay: number) {
+ window.clearTimeout(this.timerId);
+ if (this.element !== null) {
+ this.element.classList.remove('fadeOutFast');
+ }
+ this.timerId = window.setTimeout(() => callback(this.requestId), delay);
+ }
+
+ resume() {
+ this.start = new Date();
+ this.timerId = window.setTimeout(() => this.callback(this.requestId), this.remaining);
+ }
+ }
+
+ /**
+ * Remove panel
+ */
+ function removePanel(requestId: string) {
+ const element = document.getElementById(containerId)?.querySelector(`[data-request-id='${requestId}']`);
+ if (element !== null && element !== undefined && element.parentNode) {
+ element.parentNode.removeChild(element);
+ }
+ }
+
+ /**
+ * Fade out panel
+ */
+ function fadeOutPanel(requestId: string) {
+ const element = document.getElementById(containerId)?.querySelector(`[data-request-id='${requestId}']`);
+ if (element !== null && element !== undefined) {
+ element.classList.add('fadeOutFast');
+ element.classList.remove('visible');
+ }
+ new Timer(removePanel, 300, requestId);
+ }
+
+ /**
+ * Check if a value is defined
+ */
+ function isDefined(value: any): boolean {
+ return typeof value !== 'undefined' && value !== null;
+ }
+
+ /**
+ * Append element to another element
+ */
+ function appendChild(parent: HTMLElement, ...children: HTMLElement[]) {
+ for (const child of children) {
+ parent.appendChild(child);
+ }
+ }
+
+ /**
+ * Remove element from container
+ */
+ function removeElementFromContainer(element: HTMLElement | null, animate = false) {
+ if (element === null) {
+ return;
+ }
+ if (!animate) {
+ element.remove();
+ return;
+ }
+ element.classList.add('fadeOut');
+ element.addEventListener('webkitAnimationEnd', () => {
+ element.remove();
+ });
+ }
+
+ /**
+ * Create the infoBox
+ */
+ function createContainer(options: any) {
+ let containerElement = document.getElementById(containerId);
+ if (containerElement !== null) {
+ return containerElement;
+ }
+
+ containerElement = document.createElement(options.hidePanelAfterTimeout ? 'div' : 'details');
+ containerElement.id = containerId;
+ containerElement.classList.add(options.location);
+
+ if (options.renderMode === 'microMode') {
+ containerElement.classList.add('noMargin');
+ }
+
+ if (options.hidePanelAfterTimeout) {
+ containerElement.classList.add('noToolbar');
+ }
+
+ if (document.body) {
+ appendChild(document.body, containerElement);
+ } else {
+ appendChild(document.documentElement, containerElement);
+ }
+
+ document.onkeyup = (event) => {
+ if (!isDefined(document.getElementById(containerId))) {
+ return;
+ }
+
+ event = event || window.event;
+ let isEscape = false;
+ if ('key' in event) {
+ isEscape = (event.key === 'Escape' || event.key === 'Esc');
+ } else {
+ isEscape = ((event as KeyboardEvent).keyCode === 27);
+ }
+
+ if (isEscape && containerElement instanceof HTMLDetailsElement) {
+ containerElement.open = false;
+ }
+ };
+
+ if (options.hideonhover && options.hideonhover !== "") {
+ containerElement.addEventListener("mouseover", () => {
+ if (containerElement) {
+ containerElement.style.display = 'none';
+ setTimeout(() => {
+ if (containerElement) {
+ containerElement.style.display = 'block';
+ }
+ }, options.hideonhover * 1000);
+ }
+ });
+ }
+
+ return containerElement;
+ }
+
+ browser.runtime.onMessage.addListener((message: any, sender: any, sendResponse: any) => {
+ switch (message.msg) {
+ case 'isStyleSheetInjected':
+ sendResponse({ isStyleSheetInjected });
+ break;
+
+ case 'styleSheetIsInjected':
+ isStyleSheetInjected = true;
+ break;
+
+ case 'requestTypeSelectionDidChange':
+ document.getElementById(containerId)?.querySelectorAll('.requestTypes .type').forEach((element) => {
+ const typeElement = element as HTMLElement;
+ if (message.activeRequestTypes.indexOf(typeElement.dataset.type) !== -1) {
+ typeElement.classList.add('active');
+ document.getElementById(containerId)?.querySelectorAll(`[data-request-type='${typeElement.dataset.type}']`).forEach((el) => {
+ el.classList.remove('hidden');
+ el.classList.add('visible');
+ });
+ } else {
+ typeElement.classList.remove('active');
+ document.getElementById(containerId)?.querySelectorAll(`[data-request-type='${typeElement.dataset.type}']`).forEach((el) => {
+ el.classList.remove('visible');
+ el.classList.add('hidden');
+ });
+ }
+ });
+ break;
+
+ case 'responseCompleted':
+ case 'tabActivated':
+ case 'tabCreated':
+ case 'tabUpdated':
+ const options = message.options;
+ const containerElement = createContainer(options);
+ const requestIds = Object.keys(message.headers);
+
+
+ break;
+ }
+
+ return true; // Keep the message channel open for async responses
+ });
+ }
+});
diff --git a/entrypoints/options/index.html b/entrypoints/options/index.html
new file mode 100644
index 0000000..a464b53
--- /dev/null
+++ b/entrypoints/options/index.html
@@ -0,0 +1,116 @@
+
+
+
+
+ HTTP Header Spy Options
+
+
+
+
HTTP Header Spy Options
+
+
+ Display Options
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ most recent requests
+
+
+
+
+
+
+
+ seconds
+
+
+
+
+
+ Set it 0 or leave it empty to disable
+
+
+
+
+ Headers
+
+
+
Hidden Request Headers
+
+
+
+
+
+
+
Hidden Response Headers
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/entrypoints/options/index.ts b/entrypoints/options/index.ts
new file mode 100644
index 0000000..8cdaaea
--- /dev/null
+++ b/entrypoints/options/index.ts
@@ -0,0 +1,238 @@
+import { browser } from 'wxt/browser';
+import { restoreOptions, saveOption } from '@/utils/library';
+import '@/assets/css/options.css';
+
+document.addEventListener('DOMContentLoaded', async () => {
+ localizeHtml();
+
+ const options = await restoreOptions();
+ updateUIWithOptions(options);
+
+ setupEventListeners();
+});
+
+/**
+ * Localize HTML content using i18n
+ */
+function localizeHtml() {
+ document.querySelectorAll('[i18n-content]').forEach((element) => {
+ const i18nKey = element.getAttribute('i18n-content');
+ if (i18nKey) {
+ const message = browser.i18n.getMessage(i18nKey) || i18nKey;
+ if (message) {
+ element.textContent = message;
+ }
+ }
+ });
+}
+
+/**
+ * Update UI elements with current options
+ */
+function updateUIWithOptions(options: any) {
+ setSelectValue('renderMode', options.renderMode);
+ setSelectValue('location', options.location);
+ setSelectValue('theme', options.theme);
+ setSelectValue('tabRequestLimit', options.tabRequestLimit.toString());
+ setSelectValue('hidePanelAfterTimeout', options.hidePanelAfterTimeout ? '1' : '0');
+ setSelectValue('timeout', options.timeout.toString());
+
+ const hideOnHoverInput = document.getElementById('hideonhover') as HTMLInputElement;
+ if (hideOnHoverInput) {
+ hideOnHoverInput.value = options.hideonhover !== null ? options.hideonhover.toString() : '';
+ }
+
+ populateHeadersList('hiddenRequestHeaders', options.hiddenRequestHeaders);
+ populateHeadersList('hiddenResponseHeaders', options.hiddenResponseHeaders);
+}
+
+/**
+ * Populate headers list with tags
+ */
+function populateHeadersList(elementId: string, headers: string[]) {
+ const container = document.getElementById(elementId);
+ if (!container) return;
+
+ container.innerHTML = '';
+
+ headers.forEach(header => {
+ const tag = document.createElement('span');
+ tag.className = 'tag';
+ tag.textContent = header;
+
+ const removeButton = document.createElement('span');
+ removeButton.className = 'remove';
+ removeButton.textContent = '×';
+ removeButton.addEventListener('click', () => {
+ removeHeaderFromList(elementId, header);
+ });
+
+ tag.appendChild(removeButton);
+ container.appendChild(tag);
+ });
+}
+
+/**
+ * Remove header from list
+ */
+async function removeHeaderFromList(listId: string, header: string) {
+ const options = await restoreOptions();
+ const optionKey = listId as keyof typeof options;
+
+ if (Array.isArray(options[optionKey])) {
+ const updatedList = (options[optionKey] as string[]).filter(h => h !== header);
+ await saveOption(listId, updatedList);
+
+ populateHeadersList(listId, updatedList);
+ }
+}
+
+/**
+ * Add header to list
+ */
+async function addHeaderToList(listId: string, inputId: string) {
+ const input = document.getElementById(inputId) as HTMLInputElement;
+ if (!input || !input.value.trim()) return;
+
+ const header = input.value.trim().toLowerCase();
+ const options = await restoreOptions();
+ const optionKey = listId as keyof typeof options;
+
+ if (Array.isArray(options[optionKey])) {
+ const currentList = options[optionKey] as string[];
+
+ if (!currentList.includes(header)) {
+ const updatedList = [...currentList, header];
+ await saveOption(listId, updatedList);
+
+ populateHeadersList(listId, updatedList);
+
+ input.value = '';
+ }
+ }
+}
+
+/**
+ * Set up event listeners
+ */
+function setupEventListeners() {
+ const saveButton = document.getElementById('save');
+ if (saveButton) {
+ saveButton.addEventListener('click', saveOptions);
+ }
+
+ const resetButton = document.getElementById('reset');
+ if (resetButton) {
+ resetButton.addEventListener('click', resetOptions);
+ }
+
+ const addRequestHeaderButton = document.getElementById('addHiddenRequestHeader');
+ if (addRequestHeaderButton) {
+ addRequestHeaderButton.addEventListener('click', () => {
+ addHeaderToList('hiddenRequestHeaders', 'hiddenRequestHeadersInput');
+ });
+ }
+
+ const addResponseHeaderButton = document.getElementById('addHiddenResponseHeader');
+ if (addResponseHeaderButton) {
+ addResponseHeaderButton.addEventListener('click', () => {
+ addHeaderToList('hiddenResponseHeaders', 'hiddenResponseHeadersInput');
+ });
+ }
+
+ ['renderMode', 'location', 'theme', 'tabRequestLimit', 'hidePanelAfterTimeout', 'timeout'].forEach(id => {
+ const element = document.getElementById(id) as HTMLSelectElement;
+ if (element) {
+ element.addEventListener('change', () => {
+ const value = element.value;
+ if (id === 'tabRequestLimit' || id === 'timeout') {
+ saveOption(id, parseInt(value, 10));
+ } else if (id === 'hidePanelAfterTimeout') {
+ saveOption(id, value === '1');
+ } else {
+ saveOption(id, value);
+ }
+ });
+ }
+ });
+
+ const hideOnHoverInput = document.getElementById('hideonhover') as HTMLInputElement;
+ if (hideOnHoverInput) {
+ hideOnHoverInput.addEventListener('change', () => {
+ const value = hideOnHoverInput.value ? parseInt(hideOnHoverInput.value, 10) : null;
+ saveOption('hideonhover', value);
+ });
+ }
+}
+
+/**
+ * Save all options
+ */
+async function saveOptions() {
+ const options = {
+ renderMode: getSelectValue('renderMode'),
+ location: getSelectValue('location'),
+ theme: getSelectValue('theme'),
+ tabRequestLimit: parseInt(getSelectValue('tabRequestLimit'), 10),
+ hidePanelAfterTimeout: getSelectValue('hidePanelAfterTimeout') === '1',
+ timeout: parseInt(getSelectValue('timeout'), 10),
+ hideonhover: getInputNumberValue('hideonhover')
+ };
+
+ for (const [key, value] of Object.entries(options)) {
+ await saveOption(key, value);
+ }
+
+ const status = document.getElementById('status');
+ if (status) {
+ status.textContent = browser.i18n.getMessage('optionsPageSaved') || 'Options saved.';
+ setTimeout(() => {
+ status.textContent = '';
+ }, 1500);
+ }
+}
+
+/**
+ * Reset options to defaults
+ */
+async function resetOptions() {
+ await browser.storage.local.clear();
+
+ const options = await restoreOptions();
+
+ updateUIWithOptions(options);
+
+ const status = document.getElementById('status');
+ if (status) {
+ status.textContent = browser.i18n.getMessage('optionsPageReset') || 'Options reset to defaults.';
+ setTimeout(() => {
+ status.textContent = '';
+ }, 1500);
+ }
+}
+
+/**
+ * Helper to get select element value
+ */
+function getSelectValue(id: string): string {
+ const element = document.getElementById(id) as HTMLSelectElement;
+ return element ? element.value : '';
+}
+
+/**
+ * Helper to set select element value
+ */
+function setSelectValue(id: string, value: string) {
+ const element = document.getElementById(id) as HTMLSelectElement;
+ if (element) {
+ element.value = value;
+ }
+}
+
+/**
+ * Helper to get input number value
+ */
+function getInputNumberValue(id: string): number | null {
+ const element = document.getElementById(id) as HTMLInputElement;
+ return element && element.value ? parseInt(element.value, 10) : null;
+}
diff --git a/entrypoints/popup/index.html b/entrypoints/popup/index.html
new file mode 100644
index 0000000..73a8b84
--- /dev/null
+++ b/entrypoints/popup/index.html
@@ -0,0 +1,93 @@
+
+
+
+
+ HTTP Header Spy
+
+
+
+
+
+
diff --git a/entrypoints/popup/index.ts b/entrypoints/popup/index.ts
new file mode 100644
index 0000000..723277d
--- /dev/null
+++ b/entrypoints/popup/index.ts
@@ -0,0 +1,329 @@
+import { browser } from 'wxt/browser';
+import {
+ saveOption,
+ restoreOptions as getOptions,
+ getPanel,
+ getToolbar,
+ isValidUrl,
+ containerId
+} from '@/utils/library';
+import type { ExtensionOptions } from '@/utils/library';
+import '@/assets/css/content.css';
+import '@/assets/css/contentLight.css';
+import '@/assets/css/popup.css';
+
+document.addEventListener('DOMContentLoaded', async () => {
+ localizeHtml();
+
+ const options = await loadOptions();
+
+ const settingsIcon = document.getElementById('settingsIcon');
+ const settingsPanel = document.getElementById('settings');
+
+ if (settingsIcon && settingsPanel) {
+ settingsIcon.addEventListener('click', () => {
+ settingsPanel.classList.toggle('hidden');
+ });
+
+ const closeButton = settingsPanel.querySelector('.closeButton');
+ if (closeButton) {
+ closeButton.addEventListener('click', () => {
+ settingsPanel.classList.add('hidden');
+ });
+ }
+ }
+
+ setupOptionsChangeHandlers();
+
+ loadHeaderData();
+});
+
+/**
+ * Localize HTML content using i18n
+ */
+function localizeHtml() {
+ document.querySelectorAll('[i18n-content]').forEach((element) => {
+ const i18nKey = element.getAttribute('i18n-content');
+ if (i18nKey) {
+ const message = browser.i18n.getMessage(i18nKey) || i18nKey;
+ if (message) {
+ element.textContent = message;
+ }
+ }
+ });
+}
+
+/**
+ * Set up event handlers for option changes
+ */
+function setupOptionsChangeHandlers() {
+ const themeSelector = document.getElementById('theme') as HTMLSelectElement;
+ if (themeSelector) {
+ themeSelector.addEventListener('change', async () => {
+ await browser.storage.local.set({ theme: themeSelector.value });
+ document.body.classList.toggle('light', themeSelector.value === 'light');
+ });
+ }
+
+ const renderModeSelector = document.getElementById('renderMode') as HTMLSelectElement;
+ if (renderModeSelector) {
+ renderModeSelector.addEventListener('change', async () => {
+ await browser.storage.local.set({ renderMode: renderModeSelector.value });
+ });
+ }
+
+ const locationSelector = document.getElementById('location') as HTMLSelectElement;
+ if (locationSelector) {
+ locationSelector.addEventListener('change', async () => {
+ await browser.storage.local.set({ location: locationSelector.value });
+ });
+ }
+
+ const tabRequestLimitSelector = document.getElementById('tabRequestLimit') as HTMLSelectElement;
+ if (tabRequestLimitSelector) {
+ tabRequestLimitSelector.addEventListener('change', async () => {
+ await browser.storage.local.set({ tabRequestLimit: parseInt(tabRequestLimitSelector.value, 10) });
+ });
+ }
+
+ const hidePanelSelector = document.getElementById('hidePanelAfterTimeout') as HTMLSelectElement;
+ if (hidePanelSelector) {
+ hidePanelSelector.addEventListener('change', async () => {
+ await browser.storage.local.set({
+ hidePanelAfterTimeout: hidePanelSelector.value === '1'
+ });
+ });
+ }
+
+ const timeoutSelector = document.getElementById('timeout') as HTMLSelectElement;
+ if (timeoutSelector) {
+ timeoutSelector.addEventListener('change', async () => {
+ await browser.storage.local.set({ timeout: parseInt(timeoutSelector.value, 10) });
+ });
+ }
+
+ const hideOnHoverInput = document.getElementById('hideonhover') as HTMLInputElement;
+ if (hideOnHoverInput) {
+ hideOnHoverInput.addEventListener('change', async () => {
+ const value = hideOnHoverInput.value ? parseInt(hideOnHoverInput.value, 10) : null;
+ await browser.storage.local.set({ hideonhover: value });
+ });
+ }
+
+ const optionsButton = document.getElementById('goToOptions');
+ if (optionsButton) {
+ optionsButton.addEventListener('click', () => {
+ browser.runtime.openOptionsPage();
+ });
+ }
+}
+
+/**
+ * Load header data for the current tab
+ */
+async function loadHeaderData() {
+ try {
+ const tabs = await browser.tabs.query({ active: true, currentWindow: true });
+ if (tabs.length === 0) return;
+
+ const tab = tabs[0];
+ if (!tab.id || !isValidUrl(tab.url || '')) return;
+
+ const response = await browser.runtime.sendMessage({
+ msg: 'getHeadersForTab',
+ tabId: tab.id
+ });
+
+ if (response && response.headerStore) {
+ const options = await getOptions();
+ displayHeaders(response.headerStore, options);
+ }
+ } catch (error) {
+ console.error('Failed to load header data:', error);
+ }
+}
+
+/**
+ * Display headers in the popup
+ */
+function displayHeaders(headerStore: any, options: ExtensionOptions) {
+ const container = document.getElementById(containerId);
+ const resultContainer = container ? container.querySelector('#result') : null;
+ if (!resultContainer || !headerStore) {
+ console.error('Container or headerStore not found', { container, resultContainer, headerStore });
+ return;
+ }
+
+ while (resultContainer.firstChild) {
+ resultContainer.removeChild(resultContainer.firstChild);
+ }
+
+ const requestIds = Object.keys(headerStore);
+ if (requestIds.length === 0) {
+ const defaultMessage = document.createElement('p');
+ defaultMessage.className = 'defaultMessage';
+ defaultMessage.textContent = browser.i18n.getMessage('popupDefaultMessage') || 'No headers were captured yet.';
+
+ const optionsButtonDiv = document.createElement('div');
+ optionsButtonDiv.className = 'optionsButtonInDefaultMessage';
+
+ const optionsButton = document.createElement('button');
+ optionsButton.id = 'goToOptions';
+ optionsButton.textContent = browser.i18n.getMessage('buttonOptions') || 'Options';
+ optionsButton.addEventListener('click', () => {
+ browser.runtime.openOptionsPage();
+ });
+
+ optionsButtonDiv.appendChild(optionsButton);
+ resultContainer.appendChild(defaultMessage);
+ resultContainer.appendChild(optionsButtonDiv);
+ return;
+ }
+
+ requestIds.forEach(requestId => {
+ if (requestId === 'isContentReady') return;
+
+ const panel = getPanel(headerStore[requestId], requestId, options);
+ if (panel && panel.children.length) {
+ resultContainer.appendChild(panel);
+ }
+ });
+
+ if (!resultContainer.querySelector('#toolBar')) {
+ const toolbar = getToolbar(options);
+ if (toolbar) {
+ resultContainer.appendChild(toolbar);
+
+ const typeElements = resultContainer.querySelectorAll('.requestTypes .type');
+ typeElements.forEach(element => {
+ element.addEventListener('click', (event) => {
+ const target = event.target as HTMLElement;
+ target.classList.toggle('active');
+ target.classList.toggle('inactive');
+
+ const activeTypes: string[] = [];
+ resultContainer.querySelectorAll('.requestTypes .type.active').forEach(el => {
+ const type = el.classList[1];
+ if (type) activeTypes.push(type);
+ });
+
+ browser.runtime.sendMessage({
+ msg: 'storeRequestTypeSelection',
+ activeRequestTypes: activeTypes
+ });
+ });
+ });
+
+ const filterInput = resultContainer.querySelector('#inlineFilterInput') as HTMLInputElement;
+ const filterAllowRegex = resultContainer.querySelector('#inlineFilterAllowRegex') as HTMLInputElement;
+
+ if (filterInput && filterAllowRegex) {
+ filterInput.addEventListener('keyup', () => {
+ const container = document.getElementById('result');
+ if (container) {
+ const query = filterInput.value;
+ const isRegex = filterAllowRegex.checked;
+
+ if (query) {
+ try {
+ if (isRegex) {
+ const regex = new RegExp(query, 'ig');
+ Array.from(container.getElementsByTagName('tr')).forEach((element) => {
+ if (element.textContent && element.textContent.match(regex) !== null) {
+ element.style.display = 'table-row';
+ } else {
+ element.style.display = 'none';
+ }
+ });
+ } else {
+ Array.from(container.getElementsByTagName('tr')).forEach((element) => {
+ if (element.textContent && element.textContent.toLowerCase().includes(query.toLowerCase())) {
+ element.style.display = 'table-row';
+ } else {
+ element.style.display = 'none';
+ }
+ });
+ }
+ } catch (e) {
+ console.error('Invalid regex:', e);
+ }
+ } else {
+ Array.from(container.getElementsByTagName('tr')).forEach((element) => {
+ element.style.display = 'table-row';
+ });
+ }
+ }
+ });
+
+ filterAllowRegex.addEventListener('click', () => {
+ const container = document.getElementById('result');
+ if (container && filterInput.value) {
+ const query = filterInput.value;
+ const isRegex = filterAllowRegex.checked;
+
+ try {
+ if (isRegex) {
+ const regex = new RegExp(query, 'ig');
+ Array.from(container.getElementsByTagName('tr')).forEach((element) => {
+ if (element.textContent && element.textContent.match(regex) !== null) {
+ element.style.display = 'table-row';
+ } else {
+ element.style.display = 'none';
+ }
+ });
+ } else {
+ Array.from(container.getElementsByTagName('tr')).forEach((element) => {
+ if (element.textContent && element.textContent.toLowerCase().includes(query.toLowerCase())) {
+ element.style.display = 'table-row';
+ } else {
+ element.style.display = 'none';
+ }
+ });
+ }
+ } catch (e) {
+ console.error('Invalid regex:', e);
+ }
+ }
+ });
+ }
+ }
+ }
+}
+
+/**
+ * Load options and update UI
+ */
+async function loadOptions() {
+ const options = await getOptions();
+ updateUIWithOptions(options);
+ return options;
+}
+
+/**
+ * Update UI elements with current options
+ */
+function updateUIWithOptions(options: any) {
+ setSelectValue('renderMode', options.renderMode);
+ setSelectValue('location', options.location);
+ setSelectValue('theme', options.theme);
+ setSelectValue('tabRequestLimit', options.tabRequestLimit.toString());
+ setSelectValue('hidePanelAfterTimeout', options.hidePanelAfterTimeout ? '1' : '0');
+ setSelectValue('timeout', options.timeout.toString());
+
+ const hideOnHoverInput = document.getElementById('hideonhover') as HTMLInputElement;
+ if (hideOnHoverInput) {
+ hideOnHoverInput.value = options.hideonhover !== null ? options.hideonhover.toString() : '';
+ }
+
+ document.body.classList.toggle('light', options.theme === 'light');
+}
+
+/**
+ * Helper to set select element value
+ */
+function setSelectValue(id: string, value: string) {
+ const element = document.getElementById(id) as HTMLSelectElement;
+ if (element) {
+ element.value = value;
+ }
+}
diff --git a/manifest.json b/manifest.json
index 11ca46a..ab1803e 100644
--- a/manifest.json
+++ b/manifest.json
@@ -1,7 +1,7 @@
{
"name": "__MSG_extensionName__",
"short_name": "__MSG_extensionNameShort__",
- "version": "2.0.49",
+ "version": "2.0.50",
"manifest_version": 2,
"minimum_chrome_version": "18",
"description": "__MSG_extensionDescription__",
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..29ffd35
--- /dev/null
+++ b/package.json
@@ -0,0 +1,21 @@
+{
+ "name": "http-header-spy",
+ "version": "2.0.49",
+ "scripts": {
+ "dev": "wxt",
+ "build": "wxt build",
+ "build:firefox": "wxt build --browser firefox",
+ "postinstall": "wxt prepare"
+ },
+ "devDependencies": {
+ "@types/chrome": "^0.0.268",
+ "@types/webextension-polyfill": "^0.12.3",
+ "@wxt-dev/webextension-polyfill": "^1.0.0",
+ "typescript": "^5.0.0",
+ "webextension-polyfill": "^0.12.0",
+ "wxt": "^0.20.6"
+ },
+ "dependencies": {
+ "mark.js": "^8.11.1"
+ }
+}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
new file mode 100644
index 0000000..b86b008
--- /dev/null
+++ b/pnpm-lock.yaml
@@ -0,0 +1,3730 @@
+lockfileVersion: '9.0'
+
+settings:
+ autoInstallPeers: true
+ excludeLinksFromLockfile: false
+
+importers:
+
+ .:
+ dependencies:
+ mark.js:
+ specifier: ^8.11.1
+ version: 8.11.1
+ devDependencies:
+ '@types/chrome':
+ specifier: ^0.0.268
+ version: 0.0.268
+ '@types/webextension-polyfill':
+ specifier: ^0.12.3
+ version: 0.12.3
+ '@wxt-dev/webextension-polyfill':
+ specifier: ^1.0.0
+ version: 1.0.0(webextension-polyfill@0.12.0)(wxt@0.20.6(@types/node@22.15.21)(jiti@2.4.2)(rollup@4.41.1))
+ typescript:
+ specifier: ^5.0.0
+ version: 5.8.3
+ webextension-polyfill:
+ specifier: ^0.12.0
+ version: 0.12.0
+ wxt:
+ specifier: ^0.20.6
+ version: 0.20.6(@types/node@22.15.21)(jiti@2.4.2)(rollup@4.41.1)
+
+packages:
+
+ '@1natsu/wait-element@4.1.2':
+ resolution: {integrity: sha512-qWxSJD+Q5b8bKOvESFifvfZ92DuMsY+03SBNjTO34ipJLP6mZ9yK4bQz/vlh48aEQXoJfaZBqUwKL5BdI5iiWw==}
+
+ '@aklinker1/rollup-plugin-visualizer@5.12.0':
+ resolution: {integrity: sha512-X24LvEGw6UFmy0lpGJDmXsMyBD58XmX1bbwsaMLhNoM+UMQfQ3b2RtC+nz4b/NoRK5r6QJSKJHBNVeUdwqybaQ==}
+ engines: {node: '>=14'}
+ hasBin: true
+ peerDependencies:
+ rollup: 2.x || 3.x || 4.x
+ peerDependenciesMeta:
+ rollup:
+ optional: true
+
+ '@babel/code-frame@7.27.1':
+ resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-string-parser@7.27.1':
+ resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-validator-identifier@7.27.1':
+ resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/parser@7.27.2':
+ resolution: {integrity: sha512-QYLs8299NA7WM/bZAdp+CviYYkVoYXlDW2rzliy3chxd1PQjej7JORuMJDJXJUb9g0TT+B99EwaVLKmX+sPXWw==}
+ engines: {node: '>=6.0.0'}
+ hasBin: true
+
+ '@babel/runtime@7.27.0':
+ resolution: {integrity: sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/types@7.27.1':
+ resolution: {integrity: sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==}
+ engines: {node: '>=6.9.0'}
+
+ '@devicefarmer/adbkit-logcat@2.1.3':
+ resolution: {integrity: sha512-yeaGFjNBc/6+svbDeul1tNHtNChw6h8pSHAt5D+JsedUrMTN7tla7B15WLDyekxsuS2XlZHRxpuC6m92wiwCNw==}
+ engines: {node: '>= 4'}
+
+ '@devicefarmer/adbkit-monkey@1.2.1':
+ resolution: {integrity: sha512-ZzZY/b66W2Jd6NHbAhLyDWOEIBWC11VizGFk7Wx7M61JZRz7HR9Cq5P+65RKWUU7u6wgsE8Lmh9nE4Mz+U2eTg==}
+ engines: {node: '>= 0.10.4'}
+
+ '@devicefarmer/adbkit@3.3.8':
+ resolution: {integrity: sha512-7rBLLzWQnBwutH2WZ0EWUkQdihqrnLYCUMaB44hSol9e0/cdIhuNFcqZO0xNheAU6qqHVA8sMiLofkYTgb+lmw==}
+ engines: {node: '>= 0.10.4'}
+ hasBin: true
+
+ '@esbuild/aix-ppc64@0.25.4':
+ resolution: {integrity: sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==}
+ engines: {node: '>=18'}
+ cpu: [ppc64]
+ os: [aix]
+
+ '@esbuild/android-arm64@0.25.4':
+ resolution: {integrity: sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [android]
+
+ '@esbuild/android-arm@0.25.4':
+ resolution: {integrity: sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==}
+ engines: {node: '>=18'}
+ cpu: [arm]
+ os: [android]
+
+ '@esbuild/android-x64@0.25.4':
+ resolution: {integrity: sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [android]
+
+ '@esbuild/darwin-arm64@0.25.4':
+ resolution: {integrity: sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@esbuild/darwin-x64@0.25.4':
+ resolution: {integrity: sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@esbuild/freebsd-arm64@0.25.4':
+ resolution: {integrity: sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [freebsd]
+
+ '@esbuild/freebsd-x64@0.25.4':
+ resolution: {integrity: sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@esbuild/linux-arm64@0.25.4':
+ resolution: {integrity: sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@esbuild/linux-arm@0.25.4':
+ resolution: {integrity: sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==}
+ engines: {node: '>=18'}
+ cpu: [arm]
+ os: [linux]
+
+ '@esbuild/linux-ia32@0.25.4':
+ resolution: {integrity: sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==}
+ engines: {node: '>=18'}
+ cpu: [ia32]
+ os: [linux]
+
+ '@esbuild/linux-loong64@0.25.4':
+ resolution: {integrity: sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==}
+ engines: {node: '>=18'}
+ cpu: [loong64]
+ os: [linux]
+
+ '@esbuild/linux-mips64el@0.25.4':
+ resolution: {integrity: sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==}
+ engines: {node: '>=18'}
+ cpu: [mips64el]
+ os: [linux]
+
+ '@esbuild/linux-ppc64@0.25.4':
+ resolution: {integrity: sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==}
+ engines: {node: '>=18'}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@esbuild/linux-riscv64@0.25.4':
+ resolution: {integrity: sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==}
+ engines: {node: '>=18'}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@esbuild/linux-s390x@0.25.4':
+ resolution: {integrity: sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==}
+ engines: {node: '>=18'}
+ cpu: [s390x]
+ os: [linux]
+
+ '@esbuild/linux-x64@0.25.4':
+ resolution: {integrity: sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [linux]
+
+ '@esbuild/netbsd-arm64@0.25.4':
+ resolution: {integrity: sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [netbsd]
+
+ '@esbuild/netbsd-x64@0.25.4':
+ resolution: {integrity: sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [netbsd]
+
+ '@esbuild/openbsd-arm64@0.25.4':
+ resolution: {integrity: sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [openbsd]
+
+ '@esbuild/openbsd-x64@0.25.4':
+ resolution: {integrity: sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [openbsd]
+
+ '@esbuild/sunos-x64@0.25.4':
+ resolution: {integrity: sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [sunos]
+
+ '@esbuild/win32-arm64@0.25.4':
+ resolution: {integrity: sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [win32]
+
+ '@esbuild/win32-ia32@0.25.4':
+ resolution: {integrity: sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==}
+ engines: {node: '>=18'}
+ cpu: [ia32]
+ os: [win32]
+
+ '@esbuild/win32-x64@0.25.4':
+ resolution: {integrity: sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [win32]
+
+ '@jridgewell/sourcemap-codec@1.5.0':
+ resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==}
+
+ '@nodelib/fs.scandir@2.1.5':
+ resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
+ engines: {node: '>= 8'}
+
+ '@nodelib/fs.stat@2.0.5':
+ resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
+ engines: {node: '>= 8'}
+
+ '@nodelib/fs.walk@1.2.8':
+ resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
+ engines: {node: '>= 8'}
+
+ '@pnpm/config.env-replace@1.1.0':
+ resolution: {integrity: sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==}
+ engines: {node: '>=12.22.0'}
+
+ '@pnpm/network.ca-file@1.0.2':
+ resolution: {integrity: sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==}
+ engines: {node: '>=12.22.0'}
+
+ '@pnpm/npm-conf@2.3.1':
+ resolution: {integrity: sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==}
+ engines: {node: '>=12'}
+
+ '@rollup/rollup-android-arm-eabi@4.41.1':
+ resolution: {integrity: sha512-NELNvyEWZ6R9QMkiytB4/L4zSEaBC03KIXEghptLGLZWJ6VPrL63ooZQCOnlx36aQPGhzuOMwDerC1Eb2VmrLw==}
+ cpu: [arm]
+ os: [android]
+
+ '@rollup/rollup-android-arm64@4.41.1':
+ resolution: {integrity: sha512-DXdQe1BJ6TK47ukAoZLehRHhfKnKg9BjnQYUu9gzhI8Mwa1d2fzxA1aw2JixHVl403bwp1+/o/NhhHtxWJBgEA==}
+ cpu: [arm64]
+ os: [android]
+
+ '@rollup/rollup-darwin-arm64@4.41.1':
+ resolution: {integrity: sha512-5afxvwszzdulsU2w8JKWwY8/sJOLPzf0e1bFuvcW5h9zsEg+RQAojdW0ux2zyYAz7R8HvvzKCjLNJhVq965U7w==}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@rollup/rollup-darwin-x64@4.41.1':
+ resolution: {integrity: sha512-egpJACny8QOdHNNMZKf8xY0Is6gIMz+tuqXlusxquWu3F833DcMwmGM7WlvCO9sB3OsPjdC4U0wHw5FabzCGZg==}
+ cpu: [x64]
+ os: [darwin]
+
+ '@rollup/rollup-freebsd-arm64@4.41.1':
+ resolution: {integrity: sha512-DBVMZH5vbjgRk3r0OzgjS38z+atlupJ7xfKIDJdZZL6sM6wjfDNo64aowcLPKIx7LMQi8vybB56uh1Ftck/Atg==}
+ cpu: [arm64]
+ os: [freebsd]
+
+ '@rollup/rollup-freebsd-x64@4.41.1':
+ resolution: {integrity: sha512-3FkydeohozEskBxNWEIbPfOE0aqQgB6ttTkJ159uWOFn42VLyfAiyD9UK5mhu+ItWzft60DycIN1Xdgiy8o/SA==}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@rollup/rollup-linux-arm-gnueabihf@4.41.1':
+ resolution: {integrity: sha512-wC53ZNDgt0pqx5xCAgNunkTzFE8GTgdZ9EwYGVcg+jEjJdZGtq9xPjDnFgfFozQI/Xm1mh+D9YlYtl+ueswNEg==}
+ cpu: [arm]
+ os: [linux]
+
+ '@rollup/rollup-linux-arm-musleabihf@4.41.1':
+ resolution: {integrity: sha512-jwKCca1gbZkZLhLRtsrka5N8sFAaxrGz/7wRJ8Wwvq3jug7toO21vWlViihG85ei7uJTpzbXZRcORotE+xyrLA==}
+ cpu: [arm]
+ os: [linux]
+
+ '@rollup/rollup-linux-arm64-gnu@4.41.1':
+ resolution: {integrity: sha512-g0UBcNknsmmNQ8V2d/zD2P7WWfJKU0F1nu0k5pW4rvdb+BIqMm8ToluW/eeRmxCared5dD76lS04uL4UaNgpNA==}
+ cpu: [arm64]
+ os: [linux]
+
+ '@rollup/rollup-linux-arm64-musl@4.41.1':
+ resolution: {integrity: sha512-XZpeGB5TKEZWzIrj7sXr+BEaSgo/ma/kCgrZgL0oo5qdB1JlTzIYQKel/RmhT6vMAvOdM2teYlAaOGJpJ9lahg==}
+ cpu: [arm64]
+ os: [linux]
+
+ '@rollup/rollup-linux-loongarch64-gnu@4.41.1':
+ resolution: {integrity: sha512-bkCfDJ4qzWfFRCNt5RVV4DOw6KEgFTUZi2r2RuYhGWC8WhCA8lCAJhDeAmrM/fdiAH54m0mA0Vk2FGRPyzI+tw==}
+ cpu: [loong64]
+ os: [linux]
+
+ '@rollup/rollup-linux-powerpc64le-gnu@4.41.1':
+ resolution: {integrity: sha512-3mr3Xm+gvMX+/8EKogIZSIEF0WUu0HL9di+YWlJpO8CQBnoLAEL/roTCxuLncEdgcfJcvA4UMOf+2dnjl4Ut1A==}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@rollup/rollup-linux-riscv64-gnu@4.41.1':
+ resolution: {integrity: sha512-3rwCIh6MQ1LGrvKJitQjZFuQnT2wxfU+ivhNBzmxXTXPllewOF7JR1s2vMX/tWtUYFgphygxjqMl76q4aMotGw==}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@rollup/rollup-linux-riscv64-musl@4.41.1':
+ resolution: {integrity: sha512-LdIUOb3gvfmpkgFZuccNa2uYiqtgZAz3PTzjuM5bH3nvuy9ty6RGc/Q0+HDFrHrizJGVpjnTZ1yS5TNNjFlklw==}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@rollup/rollup-linux-s390x-gnu@4.41.1':
+ resolution: {integrity: sha512-oIE6M8WC9ma6xYqjvPhzZYk6NbobIURvP/lEbh7FWplcMO6gn7MM2yHKA1eC/GvYwzNKK/1LYgqzdkZ8YFxR8g==}
+ cpu: [s390x]
+ os: [linux]
+
+ '@rollup/rollup-linux-x64-gnu@4.41.1':
+ resolution: {integrity: sha512-cWBOvayNvA+SyeQMp79BHPK8ws6sHSsYnK5zDcsC3Hsxr1dgTABKjMnMslPq1DvZIp6uO7kIWhiGwaTdR4Og9A==}
+ cpu: [x64]
+ os: [linux]
+
+ '@rollup/rollup-linux-x64-musl@4.41.1':
+ resolution: {integrity: sha512-y5CbN44M+pUCdGDlZFzGGBSKCA4A/J2ZH4edTYSSxFg7ce1Xt3GtydbVKWLlzL+INfFIZAEg1ZV6hh9+QQf9YQ==}
+ cpu: [x64]
+ os: [linux]
+
+ '@rollup/rollup-win32-arm64-msvc@4.41.1':
+ resolution: {integrity: sha512-lZkCxIrjlJlMt1dLO/FbpZbzt6J/A8p4DnqzSa4PWqPEUUUnzXLeki/iyPLfV0BmHItlYgHUqJe+3KiyydmiNQ==}
+ cpu: [arm64]
+ os: [win32]
+
+ '@rollup/rollup-win32-ia32-msvc@4.41.1':
+ resolution: {integrity: sha512-+psFT9+pIh2iuGsxFYYa/LhS5MFKmuivRsx9iPJWNSGbh2XVEjk90fmpUEjCnILPEPJnikAU6SFDiEUyOv90Pg==}
+ cpu: [ia32]
+ os: [win32]
+
+ '@rollup/rollup-win32-x64-msvc@4.41.1':
+ resolution: {integrity: sha512-Wq2zpapRYLfi4aKxf2Xff0tN+7slj2d4R87WEzqw7ZLsVvO5zwYCIuEGSZYiK41+GlwUo1HiR+GdkLEJnCKTCw==}
+ cpu: [x64]
+ os: [win32]
+
+ '@types/chrome@0.0.268':
+ resolution: {integrity: sha512-7N1QH9buudSJ7sI8Pe4mBHJr5oZ48s0hcanI9w3wgijAlv1OZNUZve9JR4x42dn5lJ5Sm87V1JNfnoh10EnQlA==}
+
+ '@types/estree@1.0.7':
+ resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==}
+
+ '@types/filesystem@0.0.36':
+ resolution: {integrity: sha512-vPDXOZuannb9FZdxgHnqSwAG/jvdGM8Wq+6N4D/d80z+D4HWH+bItqsZaVRQykAn6WEVeEkLm2oQigyHtgb0RA==}
+
+ '@types/filewriter@0.0.33':
+ resolution: {integrity: sha512-xFU8ZXTw4gd358lb2jw25nxY9QAgqn2+bKKjKOYfNCzN4DKCFetK7sPtrlpg66Ywe3vWY9FNxprZawAh9wfJ3g==}
+
+ '@types/har-format@1.2.16':
+ resolution: {integrity: sha512-fluxdy7ryD3MV6h8pTfTYpy/xQzCFC7m89nOH9y94cNqJ1mDIDPut7MnRHI3F6qRmh/cT2fUjG1MLdCNb4hE9A==}
+
+ '@types/minimatch@3.0.5':
+ resolution: {integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==}
+
+ '@types/node@22.15.21':
+ resolution: {integrity: sha512-EV/37Td6c+MgKAbkcLG6vqZ2zEYHD7bvSrzqqs2RIhbA6w3x+Dqz8MZM3sP6kGTeLrdoOgKZe+Xja7tUB2DNkQ==}
+
+ '@types/webextension-polyfill@0.12.3':
+ resolution: {integrity: sha512-F58aDVSeN/MjUGazXo/cPsmR76EvqQhQ1v4x23hFjUX0cfAJYE+JBWwiOGW36/VJGGxoH74sVlRIF3z7SJCKyg==}
+
+ '@types/yauzl@2.10.3':
+ resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==}
+
+ '@webext-core/fake-browser@1.3.2':
+ resolution: {integrity: sha512-jFyPWWz+VkHAC9DRIiIPOyu6X/KlC8dYqSKweHz6tsDb86QawtVgZSpYcM+GOQBlZc5DHFo92jJ7cIq4uBnU0A==}
+
+ '@webext-core/isolated-element@1.1.2':
+ resolution: {integrity: sha512-CNHYhsIR8TPkPb+4yqTIuzaGnVn/Fshev5fyoPW+/8Cyc93tJbCjP9PC1XSK6fDWu+xASdPHLZaoa2nWAYoxeQ==}
+
+ '@webext-core/match-patterns@1.0.3':
+ resolution: {integrity: sha512-NY39ACqCxdKBmHgw361M9pfJma8e4AZo20w9AY+5ZjIj1W2dvXC8J31G5fjfOGbulW9w4WKpT8fPooi0mLkn9A==}
+
+ '@wxt-dev/browser@0.0.317':
+ resolution: {integrity: sha512-tpFr/OJjTlGY7FLIr950fNi9fIBLQQ9pRVDDajeqEMip5LsXFAxpbF4I1GAGUkdTJEghKQ8P5N9XnsAdbPBAOQ==}
+
+ '@wxt-dev/storage@1.1.1':
+ resolution: {integrity: sha512-H1vYWeoWz03INV4r+sLYDFil88b3rgMMfgGp/EXy3bLbveJeiMiFs/G0bsBN2Ra87Iqlf2oVYRb/ABQpAugbew==}
+
+ '@wxt-dev/webextension-polyfill@1.0.0':
+ resolution: {integrity: sha512-F83YdA5Dmy8u9QjRMY2r5h2GlzcYi/Ur+pvM1jTqPDj32qZlG53vqBLxRzptSrqahweahECBnJMe9GFegArgkQ==}
+ peerDependencies:
+ webextension-polyfill: '*'
+ wxt: '>=0.20.0'
+
+ acorn@8.14.1:
+ resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==}
+ engines: {node: '>=0.4.0'}
+ hasBin: true
+
+ adm-zip@0.5.16:
+ resolution: {integrity: sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ==}
+ engines: {node: '>=12.0'}
+
+ ansi-align@3.0.1:
+ resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==}
+
+ ansi-escapes@7.0.0:
+ resolution: {integrity: sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==}
+ engines: {node: '>=18'}
+
+ ansi-regex@5.0.1:
+ resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
+ engines: {node: '>=8'}
+
+ ansi-regex@6.1.0:
+ resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==}
+ engines: {node: '>=12'}
+
+ ansi-styles@4.3.0:
+ resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
+ engines: {node: '>=8'}
+
+ ansi-styles@6.2.1:
+ resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==}
+ engines: {node: '>=12'}
+
+ any-promise@1.3.0:
+ resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==}
+
+ array-differ@4.0.0:
+ resolution: {integrity: sha512-Q6VPTLMsmXZ47ENG3V+wQyZS1ZxXMxFyYzA+Z/GMrJ6yIutAIEf9wTyroTzmGjNfox9/h3GdGBCVh43GVFx4Uw==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+ array-union@3.0.1:
+ resolution: {integrity: sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw==}
+ engines: {node: '>=12'}
+
+ async-mutex@0.5.0:
+ resolution: {integrity: sha512-1A94B18jkJ3DYq284ohPxoXbfTA5HsQ7/Mf4DEhcyLx3Bz27Rh59iScbB6EPiP+B+joue6YCxcMXSbFC1tZKwA==}
+
+ async@3.2.6:
+ resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==}
+
+ atomic-sleep@1.0.0:
+ resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==}
+ engines: {node: '>=8.0.0'}
+
+ atomically@2.0.3:
+ resolution: {integrity: sha512-kU6FmrwZ3Lx7/7y3hPS5QnbJfaohcIul5fGqf7ok+4KklIEk9tJ0C2IQPdacSbVUWv6zVHXEBWoWd6NrVMT7Cw==}
+
+ balanced-match@1.0.2:
+ resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
+
+ base64-js@1.5.1:
+ resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
+
+ big-integer@1.6.52:
+ resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==}
+ engines: {node: '>=0.6'}
+
+ bl@5.1.0:
+ resolution: {integrity: sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==}
+
+ bluebird@3.7.2:
+ resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==}
+
+ boolbase@1.0.0:
+ resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==}
+
+ boxen@8.0.1:
+ resolution: {integrity: sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==}
+ engines: {node: '>=18'}
+
+ bplist-parser@0.2.0:
+ resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==}
+ engines: {node: '>= 5.10.0'}
+
+ brace-expansion@1.1.11:
+ resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
+
+ brace-expansion@2.0.1:
+ resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==}
+
+ braces@3.0.3:
+ resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
+ engines: {node: '>=8'}
+
+ buffer-crc32@0.2.13:
+ resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==}
+
+ buffer-from@1.1.2:
+ resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
+
+ buffer@6.0.3:
+ resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==}
+
+ bundle-name@3.0.0:
+ resolution: {integrity: sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==}
+ engines: {node: '>=12'}
+
+ bundle-name@4.1.0:
+ resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==}
+ engines: {node: '>=18'}
+
+ c12@3.0.4:
+ resolution: {integrity: sha512-t5FaZTYbbCtvxuZq9xxIruYydrAGsJ+8UdP0pZzMiK2xl/gNiSOy0OxhLzHUEEb0m1QXYqfzfvyIFEmz/g9lqg==}
+ peerDependencies:
+ magicast: ^0.3.5
+ peerDependenciesMeta:
+ magicast:
+ optional: true
+
+ cac@6.7.14:
+ resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==}
+ engines: {node: '>=8'}
+
+ camelcase@8.0.0:
+ resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==}
+ engines: {node: '>=16'}
+
+ chalk@4.1.2:
+ resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
+ engines: {node: '>=10'}
+
+ chalk@5.4.1:
+ resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==}
+ engines: {node: ^12.17.0 || ^14.13 || >=16.0.0}
+
+ chokidar@4.0.3:
+ resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==}
+ engines: {node: '>= 14.16.0'}
+
+ chrome-launcher@1.1.2:
+ resolution: {integrity: sha512-YclTJey34KUm5jB1aEJCq807bSievi7Nb/TU4Gu504fUYi3jw3KCIaH6L7nFWQhdEgH3V+wCh+kKD1P5cXnfxw==}
+ engines: {node: '>=12.13.0'}
+ hasBin: true
+
+ ci-info@4.2.0:
+ resolution: {integrity: sha512-cYY9mypksY8NRqgDB1XD1RiJL338v/551niynFTGkZOO2LHuB2OmOYxDIe/ttN9AHwrqdum1360G3ald0W9kCg==}
+ engines: {node: '>=8'}
+
+ citty@0.1.6:
+ resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==}
+
+ cli-boxes@3.0.0:
+ resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==}
+ engines: {node: '>=10'}
+
+ cli-cursor@4.0.0:
+ resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+ cli-cursor@5.0.0:
+ resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==}
+ engines: {node: '>=18'}
+
+ cli-highlight@2.1.11:
+ resolution: {integrity: sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==}
+ engines: {node: '>=8.0.0', npm: '>=5.0.0'}
+ hasBin: true
+
+ cli-spinners@2.9.2:
+ resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==}
+ engines: {node: '>=6'}
+
+ cli-truncate@4.0.0:
+ resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==}
+ engines: {node: '>=18'}
+
+ cliui@7.0.4:
+ resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==}
+
+ cliui@8.0.1:
+ resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==}
+ engines: {node: '>=12'}
+
+ clone@1.0.4:
+ resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==}
+ engines: {node: '>=0.8'}
+
+ color-convert@2.0.1:
+ resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
+ engines: {node: '>=7.0.0'}
+
+ color-name@1.1.4:
+ resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
+
+ colorette@2.0.20:
+ resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==}
+
+ commander@2.9.0:
+ resolution: {integrity: sha512-bmkUukX8wAOjHdN26xj5c4ctEV22TQ7dQYhSmuckKhToXrkUn0iIaolHdIxYYqD55nhpSPA9zPQ1yP57GdXP2A==}
+ engines: {node: '>= 0.6.x'}
+
+ commander@9.5.0:
+ resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==}
+ engines: {node: ^12.20.0 || >=14}
+
+ concat-map@0.0.1:
+ resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
+
+ concat-stream@1.6.2:
+ resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==}
+ engines: {'0': node >= 0.8}
+
+ confbox@0.1.8:
+ resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==}
+
+ confbox@0.2.2:
+ resolution: {integrity: sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==}
+
+ config-chain@1.1.13:
+ resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==}
+
+ configstore@7.0.0:
+ resolution: {integrity: sha512-yk7/5PN5im4qwz0WFZW3PXnzHgPu9mX29Y8uZ3aefe2lBPC1FYttWZRcaW9fKkT0pBCJyuQ2HfbmPVaODi9jcQ==}
+ engines: {node: '>=18'}
+
+ consola@3.4.2:
+ resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==}
+ engines: {node: ^14.18.0 || >=16.10.0}
+
+ core-util-is@1.0.3:
+ resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==}
+
+ cross-spawn@7.0.6:
+ resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
+ engines: {node: '>= 8'}
+
+ css-select@5.1.0:
+ resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==}
+
+ css-what@6.1.0:
+ resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==}
+ engines: {node: '>= 6'}
+
+ cssom@0.5.0:
+ resolution: {integrity: sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==}
+
+ debounce@1.2.1:
+ resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==}
+
+ debug@2.6.9:
+ resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+
+ debug@4.3.7:
+ resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==}
+ engines: {node: '>=6.0'}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+
+ debug@4.4.1:
+ resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==}
+ engines: {node: '>=6.0'}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+
+ deep-extend@0.6.0:
+ resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==}
+ engines: {node: '>=4.0.0'}
+
+ default-browser-id@3.0.0:
+ resolution: {integrity: sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==}
+ engines: {node: '>=12'}
+
+ default-browser-id@5.0.0:
+ resolution: {integrity: sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==}
+ engines: {node: '>=18'}
+
+ default-browser@4.0.0:
+ resolution: {integrity: sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==}
+ engines: {node: '>=14.16'}
+
+ default-browser@5.2.1:
+ resolution: {integrity: sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==}
+ engines: {node: '>=18'}
+
+ defaults@1.0.4:
+ resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==}
+
+ define-lazy-prop@2.0.0:
+ resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==}
+ engines: {node: '>=8'}
+
+ define-lazy-prop@3.0.0:
+ resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==}
+ engines: {node: '>=12'}
+
+ defu@6.1.4:
+ resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==}
+
+ dequal@2.0.3:
+ resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==}
+ engines: {node: '>=6'}
+
+ destr@2.0.5:
+ resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==}
+
+ dom-serializer@2.0.0:
+ resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==}
+
+ domelementtype@2.3.0:
+ resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==}
+
+ domhandler@5.0.3:
+ resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==}
+ engines: {node: '>= 4'}
+
+ domutils@3.2.2:
+ resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==}
+
+ dot-prop@9.0.0:
+ resolution: {integrity: sha512-1gxPBJpI/pcjQhKgIU91II6Wkay+dLcN3M6rf2uwP8hRur3HtQXjVrdAK3sjC0piaEuxzMwjXChcETiJl47lAQ==}
+ engines: {node: '>=18'}
+
+ dotenv-expand@12.0.2:
+ resolution: {integrity: sha512-lXpXz2ZE1cea1gL4sz2Ipj8y4PiVjytYr3Ij0SWoms1PGxIv7m2CRKuRuCRtHdVuvM/hNJPMxt5PbhboNC4dPQ==}
+ engines: {node: '>=12'}
+
+ dotenv@16.5.0:
+ resolution: {integrity: sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==}
+ engines: {node: '>=12'}
+
+ emoji-regex@10.4.0:
+ resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==}
+
+ emoji-regex@8.0.0:
+ resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
+
+ end-of-stream@1.4.4:
+ resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==}
+
+ entities@4.5.0:
+ resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
+ engines: {node: '>=0.12'}
+
+ entities@6.0.0:
+ resolution: {integrity: sha512-aKstq2TDOndCn4diEyp9Uq/Flu2i1GlLkc6XIDQSDMuaFE3OPW5OphLCyQ5SpSJZTb4reN+kTcYru5yIfXoRPw==}
+ engines: {node: '>=0.12'}
+
+ environment@1.1.0:
+ resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==}
+ engines: {node: '>=18'}
+
+ error-ex@1.3.2:
+ resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==}
+
+ es-module-lexer@1.7.0:
+ resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==}
+
+ es6-error@4.1.1:
+ resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==}
+
+ esbuild@0.25.4:
+ resolution: {integrity: sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==}
+ engines: {node: '>=18'}
+ hasBin: true
+
+ escalade@3.2.0:
+ resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
+ engines: {node: '>=6'}
+
+ escape-goat@4.0.0:
+ resolution: {integrity: sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==}
+ engines: {node: '>=12'}
+
+ escape-string-regexp@4.0.0:
+ resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
+ engines: {node: '>=10'}
+
+ escape-string-regexp@5.0.0:
+ resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==}
+ engines: {node: '>=12'}
+
+ estree-walker@3.0.3:
+ resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==}
+
+ eventemitter3@5.0.1:
+ resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==}
+
+ execa@5.1.1:
+ resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==}
+ engines: {node: '>=10'}
+
+ execa@7.2.0:
+ resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==}
+ engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0}
+
+ exsolve@1.0.5:
+ resolution: {integrity: sha512-pz5dvkYYKQ1AHVrgOzBKWeP4u4FRb3a6DNK2ucr0OoNwYIU4QWsJ+NM36LLzORT+z845MzKHHhpXiUF5nvQoJg==}
+
+ extract-zip@2.0.1:
+ resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==}
+ engines: {node: '>= 10.17.0'}
+ hasBin: true
+
+ fast-glob@3.3.3:
+ resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==}
+ engines: {node: '>=8.6.0'}
+
+ fast-redact@3.5.0:
+ resolution: {integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==}
+ engines: {node: '>=6'}
+
+ fastq@1.19.1:
+ resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==}
+
+ fd-slicer@1.1.0:
+ resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==}
+
+ fdir@6.4.4:
+ resolution: {integrity: sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==}
+ peerDependencies:
+ picomatch: ^3 || ^4
+ peerDependenciesMeta:
+ picomatch:
+ optional: true
+
+ filesize@10.1.6:
+ resolution: {integrity: sha512-sJslQKU2uM33qH5nqewAwVB2QgR6w1aMNsYUp3aN5rMRyXEwJGmZvaWzeJFNTOXWlHQyBFCWrdj3fV/fsTOX8w==}
+ engines: {node: '>= 10.4.0'}
+
+ fill-range@7.1.1:
+ resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
+ engines: {node: '>=8'}
+
+ firefox-profile@4.7.0:
+ resolution: {integrity: sha512-aGApEu5bfCNbA4PGUZiRJAIU6jKmghV2UVdklXAofnNtiDjqYw0czLS46W7IfFqVKgKhFB8Ao2YoNGHY4BoIMQ==}
+ engines: {node: '>=18'}
+ hasBin: true
+
+ formdata-node@6.0.3:
+ resolution: {integrity: sha512-8e1++BCiTzUno9v5IZ2J6bv4RU+3UKDmqWUQD0MIMVCd9AdhWkO1gw57oo1mNEX1dMq2EGI+FbWz4B92pscSQg==}
+ engines: {node: '>= 18'}
+
+ fs-extra@11.3.0:
+ resolution: {integrity: sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==}
+ engines: {node: '>=14.14'}
+
+ fsevents@2.3.3:
+ resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
+ engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
+ os: [darwin]
+
+ fx-runner@1.4.0:
+ resolution: {integrity: sha512-rci1g6U0rdTg6bAaBboP7XdRu01dzTAaKXxFf+PUqGuCv6Xu7o8NZdY1D5MvKGIjb6EdS1g3VlXOgksir1uGkg==}
+ hasBin: true
+
+ get-caller-file@2.0.5:
+ resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
+ engines: {node: 6.* || 8.* || >= 10.*}
+
+ get-east-asian-width@1.3.0:
+ resolution: {integrity: sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==}
+ engines: {node: '>=18'}
+
+ get-port-please@3.1.2:
+ resolution: {integrity: sha512-Gxc29eLs1fbn6LQ4jSU4vXjlwyZhF5HsGuMAa7gqBP4Rw4yxxltyDUuF5MBclFzDTXO+ACchGQoeela4DSfzdQ==}
+
+ get-stream@5.2.0:
+ resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==}
+ engines: {node: '>=8'}
+
+ get-stream@6.0.1:
+ resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==}
+ engines: {node: '>=10'}
+
+ giget@2.0.0:
+ resolution: {integrity: sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==}
+ hasBin: true
+
+ glob-parent@5.1.2:
+ resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
+ engines: {node: '>= 6'}
+
+ glob-to-regexp@0.4.1:
+ resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==}
+
+ global-directory@4.0.1:
+ resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==}
+ engines: {node: '>=18'}
+
+ graceful-fs@4.2.10:
+ resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==}
+
+ graceful-fs@4.2.11:
+ resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
+
+ graceful-readlink@1.0.1:
+ resolution: {integrity: sha512-8tLu60LgxF6XpdbK8OW3FA+IfTNBn1ZHGHKF4KQbEeSkajYw5PlYJcKluntgegDPTg8UkHjpet1T82vk6TQ68w==}
+
+ growly@1.3.0:
+ resolution: {integrity: sha512-+xGQY0YyAWCnqy7Cd++hc2JqMYzlm0dG30Jd0beaA64sROr8C4nt8Yc9V5Ro3avlSUDTN0ulqP/VBKi1/lLygw==}
+
+ has-flag@4.0.0:
+ resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
+ engines: {node: '>=8'}
+
+ highlight.js@10.7.3:
+ resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==}
+
+ hookable@5.5.3:
+ resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==}
+
+ html-escaper@3.0.3:
+ resolution: {integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==}
+
+ htmlparser2@10.0.0:
+ resolution: {integrity: sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==}
+
+ human-signals@2.1.0:
+ resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==}
+ engines: {node: '>=10.17.0'}
+
+ human-signals@4.3.1:
+ resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==}
+ engines: {node: '>=14.18.0'}
+
+ ieee754@1.2.1:
+ resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
+
+ immediate@3.0.6:
+ resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==}
+
+ import-meta-resolve@4.1.0:
+ resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==}
+
+ inherits@2.0.4:
+ resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
+
+ ini@1.3.8:
+ resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==}
+
+ ini@4.1.1:
+ resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+
+ ini@4.1.3:
+ resolution: {integrity: sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+
+ is-absolute@0.1.7:
+ resolution: {integrity: sha512-Xi9/ZSn4NFapG8RP98iNPMOeaV3mXPisxKxzKtHVqr3g56j/fBn+yZmnxSVAA8lmZbl2J9b/a4kJvfU3hqQYgA==}
+ engines: {node: '>=0.10.0'}
+
+ is-arrayish@0.2.1:
+ resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==}
+
+ is-docker@2.2.1:
+ resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==}
+ engines: {node: '>=8'}
+ hasBin: true
+
+ is-docker@3.0.0:
+ resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ hasBin: true
+
+ is-extglob@2.1.1:
+ resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
+ engines: {node: '>=0.10.0'}
+
+ is-fullwidth-code-point@3.0.0:
+ resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
+ engines: {node: '>=8'}
+
+ is-fullwidth-code-point@4.0.0:
+ resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==}
+ engines: {node: '>=12'}
+
+ is-fullwidth-code-point@5.0.0:
+ resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==}
+ engines: {node: '>=18'}
+
+ is-glob@4.0.3:
+ resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
+ engines: {node: '>=0.10.0'}
+
+ is-in-ci@1.0.0:
+ resolution: {integrity: sha512-eUuAjybVTHMYWm/U+vBO1sY/JOCgoPCXRxzdju0K+K0BiGW0SChEL1MLC0PoCIR1OlPo5YAp8HuQoUlsWEICwg==}
+ engines: {node: '>=18'}
+ hasBin: true
+
+ is-inside-container@1.0.0:
+ resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==}
+ engines: {node: '>=14.16'}
+ hasBin: true
+
+ is-installed-globally@1.0.0:
+ resolution: {integrity: sha512-K55T22lfpQ63N4KEN57jZUAaAYqYHEe8veb/TycJRk9DdSCLLcovXz/mL6mOnhQaZsQGwPhuFopdQIlqGSEjiQ==}
+ engines: {node: '>=18'}
+
+ is-interactive@2.0.0:
+ resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==}
+ engines: {node: '>=12'}
+
+ is-npm@6.0.0:
+ resolution: {integrity: sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+ is-number@7.0.0:
+ resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
+ engines: {node: '>=0.12.0'}
+
+ is-path-inside@4.0.0:
+ resolution: {integrity: sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==}
+ engines: {node: '>=12'}
+
+ is-plain-object@2.0.4:
+ resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==}
+ engines: {node: '>=0.10.0'}
+
+ is-potential-custom-element-name@1.0.1:
+ resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==}
+
+ is-primitive@3.0.1:
+ resolution: {integrity: sha512-GljRxhWvlCNRfZyORiH77FwdFwGcMO620o37EOYC0ORWdq+WYNVqW0w2Juzew4M+L81l6/QS3t5gkkihyRqv9w==}
+ engines: {node: '>=0.10.0'}
+
+ is-relative@0.1.3:
+ resolution: {integrity: sha512-wBOr+rNM4gkAZqoLRJI4myw5WzzIdQosFAAbnvfXP5z1LyzgAI3ivOKehC5KfqlQJZoihVhirgtCBj378Eg8GA==}
+ engines: {node: '>=0.10.0'}
+
+ is-stream@2.0.1:
+ resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==}
+ engines: {node: '>=8'}
+
+ is-stream@3.0.0:
+ resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+ is-unicode-supported@1.3.0:
+ resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==}
+ engines: {node: '>=12'}
+
+ is-unicode-supported@2.1.0:
+ resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==}
+ engines: {node: '>=18'}
+
+ is-wsl@2.2.0:
+ resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==}
+ engines: {node: '>=8'}
+
+ is-wsl@3.1.0:
+ resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==}
+ engines: {node: '>=16'}
+
+ isarray@1.0.0:
+ resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==}
+
+ isexe@1.1.2:
+ resolution: {integrity: sha512-d2eJzK691yZwPHcv1LbeAOa91yMJ9QmfTgSO1oXB65ezVhXQsxBac2vEB4bMVms9cGzaA99n6V2viHMq82VLDw==}
+
+ isexe@2.0.0:
+ resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
+
+ isobject@3.0.1:
+ resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==}
+ engines: {node: '>=0.10.0'}
+
+ jiti@2.4.2:
+ resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==}
+ hasBin: true
+
+ js-tokens@4.0.0:
+ resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
+
+ js-tokens@9.0.1:
+ resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==}
+
+ json-parse-even-better-errors@3.0.2:
+ resolution: {integrity: sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+
+ json5@2.2.3:
+ resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
+ engines: {node: '>=6'}
+ hasBin: true
+
+ jsonfile@6.1.0:
+ resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==}
+
+ jszip@3.10.1:
+ resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==}
+
+ kleur@3.0.3:
+ resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==}
+ engines: {node: '>=6'}
+
+ ky@1.8.1:
+ resolution: {integrity: sha512-7Bp3TpsE+L+TARSnnDpk3xg8Idi8RwSLdj6CMbNWoOARIrGrbuLGusV0dYwbZOm4bB3jHNxSw8Wk/ByDqJEnDw==}
+ engines: {node: '>=18'}
+
+ latest-version@9.0.0:
+ resolution: {integrity: sha512-7W0vV3rqv5tokqkBAFV1LbR7HPOWzXQDpDgEuib/aJ1jsZZx6x3c2mBI+TJhJzOhkGeaLbCKEHXEXLfirtG2JA==}
+ engines: {node: '>=18'}
+
+ lie@3.3.0:
+ resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==}
+
+ lighthouse-logger@2.0.1:
+ resolution: {integrity: sha512-ioBrW3s2i97noEmnXxmUq7cjIcVRjT5HBpAYy8zE11CxU9HqlWHHeRxfeN1tn8F7OEMVPIC9x1f8t3Z7US9ehQ==}
+
+ lines-and-columns@2.0.4:
+ resolution: {integrity: sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+ linkedom@0.18.10:
+ resolution: {integrity: sha512-ESCqVAtme2GI3zZnlVRidiydByV6WmPlmKeFzFVQslADiAO2Wi+H6xL/5kr/pUOESjEoVb2Eb3cYFJ/TQhQOWA==}
+
+ listr2@8.3.3:
+ resolution: {integrity: sha512-LWzX2KsqcB1wqQ4AHgYb4RsDXauQiqhjLk+6hjbaeHG4zpjjVAB6wC/gz6X0l+Du1cN3pUB5ZlrvTbhGSNnUQQ==}
+ engines: {node: '>=18.0.0'}
+
+ local-pkg@1.1.1:
+ resolution: {integrity: sha512-WunYko2W1NcdfAFpuLUoucsgULmgDBRkdxHxWQ7mK0cQqwPiy8E1enjuRBrhLtZkB5iScJ1XIPdhVEFK8aOLSg==}
+ engines: {node: '>=14'}
+
+ lodash.camelcase@4.3.0:
+ resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==}
+
+ lodash.kebabcase@4.1.1:
+ resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==}
+
+ lodash.merge@4.6.2:
+ resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
+
+ lodash.snakecase@4.1.1:
+ resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==}
+
+ log-symbols@5.1.0:
+ resolution: {integrity: sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==}
+ engines: {node: '>=12'}
+
+ log-symbols@6.0.0:
+ resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==}
+ engines: {node: '>=18'}
+
+ log-update@6.1.0:
+ resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==}
+ engines: {node: '>=18'}
+
+ magic-string@0.30.17:
+ resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==}
+
+ magicast@0.3.5:
+ resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==}
+
+ make-error@1.3.6:
+ resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==}
+
+ many-keys-map@2.0.1:
+ resolution: {integrity: sha512-DHnZAD4phTbZ+qnJdjoNEVU1NecYoSdbOOoVmTDH46AuxDkEVh3MxTVpXq10GtcTC6mndN9dkv1rNfpjRcLnOw==}
+
+ mark.js@8.11.1:
+ resolution: {integrity: sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==}
+
+ marky@1.3.0:
+ resolution: {integrity: sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ==}
+
+ merge-stream@2.0.0:
+ resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
+
+ merge2@1.4.1:
+ resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
+ engines: {node: '>= 8'}
+
+ micromatch@4.0.8:
+ resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
+ engines: {node: '>=8.6'}
+
+ mimic-fn@2.1.0:
+ resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
+ engines: {node: '>=6'}
+
+ mimic-fn@4.0.0:
+ resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==}
+ engines: {node: '>=12'}
+
+ mimic-function@5.0.1:
+ resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==}
+ engines: {node: '>=18'}
+
+ minimatch@10.0.1:
+ resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==}
+ engines: {node: 20 || >=22}
+
+ minimatch@3.1.2:
+ resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
+
+ minimist@1.2.8:
+ resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
+
+ mlly@1.7.4:
+ resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==}
+
+ ms@2.0.0:
+ resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==}
+
+ ms@2.1.3:
+ resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
+
+ multimatch@6.0.0:
+ resolution: {integrity: sha512-I7tSVxHGPlmPN/enE3mS1aOSo6bWBfls+3HmuEeCUBCE7gWnm3cBXCBkpurzFjVRwC6Kld8lLaZ1Iv5vOcjvcQ==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+ mz@2.7.0:
+ resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==}
+
+ nano-spawn@0.2.1:
+ resolution: {integrity: sha512-/pULofvsF8mOVcl/nUeVXL/GYOEvc7eJWSIxa+K4OYUolvXa5zwSgevsn4eoHs1xvh/BO3vx/PZiD9+Ow2ZVuw==}
+ engines: {node: '>=18.19'}
+
+ nanoid@3.3.11:
+ resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==}
+ engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
+ hasBin: true
+
+ node-fetch-native@1.6.6:
+ resolution: {integrity: sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ==}
+
+ node-forge@1.3.1:
+ resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==}
+ engines: {node: '>= 6.13.0'}
+
+ node-notifier@10.0.1:
+ resolution: {integrity: sha512-YX7TSyDukOZ0g+gmzjB6abKu+hTGvO8+8+gIFDsRCU2t8fLV/P2unmt+LGFaIa4y64aX98Qksa97rgz4vMNeLQ==}
+
+ normalize-path@3.0.0:
+ resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
+ engines: {node: '>=0.10.0'}
+
+ npm-run-path@4.0.1:
+ resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==}
+ engines: {node: '>=8'}
+
+ npm-run-path@5.3.0:
+ resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+ nth-check@2.1.1:
+ resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==}
+
+ nypm@0.6.0:
+ resolution: {integrity: sha512-mn8wBFV9G9+UFHIrq+pZ2r2zL4aPau/by3kJb3cM7+5tQHMt6HGQB8FDIeKFYp8o0D2pnH6nVsO88N4AmUxIWg==}
+ engines: {node: ^14.16.0 || >=16.10.0}
+ hasBin: true
+
+ object-assign@4.1.1:
+ resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
+ engines: {node: '>=0.10.0'}
+
+ ofetch@1.4.1:
+ resolution: {integrity: sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw==}
+
+ ohash@2.0.11:
+ resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==}
+
+ on-exit-leak-free@2.1.2:
+ resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==}
+ engines: {node: '>=14.0.0'}
+
+ once@1.4.0:
+ resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
+
+ onetime@5.1.2:
+ resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==}
+ engines: {node: '>=6'}
+
+ onetime@6.0.0:
+ resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==}
+ engines: {node: '>=12'}
+
+ onetime@7.0.0:
+ resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==}
+ engines: {node: '>=18'}
+
+ open@10.1.2:
+ resolution: {integrity: sha512-cxN6aIDPz6rm8hbebcP7vrQNhvRcveZoJU72Y7vskh4oIm+BZwBECnx5nTmrlres1Qapvx27Qo1Auukpf8PKXw==}
+ engines: {node: '>=18'}
+
+ open@8.4.2:
+ resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==}
+ engines: {node: '>=12'}
+
+ open@9.1.0:
+ resolution: {integrity: sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==}
+ engines: {node: '>=14.16'}
+
+ ora@6.3.1:
+ resolution: {integrity: sha512-ERAyNnZOfqM+Ao3RAvIXkYh5joP220yf59gVe2X/cI6SiCxIdi4c9HZKZD8R6q/RDXEje1THBju6iExiSsgJaQ==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+ ora@8.2.0:
+ resolution: {integrity: sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==}
+ engines: {node: '>=18'}
+
+ os-shim@0.1.3:
+ resolution: {integrity: sha512-jd0cvB8qQ5uVt0lvCIexBaROw1KyKm5sbulg2fWOHjETisuCzWyt+eTZKEMs8v6HwzoGs8xik26jg7eCM6pS+A==}
+ engines: {node: '>= 0.4.0'}
+
+ package-json@10.0.1:
+ resolution: {integrity: sha512-ua1L4OgXSBdsu1FPb7F3tYH0F48a6kxvod4pLUlGY9COeJAJQNX/sNH2IiEmsxw7lqYiAwrdHMjz1FctOsyDQg==}
+ engines: {node: '>=18'}
+
+ pako@1.0.11:
+ resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==}
+
+ parse-json@7.1.1:
+ resolution: {integrity: sha512-SgOTCX/EZXtZxBE5eJ97P4yGM5n37BwRU+YMsH4vNzFqJV/oWFXXCmwFlgWUM4PrakybVOueJJ6pwHqSVhTFDw==}
+ engines: {node: '>=16'}
+
+ parse5-htmlparser2-tree-adapter@6.0.1:
+ resolution: {integrity: sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==}
+
+ parse5@5.1.1:
+ resolution: {integrity: sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==}
+
+ parse5@6.0.1:
+ resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==}
+
+ path-key@3.1.1:
+ resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
+ engines: {node: '>=8'}
+
+ path-key@4.0.0:
+ resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==}
+ engines: {node: '>=12'}
+
+ pathe@2.0.3:
+ resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==}
+
+ pend@1.2.0:
+ resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==}
+
+ perfect-debounce@1.0.0:
+ resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==}
+
+ picocolors@1.1.1:
+ resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
+
+ picomatch@2.3.1:
+ resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
+ engines: {node: '>=8.6'}
+
+ picomatch@4.0.2:
+ resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==}
+ engines: {node: '>=12'}
+
+ pino-abstract-transport@2.0.0:
+ resolution: {integrity: sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==}
+
+ pino-std-serializers@7.0.0:
+ resolution: {integrity: sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==}
+
+ pino@9.6.0:
+ resolution: {integrity: sha512-i85pKRCt4qMjZ1+L7sy2Ag4t1atFcdbEt76+7iRJn1g2BvsnRMGu9p8pivl9fs63M2kF/A0OacFZhTub+m/qMg==}
+ hasBin: true
+
+ pkg-types@1.3.1:
+ resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==}
+
+ pkg-types@2.1.0:
+ resolution: {integrity: sha512-wmJwA+8ihJixSoHKxZJRBQG1oY8Yr9pGLzRmSsNms0iNWyHHAlZCa7mmKiFR10YPZuz/2k169JiS/inOjBCZ2A==}
+
+ postcss@8.5.3:
+ resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==}
+ engines: {node: ^10 || ^12 || >=14}
+
+ process-nextick-args@2.0.1:
+ resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==}
+
+ process-warning@4.0.1:
+ resolution: {integrity: sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q==}
+
+ promise-toolbox@0.21.0:
+ resolution: {integrity: sha512-NV8aTmpwrZv+Iys54sSFOBx3tuVaOBvvrft5PNppnxy9xpU/akHbaWIril22AB22zaPgrgwKdD0KsrM0ptUtpg==}
+ engines: {node: '>=6'}
+
+ prompts@2.4.2:
+ resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==}
+ engines: {node: '>= 6'}
+
+ proto-list@1.2.4:
+ resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==}
+
+ publish-browser-extension@3.0.0:
+ resolution: {integrity: sha512-gwjH8mIepNqID2VqKIxzT6lmtvkcc5tcWYzrGSUdkeUFFFSHhGp9xx01EZ7j8wPq50dDe0XU5VNbHMAqr6wWAA==}
+ engines: {node: ^18.0.0 || >=20.0.0}
+ hasBin: true
+
+ pump@3.0.2:
+ resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==}
+
+ pupa@3.1.0:
+ resolution: {integrity: sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==}
+ engines: {node: '>=12.20'}
+
+ quansync@0.2.10:
+ resolution: {integrity: sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==}
+
+ queue-microtask@1.2.3:
+ resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
+
+ quick-format-unescaped@4.0.4:
+ resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==}
+
+ rc9@2.1.2:
+ resolution: {integrity: sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==}
+
+ rc@1.2.8:
+ resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==}
+ hasBin: true
+
+ readable-stream@2.3.8:
+ resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==}
+
+ readable-stream@3.6.2:
+ resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==}
+ engines: {node: '>= 6'}
+
+ readdirp@4.1.2:
+ resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==}
+ engines: {node: '>= 14.18.0'}
+
+ real-require@0.2.0:
+ resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==}
+ engines: {node: '>= 12.13.0'}
+
+ regenerator-runtime@0.14.1:
+ resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==}
+
+ registry-auth-token@5.1.0:
+ resolution: {integrity: sha512-GdekYuwLXLxMuFTwAPg5UKGLW/UXzQrZvH/Zj791BQif5T05T0RsaLfHc9q3ZOKi7n+BoprPD9mJ0O0k4xzUlw==}
+ engines: {node: '>=14'}
+
+ registry-url@6.0.1:
+ resolution: {integrity: sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==}
+ engines: {node: '>=12'}
+
+ require-directory@2.1.1:
+ resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
+ engines: {node: '>=0.10.0'}
+
+ restore-cursor@4.0.0:
+ resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+ restore-cursor@5.1.0:
+ resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==}
+ engines: {node: '>=18'}
+
+ reusify@1.1.0:
+ resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==}
+ engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
+
+ rfdc@1.4.1:
+ resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==}
+
+ rollup@4.41.1:
+ resolution: {integrity: sha512-cPmwD3FnFv8rKMBc1MxWCwVQFxwf1JEmSX3iQXrRVVG15zerAIXRjMFVWnd5Q5QvgKF7Aj+5ykXFhUl+QGnyOw==}
+ engines: {node: '>=18.0.0', npm: '>=8.0.0'}
+ hasBin: true
+
+ run-applescript@5.0.0:
+ resolution: {integrity: sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==}
+ engines: {node: '>=12'}
+
+ run-applescript@7.0.0:
+ resolution: {integrity: sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==}
+ engines: {node: '>=18'}
+
+ run-parallel@1.2.0:
+ resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
+
+ safe-buffer@5.1.2:
+ resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==}
+
+ safe-buffer@5.2.1:
+ resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
+
+ safe-stable-stringify@2.5.0:
+ resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==}
+ engines: {node: '>=10'}
+
+ sax@1.4.1:
+ resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==}
+
+ scule@1.3.0:
+ resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==}
+
+ semver@7.7.2:
+ resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==}
+ engines: {node: '>=10'}
+ hasBin: true
+
+ set-value@4.1.0:
+ resolution: {integrity: sha512-zTEg4HL0RwVrqcWs3ztF+x1vkxfm0lP+MQQFPiMJTKVceBwEV0A569Ou8l9IYQG8jOZdMVI1hGsc0tmeD2o/Lw==}
+ engines: {node: '>=11.0'}
+
+ setimmediate@1.0.5:
+ resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==}
+
+ shebang-command@2.0.0:
+ resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
+ engines: {node: '>=8'}
+
+ shebang-regex@3.0.0:
+ resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
+ engines: {node: '>=8'}
+
+ shell-quote@1.7.3:
+ resolution: {integrity: sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==}
+
+ shellwords@0.1.1:
+ resolution: {integrity: sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==}
+
+ signal-exit@3.0.7:
+ resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==}
+
+ signal-exit@4.1.0:
+ resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==}
+ engines: {node: '>=14'}
+
+ sisteransi@1.0.5:
+ resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==}
+
+ slice-ansi@5.0.0:
+ resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==}
+ engines: {node: '>=12'}
+
+ slice-ansi@7.1.0:
+ resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==}
+ engines: {node: '>=18'}
+
+ sonic-boom@4.2.0:
+ resolution: {integrity: sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==}
+
+ source-map-js@1.2.1:
+ resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
+ engines: {node: '>=0.10.0'}
+
+ source-map-support@0.5.21:
+ resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==}
+
+ source-map@0.6.1:
+ resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
+ engines: {node: '>=0.10.0'}
+
+ source-map@0.7.4:
+ resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==}
+ engines: {node: '>= 8'}
+
+ spawn-sync@1.0.15:
+ resolution: {integrity: sha512-9DWBgrgYZzNghseho0JOuh+5fg9u6QWhAWa51QC7+U5rCheZ/j1DrEZnyE0RBBRqZ9uEXGPgSSM0nky6burpVw==}
+
+ split2@4.2.0:
+ resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==}
+ engines: {node: '>= 10.x'}
+
+ split@1.0.1:
+ resolution: {integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==}
+
+ stdin-discarder@0.1.0:
+ resolution: {integrity: sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+ stdin-discarder@0.2.2:
+ resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==}
+ engines: {node: '>=18'}
+
+ string-width@4.2.3:
+ resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
+ engines: {node: '>=8'}
+
+ string-width@7.2.0:
+ resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==}
+ engines: {node: '>=18'}
+
+ string_decoder@1.1.1:
+ resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==}
+
+ string_decoder@1.3.0:
+ resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
+
+ strip-ansi@6.0.1:
+ resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
+ engines: {node: '>=8'}
+
+ strip-ansi@7.1.0:
+ resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==}
+ engines: {node: '>=12'}
+
+ strip-bom@5.0.0:
+ resolution: {integrity: sha512-p+byADHF7SzEcVnLvc/r3uognM1hUhObuHXxJcgLCfD194XAkaLbjq3Wzb0N5G2tgIjH0dgT708Z51QxMeu60A==}
+ engines: {node: '>=12'}
+
+ strip-final-newline@2.0.0:
+ resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==}
+ engines: {node: '>=6'}
+
+ strip-final-newline@3.0.0:
+ resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==}
+ engines: {node: '>=12'}
+
+ strip-json-comments@2.0.1:
+ resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==}
+ engines: {node: '>=0.10.0'}
+
+ strip-json-comments@5.0.1:
+ resolution: {integrity: sha512-0fk9zBqO67Nq5M/m45qHCJxylV/DhBlIOVExqgOMiCCrzrhU6tCibRXNqE3jwJLftzE9SNuZtYbpzcO+i9FiKw==}
+ engines: {node: '>=14.16'}
+
+ strip-literal@3.0.0:
+ resolution: {integrity: sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==}
+
+ stubborn-fs@1.2.5:
+ resolution: {integrity: sha512-H2N9c26eXjzL/S/K+i/RHHcFanE74dptvvjM8iwzwbVcWY/zjBbgRqF3K0DY4+OD+uTTASTBvDoxPDaPN02D7g==}
+
+ supports-color@7.2.0:
+ resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
+ engines: {node: '>=8'}
+
+ thenify-all@1.6.0:
+ resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==}
+ engines: {node: '>=0.8'}
+
+ thenify@3.3.1:
+ resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==}
+
+ thread-stream@3.1.0:
+ resolution: {integrity: sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==}
+
+ through@2.3.8:
+ resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==}
+
+ tinyexec@0.3.2:
+ resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==}
+
+ tinyglobby@0.2.14:
+ resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==}
+ engines: {node: '>=12.0.0'}
+
+ titleize@3.0.0:
+ resolution: {integrity: sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==}
+ engines: {node: '>=12'}
+
+ tmp@0.2.3:
+ resolution: {integrity: sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==}
+ engines: {node: '>=14.14'}
+
+ to-regex-range@5.0.1:
+ resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
+ engines: {node: '>=8.0'}
+
+ tslib@2.8.1:
+ resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
+
+ type-fest@3.13.1:
+ resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==}
+ engines: {node: '>=14.16'}
+
+ type-fest@4.41.0:
+ resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==}
+ engines: {node: '>=16'}
+
+ typedarray@0.0.6:
+ resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==}
+
+ typescript@5.8.3:
+ resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==}
+ engines: {node: '>=14.17'}
+ hasBin: true
+
+ ufo@1.6.1:
+ resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==}
+
+ uhyphen@0.2.0:
+ resolution: {integrity: sha512-qz3o9CHXmJJPGBdqzab7qAYuW8kQGKNEuoHFYrBwV6hWIMcpAmxDLXojcHfFr9US1Pe6zUswEIJIbLI610fuqA==}
+
+ undici-types@6.21.0:
+ resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==}
+
+ unimport@5.0.1:
+ resolution: {integrity: sha512-1YWzPj6wYhtwHE+9LxRlyqP4DiRrhGfJxdtH475im8ktyZXO3jHj/3PZ97zDdvkYoovFdi0K4SKl3a7l92v3sQ==}
+ engines: {node: '>=18.12.0'}
+
+ universalify@2.0.1:
+ resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==}
+ engines: {node: '>= 10.0.0'}
+
+ unplugin-utils@0.2.4:
+ resolution: {integrity: sha512-8U/MtpkPkkk3Atewj1+RcKIjb5WBimZ/WSLhhR3w6SsIj8XJuKTacSP8g+2JhfSGw0Cb125Y+2zA/IzJZDVbhA==}
+ engines: {node: '>=18.12.0'}
+
+ unplugin@2.3.4:
+ resolution: {integrity: sha512-m4PjxTurwpWfpMomp8AptjD5yj8qEZN5uQjjGM3TAs9MWWD2tXSSNNj6jGR2FoVGod4293ytyV6SwBbertfyJg==}
+ engines: {node: '>=18.12.0'}
+
+ untildify@4.0.0:
+ resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==}
+ engines: {node: '>=8'}
+
+ update-notifier@7.3.1:
+ resolution: {integrity: sha512-+dwUY4L35XFYEzE+OAL3sarJdUioVovq+8f7lcIJ7wnmnYQV5UD1Y/lcwaMSyaQ6Bj3JMj1XSTjZbNLHn/19yA==}
+ engines: {node: '>=18'}
+
+ util-deprecate@1.0.2:
+ resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
+
+ uuid@8.3.2:
+ resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==}
+ hasBin: true
+
+ vite-node@3.1.4:
+ resolution: {integrity: sha512-6enNwYnpyDo4hEgytbmc6mYWHXDHYEn0D1/rw4Q+tnHUGtKTJsn8T1YkX6Q18wI5LCrS8CTYlBaiCqxOy2kvUA==}
+ engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
+ hasBin: true
+
+ vite@6.3.5:
+ resolution: {integrity: sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==}
+ engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
+ hasBin: true
+ peerDependencies:
+ '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0
+ jiti: '>=1.21.0'
+ less: '*'
+ lightningcss: ^1.21.0
+ sass: '*'
+ sass-embedded: '*'
+ stylus: '*'
+ sugarss: '*'
+ terser: ^5.16.0
+ tsx: ^4.8.1
+ yaml: ^2.4.2
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+ jiti:
+ optional: true
+ less:
+ optional: true
+ lightningcss:
+ optional: true
+ sass:
+ optional: true
+ sass-embedded:
+ optional: true
+ stylus:
+ optional: true
+ sugarss:
+ optional: true
+ terser:
+ optional: true
+ tsx:
+ optional: true
+ yaml:
+ optional: true
+
+ watchpack@2.4.2:
+ resolution: {integrity: sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==}
+ engines: {node: '>=10.13.0'}
+
+ wcwidth@1.0.1:
+ resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==}
+
+ web-ext-run@0.2.3:
+ resolution: {integrity: sha512-u/IiZaZ7dHFqTM1MLF27rBy8mS9fEEsqoOKL0u+kQdOLmEioA/0Szp67ADd3WAJZLd8/hO8cFST1IC/YMXKIjQ==}
+ engines: {node: '>=18.0.0', npm: '>=8.0.0'}
+
+ webextension-polyfill@0.12.0:
+ resolution: {integrity: sha512-97TBmpoWJEE+3nFBQ4VocyCdLKfw54rFaJ6EVQYLBCXqCIpLSZkwGgASpv4oPt9gdKCJ80RJlcmNzNn008Ag6Q==}
+
+ webpack-virtual-modules@0.6.2:
+ resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==}
+
+ when-exit@2.1.4:
+ resolution: {integrity: sha512-4rnvd3A1t16PWzrBUcSDZqcAmsUIy4minDXT/CZ8F2mVDgd65i4Aalimgz1aQkRGU0iH5eT5+6Rx2TK8o443Pg==}
+
+ when@3.7.7:
+ resolution: {integrity: sha512-9lFZp/KHoqH6bPKjbWqa+3Dg/K/r2v0X/3/G2x4DBGchVS2QX2VXL3cZV994WQVnTM1/PD71Az25nAzryEUugw==}
+
+ which@1.2.4:
+ resolution: {integrity: sha512-zDRAqDSBudazdfM9zpiI30Fu9ve47htYXcGi3ln0wfKu2a7SmrT6F3VDoYONu//48V8Vz4TdCRNPjtvyRO3yBA==}
+ hasBin: true
+
+ which@2.0.2:
+ resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
+ engines: {node: '>= 8'}
+ hasBin: true
+
+ widest-line@5.0.0:
+ resolution: {integrity: sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==}
+ engines: {node: '>=18'}
+
+ winreg@0.0.12:
+ resolution: {integrity: sha512-typ/+JRmi7RqP1NanzFULK36vczznSNN8kWVA9vIqXyv8GhghUlwhGp1Xj3Nms1FsPcNnsQrJOR10N58/nQ9hQ==}
+
+ wrap-ansi@7.0.0:
+ resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
+ engines: {node: '>=10'}
+
+ wrap-ansi@9.0.0:
+ resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==}
+ engines: {node: '>=18'}
+
+ wrappy@1.0.2:
+ resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
+
+ ws@8.18.1:
+ resolution: {integrity: sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==}
+ engines: {node: '>=10.0.0'}
+ peerDependencies:
+ bufferutil: ^4.0.1
+ utf-8-validate: '>=5.0.2'
+ peerDependenciesMeta:
+ bufferutil:
+ optional: true
+ utf-8-validate:
+ optional: true
+
+ wxt@0.20.6:
+ resolution: {integrity: sha512-CdExyv2yWfpmPWFjhrKBA+nUSHOTRpRKqScod66AaLpMQ0famZ18tM0+4a9m7oX4Pts1XZH4nw79XQp06QsC2Q==}
+ hasBin: true
+
+ xdg-basedir@5.1.0:
+ resolution: {integrity: sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==}
+ engines: {node: '>=12'}
+
+ xml2js@0.6.2:
+ resolution: {integrity: sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==}
+ engines: {node: '>=4.0.0'}
+
+ xmlbuilder@11.0.1:
+ resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==}
+ engines: {node: '>=4.0'}
+
+ y18n@5.0.8:
+ resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
+ engines: {node: '>=10'}
+
+ yargs-parser@20.2.9:
+ resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==}
+ engines: {node: '>=10'}
+
+ yargs-parser@21.1.1:
+ resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==}
+ engines: {node: '>=12'}
+
+ yargs@16.2.0:
+ resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==}
+ engines: {node: '>=10'}
+
+ yargs@17.7.2:
+ resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==}
+ engines: {node: '>=12'}
+
+ yauzl@2.10.0:
+ resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==}
+
+ zip-dir@2.0.0:
+ resolution: {integrity: sha512-uhlsJZWz26FLYXOD6WVuq+fIcZ3aBPGo/cFdiLlv3KNwpa52IF3ISV8fLhQLiqVu5No3VhlqlgthN6gehil1Dg==}
+
+ zod@3.25.28:
+ resolution: {integrity: sha512-/nt/67WYKnr5by3YS7LroZJbtcCBurDKKPBPWWzaxvVCGuG/NOsiKkrjoOhI8mJ+SQUXEbUzeB3S+6XDUEEj7Q==}
+
+snapshots:
+
+ '@1natsu/wait-element@4.1.2':
+ dependencies:
+ defu: 6.1.4
+ many-keys-map: 2.0.1
+
+ '@aklinker1/rollup-plugin-visualizer@5.12.0(rollup@4.41.1)':
+ dependencies:
+ open: 8.4.2
+ picomatch: 2.3.1
+ source-map: 0.7.4
+ yargs: 17.7.2
+ optionalDependencies:
+ rollup: 4.41.1
+
+ '@babel/code-frame@7.27.1':
+ dependencies:
+ '@babel/helper-validator-identifier': 7.27.1
+ js-tokens: 4.0.0
+ picocolors: 1.1.1
+
+ '@babel/helper-string-parser@7.27.1': {}
+
+ '@babel/helper-validator-identifier@7.27.1': {}
+
+ '@babel/parser@7.27.2':
+ dependencies:
+ '@babel/types': 7.27.1
+
+ '@babel/runtime@7.27.0':
+ dependencies:
+ regenerator-runtime: 0.14.1
+
+ '@babel/types@7.27.1':
+ dependencies:
+ '@babel/helper-string-parser': 7.27.1
+ '@babel/helper-validator-identifier': 7.27.1
+
+ '@devicefarmer/adbkit-logcat@2.1.3': {}
+
+ '@devicefarmer/adbkit-monkey@1.2.1': {}
+
+ '@devicefarmer/adbkit@3.3.8':
+ dependencies:
+ '@devicefarmer/adbkit-logcat': 2.1.3
+ '@devicefarmer/adbkit-monkey': 1.2.1
+ bluebird: 3.7.2
+ commander: 9.5.0
+ debug: 4.3.7
+ node-forge: 1.3.1
+ split: 1.0.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@esbuild/aix-ppc64@0.25.4':
+ optional: true
+
+ '@esbuild/android-arm64@0.25.4':
+ optional: true
+
+ '@esbuild/android-arm@0.25.4':
+ optional: true
+
+ '@esbuild/android-x64@0.25.4':
+ optional: true
+
+ '@esbuild/darwin-arm64@0.25.4':
+ optional: true
+
+ '@esbuild/darwin-x64@0.25.4':
+ optional: true
+
+ '@esbuild/freebsd-arm64@0.25.4':
+ optional: true
+
+ '@esbuild/freebsd-x64@0.25.4':
+ optional: true
+
+ '@esbuild/linux-arm64@0.25.4':
+ optional: true
+
+ '@esbuild/linux-arm@0.25.4':
+ optional: true
+
+ '@esbuild/linux-ia32@0.25.4':
+ optional: true
+
+ '@esbuild/linux-loong64@0.25.4':
+ optional: true
+
+ '@esbuild/linux-mips64el@0.25.4':
+ optional: true
+
+ '@esbuild/linux-ppc64@0.25.4':
+ optional: true
+
+ '@esbuild/linux-riscv64@0.25.4':
+ optional: true
+
+ '@esbuild/linux-s390x@0.25.4':
+ optional: true
+
+ '@esbuild/linux-x64@0.25.4':
+ optional: true
+
+ '@esbuild/netbsd-arm64@0.25.4':
+ optional: true
+
+ '@esbuild/netbsd-x64@0.25.4':
+ optional: true
+
+ '@esbuild/openbsd-arm64@0.25.4':
+ optional: true
+
+ '@esbuild/openbsd-x64@0.25.4':
+ optional: true
+
+ '@esbuild/sunos-x64@0.25.4':
+ optional: true
+
+ '@esbuild/win32-arm64@0.25.4':
+ optional: true
+
+ '@esbuild/win32-ia32@0.25.4':
+ optional: true
+
+ '@esbuild/win32-x64@0.25.4':
+ optional: true
+
+ '@jridgewell/sourcemap-codec@1.5.0': {}
+
+ '@nodelib/fs.scandir@2.1.5':
+ dependencies:
+ '@nodelib/fs.stat': 2.0.5
+ run-parallel: 1.2.0
+
+ '@nodelib/fs.stat@2.0.5': {}
+
+ '@nodelib/fs.walk@1.2.8':
+ dependencies:
+ '@nodelib/fs.scandir': 2.1.5
+ fastq: 1.19.1
+
+ '@pnpm/config.env-replace@1.1.0': {}
+
+ '@pnpm/network.ca-file@1.0.2':
+ dependencies:
+ graceful-fs: 4.2.10
+
+ '@pnpm/npm-conf@2.3.1':
+ dependencies:
+ '@pnpm/config.env-replace': 1.1.0
+ '@pnpm/network.ca-file': 1.0.2
+ config-chain: 1.1.13
+
+ '@rollup/rollup-android-arm-eabi@4.41.1':
+ optional: true
+
+ '@rollup/rollup-android-arm64@4.41.1':
+ optional: true
+
+ '@rollup/rollup-darwin-arm64@4.41.1':
+ optional: true
+
+ '@rollup/rollup-darwin-x64@4.41.1':
+ optional: true
+
+ '@rollup/rollup-freebsd-arm64@4.41.1':
+ optional: true
+
+ '@rollup/rollup-freebsd-x64@4.41.1':
+ optional: true
+
+ '@rollup/rollup-linux-arm-gnueabihf@4.41.1':
+ optional: true
+
+ '@rollup/rollup-linux-arm-musleabihf@4.41.1':
+ optional: true
+
+ '@rollup/rollup-linux-arm64-gnu@4.41.1':
+ optional: true
+
+ '@rollup/rollup-linux-arm64-musl@4.41.1':
+ optional: true
+
+ '@rollup/rollup-linux-loongarch64-gnu@4.41.1':
+ optional: true
+
+ '@rollup/rollup-linux-powerpc64le-gnu@4.41.1':
+ optional: true
+
+ '@rollup/rollup-linux-riscv64-gnu@4.41.1':
+ optional: true
+
+ '@rollup/rollup-linux-riscv64-musl@4.41.1':
+ optional: true
+
+ '@rollup/rollup-linux-s390x-gnu@4.41.1':
+ optional: true
+
+ '@rollup/rollup-linux-x64-gnu@4.41.1':
+ optional: true
+
+ '@rollup/rollup-linux-x64-musl@4.41.1':
+ optional: true
+
+ '@rollup/rollup-win32-arm64-msvc@4.41.1':
+ optional: true
+
+ '@rollup/rollup-win32-ia32-msvc@4.41.1':
+ optional: true
+
+ '@rollup/rollup-win32-x64-msvc@4.41.1':
+ optional: true
+
+ '@types/chrome@0.0.268':
+ dependencies:
+ '@types/filesystem': 0.0.36
+ '@types/har-format': 1.2.16
+
+ '@types/estree@1.0.7': {}
+
+ '@types/filesystem@0.0.36':
+ dependencies:
+ '@types/filewriter': 0.0.33
+
+ '@types/filewriter@0.0.33': {}
+
+ '@types/har-format@1.2.16': {}
+
+ '@types/minimatch@3.0.5': {}
+
+ '@types/node@22.15.21':
+ dependencies:
+ undici-types: 6.21.0
+
+ '@types/webextension-polyfill@0.12.3': {}
+
+ '@types/yauzl@2.10.3':
+ dependencies:
+ '@types/node': 22.15.21
+ optional: true
+
+ '@webext-core/fake-browser@1.3.2':
+ dependencies:
+ lodash.merge: 4.6.2
+
+ '@webext-core/isolated-element@1.1.2':
+ dependencies:
+ is-potential-custom-element-name: 1.0.1
+
+ '@webext-core/match-patterns@1.0.3': {}
+
+ '@wxt-dev/browser@0.0.317':
+ dependencies:
+ '@types/filesystem': 0.0.36
+ '@types/har-format': 1.2.16
+
+ '@wxt-dev/storage@1.1.1':
+ dependencies:
+ async-mutex: 0.5.0
+ dequal: 2.0.3
+
+ '@wxt-dev/webextension-polyfill@1.0.0(webextension-polyfill@0.12.0)(wxt@0.20.6(@types/node@22.15.21)(jiti@2.4.2)(rollup@4.41.1))':
+ dependencies:
+ webextension-polyfill: 0.12.0
+ wxt: 0.20.6(@types/node@22.15.21)(jiti@2.4.2)(rollup@4.41.1)
+
+ acorn@8.14.1: {}
+
+ adm-zip@0.5.16: {}
+
+ ansi-align@3.0.1:
+ dependencies:
+ string-width: 4.2.3
+
+ ansi-escapes@7.0.0:
+ dependencies:
+ environment: 1.1.0
+
+ ansi-regex@5.0.1: {}
+
+ ansi-regex@6.1.0: {}
+
+ ansi-styles@4.3.0:
+ dependencies:
+ color-convert: 2.0.1
+
+ ansi-styles@6.2.1: {}
+
+ any-promise@1.3.0: {}
+
+ array-differ@4.0.0: {}
+
+ array-union@3.0.1: {}
+
+ async-mutex@0.5.0:
+ dependencies:
+ tslib: 2.8.1
+
+ async@3.2.6: {}
+
+ atomic-sleep@1.0.0: {}
+
+ atomically@2.0.3:
+ dependencies:
+ stubborn-fs: 1.2.5
+ when-exit: 2.1.4
+
+ balanced-match@1.0.2: {}
+
+ base64-js@1.5.1: {}
+
+ big-integer@1.6.52: {}
+
+ bl@5.1.0:
+ dependencies:
+ buffer: 6.0.3
+ inherits: 2.0.4
+ readable-stream: 3.6.2
+
+ bluebird@3.7.2: {}
+
+ boolbase@1.0.0: {}
+
+ boxen@8.0.1:
+ dependencies:
+ ansi-align: 3.0.1
+ camelcase: 8.0.0
+ chalk: 5.4.1
+ cli-boxes: 3.0.0
+ string-width: 7.2.0
+ type-fest: 4.41.0
+ widest-line: 5.0.0
+ wrap-ansi: 9.0.0
+
+ bplist-parser@0.2.0:
+ dependencies:
+ big-integer: 1.6.52
+
+ brace-expansion@1.1.11:
+ dependencies:
+ balanced-match: 1.0.2
+ concat-map: 0.0.1
+
+ brace-expansion@2.0.1:
+ dependencies:
+ balanced-match: 1.0.2
+
+ braces@3.0.3:
+ dependencies:
+ fill-range: 7.1.1
+
+ buffer-crc32@0.2.13: {}
+
+ buffer-from@1.1.2: {}
+
+ buffer@6.0.3:
+ dependencies:
+ base64-js: 1.5.1
+ ieee754: 1.2.1
+
+ bundle-name@3.0.0:
+ dependencies:
+ run-applescript: 5.0.0
+
+ bundle-name@4.1.0:
+ dependencies:
+ run-applescript: 7.0.0
+
+ c12@3.0.4(magicast@0.3.5):
+ dependencies:
+ chokidar: 4.0.3
+ confbox: 0.2.2
+ defu: 6.1.4
+ dotenv: 16.5.0
+ exsolve: 1.0.5
+ giget: 2.0.0
+ jiti: 2.4.2
+ ohash: 2.0.11
+ pathe: 2.0.3
+ perfect-debounce: 1.0.0
+ pkg-types: 2.1.0
+ rc9: 2.1.2
+ optionalDependencies:
+ magicast: 0.3.5
+
+ cac@6.7.14: {}
+
+ camelcase@8.0.0: {}
+
+ chalk@4.1.2:
+ dependencies:
+ ansi-styles: 4.3.0
+ supports-color: 7.2.0
+
+ chalk@5.4.1: {}
+
+ chokidar@4.0.3:
+ dependencies:
+ readdirp: 4.1.2
+
+ chrome-launcher@1.1.2:
+ dependencies:
+ '@types/node': 22.15.21
+ escape-string-regexp: 4.0.0
+ is-wsl: 2.2.0
+ lighthouse-logger: 2.0.1
+ transitivePeerDependencies:
+ - supports-color
+
+ ci-info@4.2.0: {}
+
+ citty@0.1.6:
+ dependencies:
+ consola: 3.4.2
+
+ cli-boxes@3.0.0: {}
+
+ cli-cursor@4.0.0:
+ dependencies:
+ restore-cursor: 4.0.0
+
+ cli-cursor@5.0.0:
+ dependencies:
+ restore-cursor: 5.1.0
+
+ cli-highlight@2.1.11:
+ dependencies:
+ chalk: 4.1.2
+ highlight.js: 10.7.3
+ mz: 2.7.0
+ parse5: 5.1.1
+ parse5-htmlparser2-tree-adapter: 6.0.1
+ yargs: 16.2.0
+
+ cli-spinners@2.9.2: {}
+
+ cli-truncate@4.0.0:
+ dependencies:
+ slice-ansi: 5.0.0
+ string-width: 7.2.0
+
+ cliui@7.0.4:
+ dependencies:
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+ wrap-ansi: 7.0.0
+
+ cliui@8.0.1:
+ dependencies:
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+ wrap-ansi: 7.0.0
+
+ clone@1.0.4: {}
+
+ color-convert@2.0.1:
+ dependencies:
+ color-name: 1.1.4
+
+ color-name@1.1.4: {}
+
+ colorette@2.0.20: {}
+
+ commander@2.9.0:
+ dependencies:
+ graceful-readlink: 1.0.1
+
+ commander@9.5.0: {}
+
+ concat-map@0.0.1: {}
+
+ concat-stream@1.6.2:
+ dependencies:
+ buffer-from: 1.1.2
+ inherits: 2.0.4
+ readable-stream: 2.3.8
+ typedarray: 0.0.6
+
+ confbox@0.1.8: {}
+
+ confbox@0.2.2: {}
+
+ config-chain@1.1.13:
+ dependencies:
+ ini: 1.3.8
+ proto-list: 1.2.4
+
+ configstore@7.0.0:
+ dependencies:
+ atomically: 2.0.3
+ dot-prop: 9.0.0
+ graceful-fs: 4.2.11
+ xdg-basedir: 5.1.0
+
+ consola@3.4.2: {}
+
+ core-util-is@1.0.3: {}
+
+ cross-spawn@7.0.6:
+ dependencies:
+ path-key: 3.1.1
+ shebang-command: 2.0.0
+ which: 2.0.2
+
+ css-select@5.1.0:
+ dependencies:
+ boolbase: 1.0.0
+ css-what: 6.1.0
+ domhandler: 5.0.3
+ domutils: 3.2.2
+ nth-check: 2.1.1
+
+ css-what@6.1.0: {}
+
+ cssom@0.5.0: {}
+
+ debounce@1.2.1: {}
+
+ debug@2.6.9:
+ dependencies:
+ ms: 2.0.0
+
+ debug@4.3.7:
+ dependencies:
+ ms: 2.1.3
+
+ debug@4.4.1:
+ dependencies:
+ ms: 2.1.3
+
+ deep-extend@0.6.0: {}
+
+ default-browser-id@3.0.0:
+ dependencies:
+ bplist-parser: 0.2.0
+ untildify: 4.0.0
+
+ default-browser-id@5.0.0: {}
+
+ default-browser@4.0.0:
+ dependencies:
+ bundle-name: 3.0.0
+ default-browser-id: 3.0.0
+ execa: 7.2.0
+ titleize: 3.0.0
+
+ default-browser@5.2.1:
+ dependencies:
+ bundle-name: 4.1.0
+ default-browser-id: 5.0.0
+
+ defaults@1.0.4:
+ dependencies:
+ clone: 1.0.4
+
+ define-lazy-prop@2.0.0: {}
+
+ define-lazy-prop@3.0.0: {}
+
+ defu@6.1.4: {}
+
+ dequal@2.0.3: {}
+
+ destr@2.0.5: {}
+
+ dom-serializer@2.0.0:
+ dependencies:
+ domelementtype: 2.3.0
+ domhandler: 5.0.3
+ entities: 4.5.0
+
+ domelementtype@2.3.0: {}
+
+ domhandler@5.0.3:
+ dependencies:
+ domelementtype: 2.3.0
+
+ domutils@3.2.2:
+ dependencies:
+ dom-serializer: 2.0.0
+ domelementtype: 2.3.0
+ domhandler: 5.0.3
+
+ dot-prop@9.0.0:
+ dependencies:
+ type-fest: 4.41.0
+
+ dotenv-expand@12.0.2:
+ dependencies:
+ dotenv: 16.5.0
+
+ dotenv@16.5.0: {}
+
+ emoji-regex@10.4.0: {}
+
+ emoji-regex@8.0.0: {}
+
+ end-of-stream@1.4.4:
+ dependencies:
+ once: 1.4.0
+
+ entities@4.5.0: {}
+
+ entities@6.0.0: {}
+
+ environment@1.1.0: {}
+
+ error-ex@1.3.2:
+ dependencies:
+ is-arrayish: 0.2.1
+
+ es-module-lexer@1.7.0: {}
+
+ es6-error@4.1.1: {}
+
+ esbuild@0.25.4:
+ optionalDependencies:
+ '@esbuild/aix-ppc64': 0.25.4
+ '@esbuild/android-arm': 0.25.4
+ '@esbuild/android-arm64': 0.25.4
+ '@esbuild/android-x64': 0.25.4
+ '@esbuild/darwin-arm64': 0.25.4
+ '@esbuild/darwin-x64': 0.25.4
+ '@esbuild/freebsd-arm64': 0.25.4
+ '@esbuild/freebsd-x64': 0.25.4
+ '@esbuild/linux-arm': 0.25.4
+ '@esbuild/linux-arm64': 0.25.4
+ '@esbuild/linux-ia32': 0.25.4
+ '@esbuild/linux-loong64': 0.25.4
+ '@esbuild/linux-mips64el': 0.25.4
+ '@esbuild/linux-ppc64': 0.25.4
+ '@esbuild/linux-riscv64': 0.25.4
+ '@esbuild/linux-s390x': 0.25.4
+ '@esbuild/linux-x64': 0.25.4
+ '@esbuild/netbsd-arm64': 0.25.4
+ '@esbuild/netbsd-x64': 0.25.4
+ '@esbuild/openbsd-arm64': 0.25.4
+ '@esbuild/openbsd-x64': 0.25.4
+ '@esbuild/sunos-x64': 0.25.4
+ '@esbuild/win32-arm64': 0.25.4
+ '@esbuild/win32-ia32': 0.25.4
+ '@esbuild/win32-x64': 0.25.4
+
+ escalade@3.2.0: {}
+
+ escape-goat@4.0.0: {}
+
+ escape-string-regexp@4.0.0: {}
+
+ escape-string-regexp@5.0.0: {}
+
+ estree-walker@3.0.3:
+ dependencies:
+ '@types/estree': 1.0.7
+
+ eventemitter3@5.0.1: {}
+
+ execa@5.1.1:
+ dependencies:
+ cross-spawn: 7.0.6
+ get-stream: 6.0.1
+ human-signals: 2.1.0
+ is-stream: 2.0.1
+ merge-stream: 2.0.0
+ npm-run-path: 4.0.1
+ onetime: 5.1.2
+ signal-exit: 3.0.7
+ strip-final-newline: 2.0.0
+
+ execa@7.2.0:
+ dependencies:
+ cross-spawn: 7.0.6
+ get-stream: 6.0.1
+ human-signals: 4.3.1
+ is-stream: 3.0.0
+ merge-stream: 2.0.0
+ npm-run-path: 5.3.0
+ onetime: 6.0.0
+ signal-exit: 3.0.7
+ strip-final-newline: 3.0.0
+
+ exsolve@1.0.5: {}
+
+ extract-zip@2.0.1:
+ dependencies:
+ debug: 4.4.1
+ get-stream: 5.2.0
+ yauzl: 2.10.0
+ optionalDependencies:
+ '@types/yauzl': 2.10.3
+ transitivePeerDependencies:
+ - supports-color
+
+ fast-glob@3.3.3:
+ dependencies:
+ '@nodelib/fs.stat': 2.0.5
+ '@nodelib/fs.walk': 1.2.8
+ glob-parent: 5.1.2
+ merge2: 1.4.1
+ micromatch: 4.0.8
+
+ fast-redact@3.5.0: {}
+
+ fastq@1.19.1:
+ dependencies:
+ reusify: 1.1.0
+
+ fd-slicer@1.1.0:
+ dependencies:
+ pend: 1.2.0
+
+ fdir@6.4.4(picomatch@4.0.2):
+ optionalDependencies:
+ picomatch: 4.0.2
+
+ filesize@10.1.6: {}
+
+ fill-range@7.1.1:
+ dependencies:
+ to-regex-range: 5.0.1
+
+ firefox-profile@4.7.0:
+ dependencies:
+ adm-zip: 0.5.16
+ fs-extra: 11.3.0
+ ini: 4.1.3
+ minimist: 1.2.8
+ xml2js: 0.6.2
+
+ formdata-node@6.0.3: {}
+
+ fs-extra@11.3.0:
+ dependencies:
+ graceful-fs: 4.2.11
+ jsonfile: 6.1.0
+ universalify: 2.0.1
+
+ fsevents@2.3.3:
+ optional: true
+
+ fx-runner@1.4.0:
+ dependencies:
+ commander: 2.9.0
+ shell-quote: 1.7.3
+ spawn-sync: 1.0.15
+ when: 3.7.7
+ which: 1.2.4
+ winreg: 0.0.12
+
+ get-caller-file@2.0.5: {}
+
+ get-east-asian-width@1.3.0: {}
+
+ get-port-please@3.1.2: {}
+
+ get-stream@5.2.0:
+ dependencies:
+ pump: 3.0.2
+
+ get-stream@6.0.1: {}
+
+ giget@2.0.0:
+ dependencies:
+ citty: 0.1.6
+ consola: 3.4.2
+ defu: 6.1.4
+ node-fetch-native: 1.6.6
+ nypm: 0.6.0
+ pathe: 2.0.3
+
+ glob-parent@5.1.2:
+ dependencies:
+ is-glob: 4.0.3
+
+ glob-to-regexp@0.4.1: {}
+
+ global-directory@4.0.1:
+ dependencies:
+ ini: 4.1.1
+
+ graceful-fs@4.2.10: {}
+
+ graceful-fs@4.2.11: {}
+
+ graceful-readlink@1.0.1: {}
+
+ growly@1.3.0: {}
+
+ has-flag@4.0.0: {}
+
+ highlight.js@10.7.3: {}
+
+ hookable@5.5.3: {}
+
+ html-escaper@3.0.3: {}
+
+ htmlparser2@10.0.0:
+ dependencies:
+ domelementtype: 2.3.0
+ domhandler: 5.0.3
+ domutils: 3.2.2
+ entities: 6.0.0
+
+ human-signals@2.1.0: {}
+
+ human-signals@4.3.1: {}
+
+ ieee754@1.2.1: {}
+
+ immediate@3.0.6: {}
+
+ import-meta-resolve@4.1.0: {}
+
+ inherits@2.0.4: {}
+
+ ini@1.3.8: {}
+
+ ini@4.1.1: {}
+
+ ini@4.1.3: {}
+
+ is-absolute@0.1.7:
+ dependencies:
+ is-relative: 0.1.3
+
+ is-arrayish@0.2.1: {}
+
+ is-docker@2.2.1: {}
+
+ is-docker@3.0.0: {}
+
+ is-extglob@2.1.1: {}
+
+ is-fullwidth-code-point@3.0.0: {}
+
+ is-fullwidth-code-point@4.0.0: {}
+
+ is-fullwidth-code-point@5.0.0:
+ dependencies:
+ get-east-asian-width: 1.3.0
+
+ is-glob@4.0.3:
+ dependencies:
+ is-extglob: 2.1.1
+
+ is-in-ci@1.0.0: {}
+
+ is-inside-container@1.0.0:
+ dependencies:
+ is-docker: 3.0.0
+
+ is-installed-globally@1.0.0:
+ dependencies:
+ global-directory: 4.0.1
+ is-path-inside: 4.0.0
+
+ is-interactive@2.0.0: {}
+
+ is-npm@6.0.0: {}
+
+ is-number@7.0.0: {}
+
+ is-path-inside@4.0.0: {}
+
+ is-plain-object@2.0.4:
+ dependencies:
+ isobject: 3.0.1
+
+ is-potential-custom-element-name@1.0.1: {}
+
+ is-primitive@3.0.1: {}
+
+ is-relative@0.1.3: {}
+
+ is-stream@2.0.1: {}
+
+ is-stream@3.0.0: {}
+
+ is-unicode-supported@1.3.0: {}
+
+ is-unicode-supported@2.1.0: {}
+
+ is-wsl@2.2.0:
+ dependencies:
+ is-docker: 2.2.1
+
+ is-wsl@3.1.0:
+ dependencies:
+ is-inside-container: 1.0.0
+
+ isarray@1.0.0: {}
+
+ isexe@1.1.2: {}
+
+ isexe@2.0.0: {}
+
+ isobject@3.0.1: {}
+
+ jiti@2.4.2: {}
+
+ js-tokens@4.0.0: {}
+
+ js-tokens@9.0.1: {}
+
+ json-parse-even-better-errors@3.0.2: {}
+
+ json5@2.2.3: {}
+
+ jsonfile@6.1.0:
+ dependencies:
+ universalify: 2.0.1
+ optionalDependencies:
+ graceful-fs: 4.2.11
+
+ jszip@3.10.1:
+ dependencies:
+ lie: 3.3.0
+ pako: 1.0.11
+ readable-stream: 2.3.8
+ setimmediate: 1.0.5
+
+ kleur@3.0.3: {}
+
+ ky@1.8.1: {}
+
+ latest-version@9.0.0:
+ dependencies:
+ package-json: 10.0.1
+
+ lie@3.3.0:
+ dependencies:
+ immediate: 3.0.6
+
+ lighthouse-logger@2.0.1:
+ dependencies:
+ debug: 2.6.9
+ marky: 1.3.0
+ transitivePeerDependencies:
+ - supports-color
+
+ lines-and-columns@2.0.4: {}
+
+ linkedom@0.18.10:
+ dependencies:
+ css-select: 5.1.0
+ cssom: 0.5.0
+ html-escaper: 3.0.3
+ htmlparser2: 10.0.0
+ uhyphen: 0.2.0
+
+ listr2@8.3.3:
+ dependencies:
+ cli-truncate: 4.0.0
+ colorette: 2.0.20
+ eventemitter3: 5.0.1
+ log-update: 6.1.0
+ rfdc: 1.4.1
+ wrap-ansi: 9.0.0
+
+ local-pkg@1.1.1:
+ dependencies:
+ mlly: 1.7.4
+ pkg-types: 2.1.0
+ quansync: 0.2.10
+
+ lodash.camelcase@4.3.0: {}
+
+ lodash.kebabcase@4.1.1: {}
+
+ lodash.merge@4.6.2: {}
+
+ lodash.snakecase@4.1.1: {}
+
+ log-symbols@5.1.0:
+ dependencies:
+ chalk: 5.4.1
+ is-unicode-supported: 1.3.0
+
+ log-symbols@6.0.0:
+ dependencies:
+ chalk: 5.4.1
+ is-unicode-supported: 1.3.0
+
+ log-update@6.1.0:
+ dependencies:
+ ansi-escapes: 7.0.0
+ cli-cursor: 5.0.0
+ slice-ansi: 7.1.0
+ strip-ansi: 7.1.0
+ wrap-ansi: 9.0.0
+
+ magic-string@0.30.17:
+ dependencies:
+ '@jridgewell/sourcemap-codec': 1.5.0
+
+ magicast@0.3.5:
+ dependencies:
+ '@babel/parser': 7.27.2
+ '@babel/types': 7.27.1
+ source-map-js: 1.2.1
+
+ make-error@1.3.6: {}
+
+ many-keys-map@2.0.1: {}
+
+ mark.js@8.11.1: {}
+
+ marky@1.3.0: {}
+
+ merge-stream@2.0.0: {}
+
+ merge2@1.4.1: {}
+
+ micromatch@4.0.8:
+ dependencies:
+ braces: 3.0.3
+ picomatch: 2.3.1
+
+ mimic-fn@2.1.0: {}
+
+ mimic-fn@4.0.0: {}
+
+ mimic-function@5.0.1: {}
+
+ minimatch@10.0.1:
+ dependencies:
+ brace-expansion: 2.0.1
+
+ minimatch@3.1.2:
+ dependencies:
+ brace-expansion: 1.1.11
+
+ minimist@1.2.8: {}
+
+ mlly@1.7.4:
+ dependencies:
+ acorn: 8.14.1
+ pathe: 2.0.3
+ pkg-types: 1.3.1
+ ufo: 1.6.1
+
+ ms@2.0.0: {}
+
+ ms@2.1.3: {}
+
+ multimatch@6.0.0:
+ dependencies:
+ '@types/minimatch': 3.0.5
+ array-differ: 4.0.0
+ array-union: 3.0.1
+ minimatch: 3.1.2
+
+ mz@2.7.0:
+ dependencies:
+ any-promise: 1.3.0
+ object-assign: 4.1.1
+ thenify-all: 1.6.0
+
+ nano-spawn@0.2.1: {}
+
+ nanoid@3.3.11: {}
+
+ node-fetch-native@1.6.6: {}
+
+ node-forge@1.3.1: {}
+
+ node-notifier@10.0.1:
+ dependencies:
+ growly: 1.3.0
+ is-wsl: 2.2.0
+ semver: 7.7.2
+ shellwords: 0.1.1
+ uuid: 8.3.2
+ which: 2.0.2
+
+ normalize-path@3.0.0: {}
+
+ npm-run-path@4.0.1:
+ dependencies:
+ path-key: 3.1.1
+
+ npm-run-path@5.3.0:
+ dependencies:
+ path-key: 4.0.0
+
+ nth-check@2.1.1:
+ dependencies:
+ boolbase: 1.0.0
+
+ nypm@0.6.0:
+ dependencies:
+ citty: 0.1.6
+ consola: 3.4.2
+ pathe: 2.0.3
+ pkg-types: 2.1.0
+ tinyexec: 0.3.2
+
+ object-assign@4.1.1: {}
+
+ ofetch@1.4.1:
+ dependencies:
+ destr: 2.0.5
+ node-fetch-native: 1.6.6
+ ufo: 1.6.1
+
+ ohash@2.0.11: {}
+
+ on-exit-leak-free@2.1.2: {}
+
+ once@1.4.0:
+ dependencies:
+ wrappy: 1.0.2
+
+ onetime@5.1.2:
+ dependencies:
+ mimic-fn: 2.1.0
+
+ onetime@6.0.0:
+ dependencies:
+ mimic-fn: 4.0.0
+
+ onetime@7.0.0:
+ dependencies:
+ mimic-function: 5.0.1
+
+ open@10.1.2:
+ dependencies:
+ default-browser: 5.2.1
+ define-lazy-prop: 3.0.0
+ is-inside-container: 1.0.0
+ is-wsl: 3.1.0
+
+ open@8.4.2:
+ dependencies:
+ define-lazy-prop: 2.0.0
+ is-docker: 2.2.1
+ is-wsl: 2.2.0
+
+ open@9.1.0:
+ dependencies:
+ default-browser: 4.0.0
+ define-lazy-prop: 3.0.0
+ is-inside-container: 1.0.0
+ is-wsl: 2.2.0
+
+ ora@6.3.1:
+ dependencies:
+ chalk: 5.4.1
+ cli-cursor: 4.0.0
+ cli-spinners: 2.9.2
+ is-interactive: 2.0.0
+ is-unicode-supported: 1.3.0
+ log-symbols: 5.1.0
+ stdin-discarder: 0.1.0
+ strip-ansi: 7.1.0
+ wcwidth: 1.0.1
+
+ ora@8.2.0:
+ dependencies:
+ chalk: 5.4.1
+ cli-cursor: 5.0.0
+ cli-spinners: 2.9.2
+ is-interactive: 2.0.0
+ is-unicode-supported: 2.1.0
+ log-symbols: 6.0.0
+ stdin-discarder: 0.2.2
+ string-width: 7.2.0
+ strip-ansi: 7.1.0
+
+ os-shim@0.1.3: {}
+
+ package-json@10.0.1:
+ dependencies:
+ ky: 1.8.1
+ registry-auth-token: 5.1.0
+ registry-url: 6.0.1
+ semver: 7.7.2
+
+ pako@1.0.11: {}
+
+ parse-json@7.1.1:
+ dependencies:
+ '@babel/code-frame': 7.27.1
+ error-ex: 1.3.2
+ json-parse-even-better-errors: 3.0.2
+ lines-and-columns: 2.0.4
+ type-fest: 3.13.1
+
+ parse5-htmlparser2-tree-adapter@6.0.1:
+ dependencies:
+ parse5: 6.0.1
+
+ parse5@5.1.1: {}
+
+ parse5@6.0.1: {}
+
+ path-key@3.1.1: {}
+
+ path-key@4.0.0: {}
+
+ pathe@2.0.3: {}
+
+ pend@1.2.0: {}
+
+ perfect-debounce@1.0.0: {}
+
+ picocolors@1.1.1: {}
+
+ picomatch@2.3.1: {}
+
+ picomatch@4.0.2: {}
+
+ pino-abstract-transport@2.0.0:
+ dependencies:
+ split2: 4.2.0
+
+ pino-std-serializers@7.0.0: {}
+
+ pino@9.6.0:
+ dependencies:
+ atomic-sleep: 1.0.0
+ fast-redact: 3.5.0
+ on-exit-leak-free: 2.1.2
+ pino-abstract-transport: 2.0.0
+ pino-std-serializers: 7.0.0
+ process-warning: 4.0.1
+ quick-format-unescaped: 4.0.4
+ real-require: 0.2.0
+ safe-stable-stringify: 2.5.0
+ sonic-boom: 4.2.0
+ thread-stream: 3.1.0
+
+ pkg-types@1.3.1:
+ dependencies:
+ confbox: 0.1.8
+ mlly: 1.7.4
+ pathe: 2.0.3
+
+ pkg-types@2.1.0:
+ dependencies:
+ confbox: 0.2.2
+ exsolve: 1.0.5
+ pathe: 2.0.3
+
+ postcss@8.5.3:
+ dependencies:
+ nanoid: 3.3.11
+ picocolors: 1.1.1
+ source-map-js: 1.2.1
+
+ process-nextick-args@2.0.1: {}
+
+ process-warning@4.0.1: {}
+
+ promise-toolbox@0.21.0:
+ dependencies:
+ make-error: 1.3.6
+
+ prompts@2.4.2:
+ dependencies:
+ kleur: 3.0.3
+ sisteransi: 1.0.5
+
+ proto-list@1.2.4: {}
+
+ publish-browser-extension@3.0.0:
+ dependencies:
+ cac: 6.7.14
+ cli-highlight: 2.1.11
+ consola: 3.4.2
+ dotenv: 16.5.0
+ extract-zip: 2.0.1
+ formdata-node: 6.0.3
+ listr2: 8.3.3
+ lodash.camelcase: 4.3.0
+ lodash.kebabcase: 4.1.1
+ lodash.snakecase: 4.1.1
+ ofetch: 1.4.1
+ open: 9.1.0
+ ora: 6.3.1
+ prompts: 2.4.2
+ zod: 3.25.28
+ transitivePeerDependencies:
+ - supports-color
+
+ pump@3.0.2:
+ dependencies:
+ end-of-stream: 1.4.4
+ once: 1.4.0
+
+ pupa@3.1.0:
+ dependencies:
+ escape-goat: 4.0.0
+
+ quansync@0.2.10: {}
+
+ queue-microtask@1.2.3: {}
+
+ quick-format-unescaped@4.0.4: {}
+
+ rc9@2.1.2:
+ dependencies:
+ defu: 6.1.4
+ destr: 2.0.5
+
+ rc@1.2.8:
+ dependencies:
+ deep-extend: 0.6.0
+ ini: 1.3.8
+ minimist: 1.2.8
+ strip-json-comments: 2.0.1
+
+ readable-stream@2.3.8:
+ dependencies:
+ core-util-is: 1.0.3
+ inherits: 2.0.4
+ isarray: 1.0.0
+ process-nextick-args: 2.0.1
+ safe-buffer: 5.1.2
+ string_decoder: 1.1.1
+ util-deprecate: 1.0.2
+
+ readable-stream@3.6.2:
+ dependencies:
+ inherits: 2.0.4
+ string_decoder: 1.3.0
+ util-deprecate: 1.0.2
+
+ readdirp@4.1.2: {}
+
+ real-require@0.2.0: {}
+
+ regenerator-runtime@0.14.1: {}
+
+ registry-auth-token@5.1.0:
+ dependencies:
+ '@pnpm/npm-conf': 2.3.1
+
+ registry-url@6.0.1:
+ dependencies:
+ rc: 1.2.8
+
+ require-directory@2.1.1: {}
+
+ restore-cursor@4.0.0:
+ dependencies:
+ onetime: 5.1.2
+ signal-exit: 3.0.7
+
+ restore-cursor@5.1.0:
+ dependencies:
+ onetime: 7.0.0
+ signal-exit: 4.1.0
+
+ reusify@1.1.0: {}
+
+ rfdc@1.4.1: {}
+
+ rollup@4.41.1:
+ dependencies:
+ '@types/estree': 1.0.7
+ optionalDependencies:
+ '@rollup/rollup-android-arm-eabi': 4.41.1
+ '@rollup/rollup-android-arm64': 4.41.1
+ '@rollup/rollup-darwin-arm64': 4.41.1
+ '@rollup/rollup-darwin-x64': 4.41.1
+ '@rollup/rollup-freebsd-arm64': 4.41.1
+ '@rollup/rollup-freebsd-x64': 4.41.1
+ '@rollup/rollup-linux-arm-gnueabihf': 4.41.1
+ '@rollup/rollup-linux-arm-musleabihf': 4.41.1
+ '@rollup/rollup-linux-arm64-gnu': 4.41.1
+ '@rollup/rollup-linux-arm64-musl': 4.41.1
+ '@rollup/rollup-linux-loongarch64-gnu': 4.41.1
+ '@rollup/rollup-linux-powerpc64le-gnu': 4.41.1
+ '@rollup/rollup-linux-riscv64-gnu': 4.41.1
+ '@rollup/rollup-linux-riscv64-musl': 4.41.1
+ '@rollup/rollup-linux-s390x-gnu': 4.41.1
+ '@rollup/rollup-linux-x64-gnu': 4.41.1
+ '@rollup/rollup-linux-x64-musl': 4.41.1
+ '@rollup/rollup-win32-arm64-msvc': 4.41.1
+ '@rollup/rollup-win32-ia32-msvc': 4.41.1
+ '@rollup/rollup-win32-x64-msvc': 4.41.1
+ fsevents: 2.3.3
+
+ run-applescript@5.0.0:
+ dependencies:
+ execa: 5.1.1
+
+ run-applescript@7.0.0: {}
+
+ run-parallel@1.2.0:
+ dependencies:
+ queue-microtask: 1.2.3
+
+ safe-buffer@5.1.2: {}
+
+ safe-buffer@5.2.1: {}
+
+ safe-stable-stringify@2.5.0: {}
+
+ sax@1.4.1: {}
+
+ scule@1.3.0: {}
+
+ semver@7.7.2: {}
+
+ set-value@4.1.0:
+ dependencies:
+ is-plain-object: 2.0.4
+ is-primitive: 3.0.1
+
+ setimmediate@1.0.5: {}
+
+ shebang-command@2.0.0:
+ dependencies:
+ shebang-regex: 3.0.0
+
+ shebang-regex@3.0.0: {}
+
+ shell-quote@1.7.3: {}
+
+ shellwords@0.1.1: {}
+
+ signal-exit@3.0.7: {}
+
+ signal-exit@4.1.0: {}
+
+ sisteransi@1.0.5: {}
+
+ slice-ansi@5.0.0:
+ dependencies:
+ ansi-styles: 6.2.1
+ is-fullwidth-code-point: 4.0.0
+
+ slice-ansi@7.1.0:
+ dependencies:
+ ansi-styles: 6.2.1
+ is-fullwidth-code-point: 5.0.0
+
+ sonic-boom@4.2.0:
+ dependencies:
+ atomic-sleep: 1.0.0
+
+ source-map-js@1.2.1: {}
+
+ source-map-support@0.5.21:
+ dependencies:
+ buffer-from: 1.1.2
+ source-map: 0.6.1
+
+ source-map@0.6.1: {}
+
+ source-map@0.7.4: {}
+
+ spawn-sync@1.0.15:
+ dependencies:
+ concat-stream: 1.6.2
+ os-shim: 0.1.3
+
+ split2@4.2.0: {}
+
+ split@1.0.1:
+ dependencies:
+ through: 2.3.8
+
+ stdin-discarder@0.1.0:
+ dependencies:
+ bl: 5.1.0
+
+ stdin-discarder@0.2.2: {}
+
+ string-width@4.2.3:
+ dependencies:
+ emoji-regex: 8.0.0
+ is-fullwidth-code-point: 3.0.0
+ strip-ansi: 6.0.1
+
+ string-width@7.2.0:
+ dependencies:
+ emoji-regex: 10.4.0
+ get-east-asian-width: 1.3.0
+ strip-ansi: 7.1.0
+
+ string_decoder@1.1.1:
+ dependencies:
+ safe-buffer: 5.1.2
+
+ string_decoder@1.3.0:
+ dependencies:
+ safe-buffer: 5.2.1
+
+ strip-ansi@6.0.1:
+ dependencies:
+ ansi-regex: 5.0.1
+
+ strip-ansi@7.1.0:
+ dependencies:
+ ansi-regex: 6.1.0
+
+ strip-bom@5.0.0: {}
+
+ strip-final-newline@2.0.0: {}
+
+ strip-final-newline@3.0.0: {}
+
+ strip-json-comments@2.0.1: {}
+
+ strip-json-comments@5.0.1: {}
+
+ strip-literal@3.0.0:
+ dependencies:
+ js-tokens: 9.0.1
+
+ stubborn-fs@1.2.5: {}
+
+ supports-color@7.2.0:
+ dependencies:
+ has-flag: 4.0.0
+
+ thenify-all@1.6.0:
+ dependencies:
+ thenify: 3.3.1
+
+ thenify@3.3.1:
+ dependencies:
+ any-promise: 1.3.0
+
+ thread-stream@3.1.0:
+ dependencies:
+ real-require: 0.2.0
+
+ through@2.3.8: {}
+
+ tinyexec@0.3.2: {}
+
+ tinyglobby@0.2.14:
+ dependencies:
+ fdir: 6.4.4(picomatch@4.0.2)
+ picomatch: 4.0.2
+
+ titleize@3.0.0: {}
+
+ tmp@0.2.3: {}
+
+ to-regex-range@5.0.1:
+ dependencies:
+ is-number: 7.0.0
+
+ tslib@2.8.1: {}
+
+ type-fest@3.13.1: {}
+
+ type-fest@4.41.0: {}
+
+ typedarray@0.0.6: {}
+
+ typescript@5.8.3: {}
+
+ ufo@1.6.1: {}
+
+ uhyphen@0.2.0: {}
+
+ undici-types@6.21.0: {}
+
+ unimport@5.0.1:
+ dependencies:
+ acorn: 8.14.1
+ escape-string-regexp: 5.0.0
+ estree-walker: 3.0.3
+ local-pkg: 1.1.1
+ magic-string: 0.30.17
+ mlly: 1.7.4
+ pathe: 2.0.3
+ picomatch: 4.0.2
+ pkg-types: 2.1.0
+ scule: 1.3.0
+ strip-literal: 3.0.0
+ tinyglobby: 0.2.14
+ unplugin: 2.3.4
+ unplugin-utils: 0.2.4
+
+ universalify@2.0.1: {}
+
+ unplugin-utils@0.2.4:
+ dependencies:
+ pathe: 2.0.3
+ picomatch: 4.0.2
+
+ unplugin@2.3.4:
+ dependencies:
+ acorn: 8.14.1
+ picomatch: 4.0.2
+ webpack-virtual-modules: 0.6.2
+
+ untildify@4.0.0: {}
+
+ update-notifier@7.3.1:
+ dependencies:
+ boxen: 8.0.1
+ chalk: 5.4.1
+ configstore: 7.0.0
+ is-in-ci: 1.0.0
+ is-installed-globally: 1.0.0
+ is-npm: 6.0.0
+ latest-version: 9.0.0
+ pupa: 3.1.0
+ semver: 7.7.2
+ xdg-basedir: 5.1.0
+
+ util-deprecate@1.0.2: {}
+
+ uuid@8.3.2: {}
+
+ vite-node@3.1.4(@types/node@22.15.21)(jiti@2.4.2):
+ dependencies:
+ cac: 6.7.14
+ debug: 4.4.1
+ es-module-lexer: 1.7.0
+ pathe: 2.0.3
+ vite: 6.3.5(@types/node@22.15.21)(jiti@2.4.2)
+ transitivePeerDependencies:
+ - '@types/node'
+ - jiti
+ - less
+ - lightningcss
+ - sass
+ - sass-embedded
+ - stylus
+ - sugarss
+ - supports-color
+ - terser
+ - tsx
+ - yaml
+
+ vite@6.3.5(@types/node@22.15.21)(jiti@2.4.2):
+ dependencies:
+ esbuild: 0.25.4
+ fdir: 6.4.4(picomatch@4.0.2)
+ picomatch: 4.0.2
+ postcss: 8.5.3
+ rollup: 4.41.1
+ tinyglobby: 0.2.14
+ optionalDependencies:
+ '@types/node': 22.15.21
+ fsevents: 2.3.3
+ jiti: 2.4.2
+
+ watchpack@2.4.2:
+ dependencies:
+ glob-to-regexp: 0.4.1
+ graceful-fs: 4.2.11
+
+ wcwidth@1.0.1:
+ dependencies:
+ defaults: 1.0.4
+
+ web-ext-run@0.2.3:
+ dependencies:
+ '@babel/runtime': 7.27.0
+ '@devicefarmer/adbkit': 3.3.8
+ chrome-launcher: 1.1.2
+ debounce: 1.2.1
+ es6-error: 4.1.1
+ firefox-profile: 4.7.0
+ fx-runner: 1.4.0
+ multimatch: 6.0.0
+ node-notifier: 10.0.1
+ parse-json: 7.1.1
+ pino: 9.6.0
+ promise-toolbox: 0.21.0
+ set-value: 4.1.0
+ source-map-support: 0.5.21
+ strip-bom: 5.0.0
+ strip-json-comments: 5.0.1
+ tmp: 0.2.3
+ update-notifier: 7.3.1
+ watchpack: 2.4.2
+ ws: 8.18.1
+ zip-dir: 2.0.0
+ transitivePeerDependencies:
+ - bufferutil
+ - supports-color
+ - utf-8-validate
+
+ webextension-polyfill@0.12.0: {}
+
+ webpack-virtual-modules@0.6.2: {}
+
+ when-exit@2.1.4: {}
+
+ when@3.7.7: {}
+
+ which@1.2.4:
+ dependencies:
+ is-absolute: 0.1.7
+ isexe: 1.1.2
+
+ which@2.0.2:
+ dependencies:
+ isexe: 2.0.0
+
+ widest-line@5.0.0:
+ dependencies:
+ string-width: 7.2.0
+
+ winreg@0.0.12: {}
+
+ wrap-ansi@7.0.0:
+ dependencies:
+ ansi-styles: 4.3.0
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+
+ wrap-ansi@9.0.0:
+ dependencies:
+ ansi-styles: 6.2.1
+ string-width: 7.2.0
+ strip-ansi: 7.1.0
+
+ wrappy@1.0.2: {}
+
+ ws@8.18.1: {}
+
+ wxt@0.20.6(@types/node@22.15.21)(jiti@2.4.2)(rollup@4.41.1):
+ dependencies:
+ '@1natsu/wait-element': 4.1.2
+ '@aklinker1/rollup-plugin-visualizer': 5.12.0(rollup@4.41.1)
+ '@webext-core/fake-browser': 1.3.2
+ '@webext-core/isolated-element': 1.1.2
+ '@webext-core/match-patterns': 1.0.3
+ '@wxt-dev/browser': 0.0.317
+ '@wxt-dev/storage': 1.1.1
+ async-mutex: 0.5.0
+ c12: 3.0.4(magicast@0.3.5)
+ cac: 6.7.14
+ chokidar: 4.0.3
+ ci-info: 4.2.0
+ consola: 3.4.2
+ defu: 6.1.4
+ dotenv: 16.5.0
+ dotenv-expand: 12.0.2
+ esbuild: 0.25.4
+ fast-glob: 3.3.3
+ filesize: 10.1.6
+ fs-extra: 11.3.0
+ get-port-please: 3.1.2
+ giget: 2.0.0
+ hookable: 5.5.3
+ import-meta-resolve: 4.1.0
+ is-wsl: 3.1.0
+ json5: 2.2.3
+ jszip: 3.10.1
+ linkedom: 0.18.10
+ magicast: 0.3.5
+ minimatch: 10.0.1
+ nano-spawn: 0.2.1
+ normalize-path: 3.0.0
+ nypm: 0.6.0
+ ohash: 2.0.11
+ open: 10.1.2
+ ora: 8.2.0
+ perfect-debounce: 1.0.0
+ picocolors: 1.1.1
+ prompts: 2.4.2
+ publish-browser-extension: 3.0.0
+ scule: 1.3.0
+ unimport: 5.0.1
+ vite: 6.3.5(@types/node@22.15.21)(jiti@2.4.2)
+ vite-node: 3.1.4(@types/node@22.15.21)(jiti@2.4.2)
+ web-ext-run: 0.2.3
+ transitivePeerDependencies:
+ - '@types/node'
+ - bufferutil
+ - jiti
+ - less
+ - lightningcss
+ - rollup
+ - sass
+ - sass-embedded
+ - stylus
+ - sugarss
+ - supports-color
+ - terser
+ - tsx
+ - utf-8-validate
+ - yaml
+
+ xdg-basedir@5.1.0: {}
+
+ xml2js@0.6.2:
+ dependencies:
+ sax: 1.4.1
+ xmlbuilder: 11.0.1
+
+ xmlbuilder@11.0.1: {}
+
+ y18n@5.0.8: {}
+
+ yargs-parser@20.2.9: {}
+
+ yargs-parser@21.1.1: {}
+
+ yargs@16.2.0:
+ dependencies:
+ cliui: 7.0.4
+ escalade: 3.2.0
+ get-caller-file: 2.0.5
+ require-directory: 2.1.1
+ string-width: 4.2.3
+ y18n: 5.0.8
+ yargs-parser: 20.2.9
+
+ yargs@17.7.2:
+ dependencies:
+ cliui: 8.0.1
+ escalade: 3.2.0
+ get-caller-file: 2.0.5
+ require-directory: 2.1.1
+ string-width: 4.2.3
+ y18n: 5.0.8
+ yargs-parser: 21.1.1
+
+ yauzl@2.10.0:
+ dependencies:
+ buffer-crc32: 0.2.13
+ fd-slicer: 1.1.0
+
+ zip-dir@2.0.0:
+ dependencies:
+ async: 3.2.6
+ jszip: 3.10.1
+
+ zod@3.25.28: {}
diff --git a/public/_locales/en/messages.json b/public/_locales/en/messages.json
new file mode 100644
index 0000000..89f560a
--- /dev/null
+++ b/public/_locales/en/messages.json
@@ -0,0 +1,393 @@
+{
+ "extensionDescription": {
+ "description": "The description of the extension",
+ "message": "HTTP Header Spy enables you to inspect request- response headers and cookies right after page load with no extra clicks."
+ },
+ "extensionName": {
+ "description": "The name of the extension",
+ "message": "HTTP Header Spy"
+ },
+ "extensionNameShort": {
+ "description": "The short name of the extension",
+ "message": "HTTP Headers"
+ },
+ "optionsDisplayName": {
+ "description": "Menu title for options page",
+ "message": "Options"
+ },
+ "aboutDisplayName": {
+ "description": "Menu title for about page",
+ "message": "About"
+ },
+ "plansDisplayName": {
+ "description": "Menu title for 'Enable extra options' page",
+ "message": "Enable extra options"
+ },
+
+ "buttonAdd": {
+ "description": "Add button text",
+ "message": "Add"
+ },
+ "buttonOptions": {
+ "description": "Options page button text",
+ "message": "Options page"
+ },
+
+ "optionsPageDisplayOptions": {
+ "description": "Display options",
+ "message": "Display options"
+ },
+ "optionsPageDisplayOptionsPressEscapeToHidePanels": {
+ "description": "Press the ESC key to hide panels.",
+ "message": "Press the ESC key to hide panels."
+ },
+ "optionsPageDisplayOptionsAutoHide": {
+ "description": "Press the ESC key to hide panels.",
+ "message": "When auto-hide is enabled, the filter bar will not be shown."
+ },
+ "optionsPageDisplayOptionsShowIn": {
+ "description": "___Show in___ [mode]",
+ "message": "Show in"
+ },
+ "renderModeNormal": {
+ "description": "Show in [___normal___]",
+ "message": "normal"
+ },
+ "renderModeMicro": {
+ "description": "Show in [___micro___]",
+ "message": "micro"
+ },
+ "renderModeDisabled": {
+ "description": "Show in [___disabled___]",
+ "message": "disabled"
+ },
+ "optionsPageDisplayOptionsModeInThe": {
+ "description": "Show in [mode] ___mode, in the___",
+ "message": "mode, in the"
+ },
+ "locationTopLeftCorner": {
+ "description": "mode, in the [___top left corner___]",
+ "message": "top left corner"
+ },
+ "locationTopRightCorner": {
+ "description": "mode, in the [___top right corner___]",
+ "message": "top right corner"
+ },
+ "locationBottomLeftCorner": {
+ "description": "mode, in the [___bottom left corner___]",
+ "message": "bottom left corner"
+ },
+ "locationBottomRightCorner": {
+ "description": "mode, in the [___bottom right corner___]",
+ "message": "bottom right corner"
+ },
+ "optionsPageDisplayOptionsModeUsingA": {
+ "description": "mode, in the [bottom right corner] ___using a___",
+ "message": "using a"
+ },
+ "themeDark": {
+ "description": "using a [___dark theme___]",
+ "message": "dark theme"
+ },
+ "themeLight": {
+ "description": "using a [___light theme___]",
+ "message": "light theme"
+ },
+ "optionsPageDisplayOptionsAndShowThe": {
+ "description": "using a [light theme] ___and show the___ [x] most recent requests",
+ "message": "and show the"
+ },
+ "optionsPageDisplayOptionsMostRecentRequests": {
+ "description": "using a [light theme] and show the [x] ___most recent requests___",
+ "message": "most recent requests"
+ },
+ "doAutoHidePanels": {
+ "description": "[___Do auto-hide panels___] after [x] seconds",
+ "message": "Do auto-hide panels"
+ },
+ "doNotAutoHidePanels": {
+ "description": "[___Do not auto-hide panels___] after [x] seconds",
+ "message": "Do not auto-hide panels"
+ },
+ "optionsPageDisplayOptionsAutoHideAfter": {
+ "description": "[Do auto-hide panels] ___ after___ [x] seconds",
+ "message": "after"
+ },
+ "optionsPageDisplayOptionsAutoHideSeconds": {
+ "description": "[Do auto-hide panels] after [x] ___seconds___",
+ "message": "seconds"
+ },
+
+ "optionsPageHideRequestHeaders": {
+ "description": "Hide request headers",
+ "message": "Hide request headers"
+ },
+ "optionsPageHideRequestHeadersDescription": {
+ "description": "Request headers (or patterns thereof) that will not be displayed.",
+ "message": "Request headers (or patterns thereof) that will not be displayed."
+ },
+
+ "optionsPageHideResponseHeaders": {
+ "description": "Hide response headers",
+ "message": "Hide response headers"
+ },
+ "optionsPageHideResponseHeadersDescription": {
+ "description": "Response headers (or patterns thereof) that will not be displayed.",
+ "message": "Response headers (or patterns thereof) that will not be displayed."
+ },
+
+ "optionsPageMicroModeHeaders": {
+ "description": "Headers to show in Micro mode",
+ "message": "Headers to show in Micro mode"
+ },
+ "optionsPageMicroModeHeadersDescription": {
+ "description": "Response headers (or patterns thereof) that will be shown in micro mode.",
+ "message": "Response headers (or patterns thereof) that will be shown in micro mode."
+ },
+ "optionsPageStringsToHightlight": {
+ "description": "Strings to highlight",
+ "message": "Strings to highlight"
+ },
+ "optionsPageStringsToHightlightDescription": {
+ "description": "Headers (or patterns thereof) that will be",
+ "message": "Headers (or patterns thereof) that will be"
+ },
+ "optionsPageStringsToHightlightDescriptionHighlighted": {
+ "description": "Headers (or patterns thereof) that will be ___highlighted___",
+ "message": "highlighted"
+ },
+
+ "plansPageTitle": {
+ "description": "Enable extra options",
+ "message": "Enable extra options"
+ },
+ "plansPageYouCan": {
+ "description": "___You can___ test all these great features every first 15 minutes of every hour:",
+ "message": "You can"
+ },
+ "plansPageTest": {
+ "description": "You can ___test___ all these great features every first 15 minutes of every hour:",
+ "message": "test"
+ },
+ "plansPageTheseFeatures": {
+ "description": "You can test ___all these great features___ every first 15 minutes of every hour:",
+ "message": "all these extra features"
+ },
+ "plansPageEveryFirst": {
+ "description": "You can test all these great features ___every first 15 minutes___ of every hour:",
+ "message": "every first 15 minutes"
+ },
+ "plansPageOfEveryHour": {
+ "description": "You can test all these great features every first 15 minutes ___of every hour___:",
+ "message": "of every hour"
+ },
+ "plansPageOptionServerIp": {
+ "description": "Server IP address",
+ "message": "Server IP address"
+ },
+ "plansPageOptionSubFrameRequests": {
+ "description": "Sub-frame requests",
+ "message": "Sub-frame requests"
+ },
+ "plansPageOptionXhrRequests": {
+ "description": "XML HTTP Requests (XHR / AJAX)",
+ "message": "XML HTTP Requests (XHR / AJAX)"
+ },
+ "plansPageOptionRequestTimes": {
+ "description": "Request times: time to headers received, time to first byte and time to complete",
+ "message": "Request times: time to headers received, time to first byte and time to complete"
+ },
+ "plansPageOptionFilterBar": {
+ "description": "Use the filter bar to filter the headers",
+ "message": "Use the filter bar to filter the headers"
+ },
+ "plansPageOneTimeBeerSupport": {
+ "description": "One-time beer support",
+ "message": "One-time beer support"
+ },
+ "plansPageOneTimePizzaSupport": {
+ "description": "One-time pizza support",
+ "message": "One-time pizza support"
+ },
+ "plansPageSubscriptions": {
+ "description": "Subscriptions",
+ "message": "Subscriptions"
+ },
+ "plansPageMangeSubscriptions": {
+ "description": "Manage subscriptions",
+ "message": "Manage subscriptions"
+ },
+ "plansPageEnableFeatures": {
+ "description": "___If you want to enable these features___ permanently, please support further development by donating me some beer/pizza:",
+ "message": "If you want to enable these features"
+ },
+ "plansPageEnableFeaturesPermanently": {
+ "description": "If you want to enable these features ___permanently___, please support further development by donating me some beer/pizza:",
+ "message": "permanently"
+ },
+ "plansPageEnableFeaturesPleaseSupport": {
+ "description": "If you want to enable these features permanently___, please support further development by donating me some beer/pizza___:",
+ "message": ", please support further development by donating me some beer/pizza"
+ },
+ "plansPageIWillSupportYouWith": {
+ "description": "___I'll support you with___ [x] pizzas",
+ "message": "I'll support you with"
+ },
+ "plansPageBeers": {
+ "description": "I'll support you with [x] ___beers___",
+ "message": "beers"
+ },
+ "plansPagePizzas": {
+ "description": "I'll support you with [x] ___pizzas___",
+ "message": "pizzas"
+ },
+ "plansPageThankYou": {
+ "description": "Thank you for your support ;-)",
+ "message": "Thank you for your support ;-)"
+ },
+
+ "buyStatusRetrievingProducts": {
+ "description": "Retreiving available products",
+ "message": "Retrieving available products"
+ },
+ "buyErrorRetrievingProducts": {
+ "description": "Error retrieving product list",
+ "message": "Error retrieving product list"
+ },
+ "buyStatusRetrievingPurchasedProducts": {
+ "description": "Retreiving list of purchased products",
+ "message": "Retrieving list of purchased products"
+ },
+ "buyErrorRetrievingPurchasedProducts": {
+ "description": "Error retreiving list of purchased products",
+ "message": "Error retrieving list of purchased products"
+ },
+ "buyStatusPurchaseComplete": {
+ "description": "Purchase completed. Order ID",
+ "message": "Purchase completed. Order ID"
+ },
+ "buyErrorPurchaseFailed": {
+ "description": "Purchase failed",
+ "message": "Purchase failed"
+ },
+ "aboutPageContent": {
+ "description": "Section of text describing Me",
+ "message": "My name is Michiel Roos. I had a lot of fun developing this add-on. I also learnt a lot. I hope you find it usefull and enjoy using it. If you have any suggetstions or constructive criticism, please contact me."
+ },
+ "aboutPageContentConsiderDonation": {
+ "description": "Do you enjoy this extension? Please consider a donation:",
+ "message": "Do you enjoy this extension? Please consider a donation:"
+ },
+ "aboutPageContentSayThanks": {
+ "description": "Section of text: say thanks",
+ "message": "Say Thanks ;-)"
+ },
+ "thanksDisplayName": {
+ "description": "Thank you!",
+ "message": "Thank you!"
+ },
+ "thanksPageThankYou": {
+ "description": "Thank you message",
+ "message": "Thank you!"
+ },
+ "thanksPagePatreon": {
+ "description": "Become a patreon on",
+ "message": "Become a patreon on"
+ },
+ "thanksPagePaypal": {
+ "description": "Make a donation via",
+ "message": "Make a donation via"
+ },
+ "popupDefaultMessage": {
+ "description": "The default message shown in the browserAction popup",
+ "message": "No headers were captured yet. Please reload this tab to see the headers."
+ },
+ "contentMessagesEnableExtraOptions": {
+ "description": "enable XHR and sub-frame requests",
+ "message": "enable XHR and sub-frame requests"
+ },
+ "contentMessagesPressEscToClosePanels": {
+ "description": "[esc] closes these panels. Click to toggle panels.",
+ "message": "[esc] closes these panels. Click to toggle panels."
+ },
+ "contentMessagesCache": {
+ "description": "cache",
+ "message": "cache"
+ },
+ "contentMessagesCached": {
+ "description": "cached",
+ "message": "cached"
+ },
+ "contentMessagesFromDiskCache": {
+ "description": "from disk cache",
+ "message": "from disk cache"
+ },
+ "contentMessagesHeadersReceived": {
+ "description": "shorthand for headers received: ___headers recv___",
+ "message": "headers recv"
+ },
+ "contentMessagesTimeToFirstByte": {
+ "description": "shorthand for time to first byte: ___first byte___",
+ "message": "first byte"
+ },
+ "contentMessagesRequestComplete": {
+ "description": "shorthand for request completed: ___complete___",
+ "message": "complete"
+ },
+ "contentMessagesPanelTitleRequest": {
+ "description": "Request",
+ "message": "Request"
+ },
+ "contentMessagesPanelTitleResponse": {
+ "description": "Response",
+ "message": "Response"
+ },
+ "contentMessagesPanelTitleCookies": {
+ "description": "Cookies",
+ "message": "Cookies"
+ },
+ "contentMessagesPanelTitleFormData": {
+ "description": "Form Data",
+ "message": "Form Data"
+ },
+ "contentMessagesPanelTitleQuery": {
+ "description": "Query",
+ "message": "Query"
+ },
+ "contentMessagesFilterBarFilter": {
+ "description": "Filter",
+ "message": "Filter"
+ },
+ "contentMessagesFilterBarRegex": {
+ "description": "Regex",
+ "message": "Regex"
+ },
+ "contentMessagesRequestTypeDoc": {
+ "description": "Doc",
+ "message": "Doc"
+ },
+ "contentMessagesRequestTypeFrame": {
+ "description": "Frame",
+ "message": "Frame"
+ },
+ "contentMessagesRequestTypeXhr": {
+ "description": "XHR",
+ "message": "XHR"
+ },
+ "contentMessagesProEnableServerIp": {
+ "description": "enable server IP",
+ "message": "enable server IP"
+ },
+ "contentMessagesProEnableResponseTimes": {
+ "description": "enable response times",
+ "message": "enable response times"
+ },
+ "hideonhover": {
+ "description": "Hide on hover for",
+ "message": "Hide on hover for"
+ },
+ "hideonhovernote": {
+ "description": "leave it empty to disable",
+ "message": "leave it empty to disable"
+ }
+}
diff --git a/public/_locales/es/messages.json b/public/_locales/es/messages.json
new file mode 100644
index 0000000..7666ca2
--- /dev/null
+++ b/public/_locales/es/messages.json
@@ -0,0 +1,365 @@
+{
+ "extensionDescription": {
+ "description": "The description of the extension",
+ "message": "HTTP Header Spy le permite inspeccionar los encabezados y las cookies de respuesta de solicitud después de la carga de la página sin clics adicionales."
+ },
+ "extensionName": {
+ "description": "The name of the extension",
+ "message": "Espía HTTP"
+ },
+ "extensionNameShort": {
+ "description": "The short name of the extension",
+ "message": "Encabezados HTTP"
+ },
+
+ "optionsDisplayName": {
+ "description": "Menu title for options page",
+ "message": "Opciones"
+ },
+ "aboutDisplayName": {
+ "description": "Menu title for about page",
+ "message": "Acerca de"
+ },
+ "plansDisplayName": {
+ "description": "Menu title for 'Enable extra options' page",
+ "message": "Habilitar opciones adicionales"
+ },
+
+ "buttonAdd": {
+ "description": "Add button text",
+ "message": "Añadir"
+ },
+ "buttonOptions": {
+ "description": "Options page button text",
+ "message": "Página Opciones"
+ },
+
+ "optionsPageDisplayOptions": {
+ "description": "Display options",
+ "message": "opciones de pantalla"
+ },
+ "optionsPageDisplayOptionsPressEscapeToHidePanels": {
+ "description": "Press the ESC key to hide panels.",
+ "message": "Presione la tecla ESC para ocultar los paneles."
+ },
+ "optionsPageDisplayOptionsAutoHide": {
+ "description": "Press the ESC key to hide panels.",
+ "message": "Cuando se activa la función de ocultar automáticamente, no se mostrará la barra de filtro."
+ },
+ "optionsPageDisplayOptionsShowIn": {
+ "description": "___Show in___ [mode]",
+ "message": "Mostrar en"
+ },
+ "renderModeNormal": {
+ "description": "Show in [___normal___]",
+ "message": "normal"
+ },
+ "renderModeMicro": {
+ "description": "Show in [___micro___]",
+ "message": "micro"
+ },
+ "renderModeDisabled": {
+ "description": "Show in [___disabled___]",
+ "message": "discapacitado"
+ },
+ "optionsPageDisplayOptionsModeInThe": {
+ "description": "Show in [mode] ___mode, in the___",
+ "message": "Modo, en el"
+ },
+ "locationTopLeftCorner": {
+ "description": "mode, in the [___top left corner___]",
+ "message": "esquina superior izquierda"
+ },
+ "locationTopRightCorner": {
+ "description": "mode, in the [___top right corner___]",
+ "message": "esquina superior derecha"
+ },
+ "locationBottomLeftCorner": {
+ "description": "mode, in the [___bottom left corner___]",
+ "message": "esquina izquierda inferior"
+ },
+ "locationBottomRightCorner": {
+ "description": "mode, in the [___bottom right corner___]",
+ "message": "esquina inferior derecha"
+ },
+ "optionsPageDisplayOptionsModeUsingA": {
+ "description": "mode, in the [bottom right corner] ___using a___",
+ "message": "usando un"
+ },
+ "themeDark": {
+ "description": "using a [___dark theme___]",
+ "message": "Tema oscuro"
+ },
+ "themeLight": {
+ "description": "using a [___light theme___]",
+ "message": "Tema ligero"
+ },
+ "optionsPageDisplayOptionsAndShowThe": {
+ "description": "using a [light theme] ___and show the___ [x] most recent requests",
+ "message": "Y muestre el"
+ },
+ "optionsPageDisplayOptionsMostRecentRequests": {
+ "description": "using a [light theme] and show the [x] ___most recent requests___",
+ "message": "Solicitudes más recientes"
+ },
+ "doAutoHidePanels": {
+ "description": "[___Do auto-hide panels___] after [x] seconds",
+ "message": "Hacer paneles de auto-ocultar"
+ },
+ "doNotAutoHidePanels": {
+ "description": "[___Do not auto-hide panels___] after [x] seconds",
+ "message": "No ocultar automáticamente los paneles"
+ },
+ "optionsPageDisplayOptionsAutoHideAfter": {
+ "description": "[Do auto-hide panels] ___ after___ [x] seconds",
+ "message": "después"
+ },
+ "optionsPageDisplayOptionsAutoHideSeconds": {
+ "description": "[Do auto-hide panels] after [x] ___seconds___",
+ "message": "segundos"
+ },
+
+ "optionsPageHideRequestHeaders": {
+ "description": "Hide request headers",
+ "message": "Ocultar encabezados de solicitud"
+ },
+ "optionsPageHideRequestHeadersDescription": {
+ "description": "Request headers (or patterns thereof) that will not be displayed.",
+ "message": "Solicite encabezados (o modelos de los mismos) que no se mostrarán."
+ },
+
+ "optionsPageHideResponseHeaders": {
+ "description": "Hide response headers",
+ "message": "Ocultar encabezados de respuesta"
+ },
+ "optionsPageHideResponseHeadersDescription": {
+ "description": "Response headers (or patterns thereof) that will not be displayed.",
+ "message": "Cabeceras de respuesta (o patrones del mismo) que no se mostrarán."
+ },
+
+ "optionsPageMicroModeHeaders": {
+ "description": "Headers to show in Micro mode",
+ "message": "Encabezados para mostrar en modo Micro"
+ },
+ "optionsPageMicroModeHeadersDescription": {
+ "description": "Response headers (or patterns thereof) that will be shown in micro mode.",
+ "message": "Cabeceras de respuesta (o patrones del mismo) que se mostrarán en modo micro."
+ },
+
+ "optionsPageStringsToHightlight": {
+ "description": "Strings to highlight",
+ "message": "Cuerdas para resaltar"
+ },
+ "optionsPageStringsToHightlightDescription": {
+ "description": "Headers (or patterns thereof) that will be",
+ "message": "Los encabezados (o patrones del mismo) que"
+ },
+ "optionsPageStringsToHightlightDescriptionHighlighted": {
+ "description": "Headers (or patterns thereof) that will be ___highlighted___",
+ "message": "destacado"
+ },
+
+ "plansPageTitle": {
+ "description": "Enable extra options",
+ "message": "Habilitar opciones adicionales"
+ },
+ "plansPageYouCan": {
+ "description": "___You can___ test all these great features every first 15 minutes of every hour:",
+ "message": "Usted puede"
+ },
+ "plansPageTest": {
+ "description": "You can ___test___ all these great features every first 15 minutes of every hour:",
+ "message": "prueba"
+ },
+ "plansPageTheseFeatures": {
+ "description": "You can test ___all these great features___ every first 15 minutes of every hour:",
+ "message": "todas estas características adicionales"
+ },
+ "plansPageEveryFirst": {
+ "description": "You can test all these great features ___every first 15 minutes___ of every hour:",
+ "message": "cada 15 minutos"
+ },
+ "plansPageOfEveryHour": {
+ "description": "You can test all these great features every first 15 minutes ___of every hour___:",
+ "message": "cada hora"
+ },
+ "plansPageOptionServerIp": {
+ "description": "Server IP address",
+ "message": "Dirección IP del servidor"
+ },
+ "plansPageOptionSubFrameRequests": {
+ "description": "Sub-frame requests",
+ "message": "Solicitudes secundarias"
+ },
+ "plansPageOptionXhrRequests": {
+ "description": "XML HTTP Requests (XHR / AJAX)",
+ "message": "Solicitud HTTP XML (XHR / AJAX)"
+ },
+ "plansPageOptionRequestTimes": {
+ "description": "Request times: time to headers received, time to first byte and time to complete",
+ "message": "Tiempo de solicitud: tiempo para los encabezados recibidos, tiempo hasta el primer byte y tiempo para completar"
+ },
+ "plansPageOptionFilterBar": {
+ "description": "Use the filter bar to filter the headers",
+ "message": "Utilice la barra de filtros para filtrar los encabezados"
+ },
+ "plansPageOneTimeBeerSupport": {
+ "description": "One-time beer support",
+ "message": "Soporte de cerveza de una sola vez"
+ },
+ "plansPageOneTimePizzaSupport": {
+ "description": "One-time pizza support",
+ "message": "Soporte de una sola vez para pizza"
+ },
+ "plansPageSubscriptions": {
+ "description": "Subscriptions",
+ "message": "Suscripciones"
+ },
+ "plansPageMangeSubscriptions": {
+ "description": "Manage subscriptions",
+ "message": "Administrar Suscripciones"
+ },
+ "plansPageEnableFeatures": {
+ "description": "___If you want to enable these features___ permanently, please support further development by donating me some beer/pizza:",
+ "message": "Si desea habilitar estas funciones"
+ },
+ "plansPageEnableFeaturesPermanently": {
+ "description": "If you want to enable these features ___permanently___, please support further development by donating me some beer/pizza:",
+ "message": "permanentemente"
+ },
+ "plansPageEnableFeaturesPleaseSupport": {
+ "description": "If you want to enable these features permanently___, please support further development by donating me some beer/pizza___:",
+ "message": ", Por favor apoye el desarrollo adicional donándome un poco de cerveza / pizza"
+ },
+ "plansPageIWillSupportYouWith": {
+ "description": "___I'll support you with___ [x] pizzas",
+ "message": "Te apoyaré con"
+ },
+ "plansPageBeers": {
+ "description": "I'll support you with [x] ___beers___",
+ "message": "Cervezas"
+ },
+ "plansPagePizzas": {
+ "description": "I'll support you with [x] ___pizzas___",
+ "message": "Pizzas"
+ },
+ "plansPageThankYou": {
+ "description": "Thank you for your support ;-)",
+ "message": "Gracias por tu apoyo ;-)"
+ },
+
+ "buyStatusRetrievingProducts": {
+ "description": "Retreiving available products",
+ "message": "Recuperación de productos disponibles"
+ },
+ "buyErrorRetrievingProducts": {
+ "description": "Error retrieving product list",
+ "message": "Error al recuperar la lista de productos"
+ },
+ "buyStatusRetrievingPurchasedProducts": {
+ "description": "Retreiving list of purchased products",
+ "message": "Recuperación de la lista de productos comprados"
+ },
+ "buyErrorRetrievingPurchasedProducts": {
+ "description": "Error retreiving list of purchased products",
+ "message": "Error al recuperar la lista de productos comprados"
+ },
+ "buyStatusPurchaseComplete": {
+ "description": "Purchase completed. Order ID",
+ "message": "Compra terminada. Solicitar ID"
+ },
+ "buyErrorPurchaseFailed": {
+ "description": "Purchase failed",
+ "message": "La compra falló"
+ },
+
+ "aboutPageContent": {
+ "description": "Section of text describing Me",
+ "message": "Mi nombre es Michiel Roos. Me divertí mucho desarrollando este complemento. También aprendí mucho. Espero que lo encuentre útil y disfrutar de su uso. Si tiene sugerencias o críticas constructivas, póngase en contacto conmigo."
+ },
+ "popupDefaultMessage": {
+ "description": "The default message shown in the browserAction popup",
+ "message": "Todavía no se capturaron cabeceras. Vuelva a cargar esta pestaña para ver los encabezados."
+ },
+
+ "contentMessagesEnableExtraOptions": {
+ "description": "enable XHR and sub-frame requests",
+ "message": "Habilitar las solicitudes de XHR y subtrama"
+ },
+ "contentMessagesPressEscToClosePanels": {
+ "description": "[esc] closes these panels. Click to toggle panels.",
+ "message": "[Esc] cierra estos paneles. Haga clic para alternar entre paneles."
+ },
+ "contentMessagesCache": {
+ "description": "cache",
+ "message": "cache"
+ },
+ "contentMessagesCached": {
+ "description": "cached",
+ "message": "en caché"
+ },
+ "contentMessagesFromDiskCache": {
+ "description": "from disk cache",
+ "message": "desde caché de disco"
+ },
+ "contentMessagesHeadersReceived": {
+ "description": "shorthand for headers received: ___headers recv___",
+ "message": "encabezados recv"
+ },
+ "contentMessagesTimeToFirstByte": {
+ "description": "shorthand for time to first byte: ___first byte___",
+ "message": "primer octeto"
+ },
+ "contentMessagesRequestComplete": {
+ "description": "shorthand for request completed: ___complete___",
+ "message": "completar"
+ },
+ "contentMessagesPanelTitleRequest": {
+ "description": "Request",
+ "message": "Solicitud"
+ },
+ "contentMessagesPanelTitleResponse": {
+ "description": "Response",
+ "message": "Respuesta"
+ },
+ "contentMessagesPanelTitleCookies": {
+ "description": "Cookies",
+ "message": "Galletas"
+ },
+ "contentMessagesPanelTitleFormData": {
+ "description": "Form Data",
+ "message": "Datos del formulario"
+ },
+ "contentMessagesPanelTitleQuery": {
+ "description": "Query",
+ "message": "Consulta"
+ },
+ "contentMessagesFilterBarFilter": {
+ "description": "Filter",
+ "message": "Filtrar"
+ },
+ "contentMessagesFilterBarRegex": {
+ "description": "Regex",
+ "message": "Regex"
+ },
+ "contentMessagesRequestTypeDoc": {
+ "description": "Doc",
+ "message": "Doc"
+ },
+ "contentMessagesRequestTypeFrame": {
+ "description": "Frame",
+ "message": "Marco"
+ },
+ "contentMessagesRequestTypeXhr": {
+ "description": "XHR",
+ "message": "XHR"
+ },
+ "contentMessagesProEnableServerIp": {
+ "description": "enable server IP",
+ "message": "habilitar IP del servidor"
+ },
+ "contentMessagesProEnableResponseTimes": {
+ "description": "enable response times",
+ "message": "habilitar tiempos de respuesta"
+ }
+}
diff --git a/public/_locales/hi/messages.json b/public/_locales/hi/messages.json
new file mode 100644
index 0000000..0403acf
--- /dev/null
+++ b/public/_locales/hi/messages.json
@@ -0,0 +1,365 @@
+{
+ "extensionDescription": {
+ "description": "The description of the extension",
+ "message": "HTTP जासूस आप सही कोई अतिरिक्त क्लिक के साथ पेज लोड करने के बाद अनुरोध प्रतिक्रिया हेडर और कुकीज़ का निरीक्षण करने के लिए सक्षम बनाता है।"
+ },
+ "extensionName": {
+ "description": "The name of the extension",
+ "message": "HTTP स्पाई"
+ },
+ "extensionNameShort": {
+ "description": "The short name of the extension",
+ "message": "HTTP शीर्ष"
+ },
+
+ "optionsDisplayName": {
+ "description": "Menu title for options page",
+ "message": "विकल्प"
+ },
+ "aboutDisplayName": {
+ "description": "Menu title for about page",
+ "message": "के बारे में"
+ },
+ "plansDisplayName": {
+ "description": "Menu title for 'Enable extra options' page",
+ "message": "अतिरिक्त विकल्प सक्षम करें"
+ },
+
+ "buttonAdd": {
+ "description": "Add button text",
+ "message": "जोड़ना"
+ },
+ "buttonOptions": {
+ "description": "Options page button text",
+ "message": "विकल्प पृष्ठ"
+ },
+
+ "optionsPageDisplayOptions": {
+ "description": "Display options",
+ "message": "प्रदर्शित विकल्प"
+ },
+ "optionsPageDisplayOptionsPressEscapeToHidePanels": {
+ "description": "Press the ESC key to hide panels.",
+ "message": "पैनलों को छिपाने के लिए ईएससी कुंजी दबाएँ।"
+ },
+ "optionsPageDisplayOptionsAutoHide": {
+ "description": "Press the ESC key to hide panels.",
+ "message": "जब ऑटो छिपाने सक्षम है, फिल्टर बार नहीं दिखाया जाएगा।"
+ },
+ "optionsPageDisplayOptionsShowIn": {
+ "description": "___Show in___ [mode]",
+ "message": "में दिखाएं"
+ },
+ "renderModeNormal": {
+ "description": "Show in [___normal___]",
+ "message": "साधारण"
+ },
+ "renderModeMicro": {
+ "description": "Show in [___micro___]",
+ "message": "सूक्ष्म"
+ },
+ "renderModeDisabled": {
+ "description": "Show in [___disabled___]",
+ "message": "विकलांग"
+ },
+ "optionsPageDisplayOptionsModeInThe": {
+ "description": "Show in [mode] ___mode, in the___",
+ "message": "मोड, में"
+ },
+ "locationTopLeftCorner": {
+ "description": "mode, in the [___top left corner___]",
+ "message": "ऊपरी बायां कोना"
+ },
+ "locationTopRightCorner": {
+ "description": "mode, in the [___top right corner___]",
+ "message": "ऊपरी दायां किनारा"
+ },
+ "locationBottomLeftCorner": {
+ "description": "mode, in the [___bottom left corner___]",
+ "message": "निचला बायां किनारा"
+ },
+ "locationBottomRightCorner": {
+ "description": "mode, in the [___bottom right corner___]",
+ "message": "नीचे का दांया कोना"
+ },
+ "optionsPageDisplayOptionsModeUsingA": {
+ "description": "mode, in the [bottom right corner] ___using a___",
+ "message": "इसका उपयोग करना"
+ },
+ "themeDark": {
+ "description": "using a [___dark theme___]",
+ "message": "अंधेरे विषय"
+ },
+ "themeLight": {
+ "description": "using a [___light theme___]",
+ "message": "प्रकाश विषय"
+ },
+ "optionsPageDisplayOptionsAndShowThe": {
+ "description": "using a [light theme] ___and show the___ [x] most recent requests",
+ "message": "और दिखाने के लिए"
+ },
+ "optionsPageDisplayOptionsMostRecentRequests": {
+ "description": "using a [light theme] and show the [x] ___most recent requests___",
+ "message": "सबसे हाल ही में अनुरोधों"
+ },
+ "doAutoHidePanels": {
+ "description": "[___Do auto-hide panels___] after [x] seconds",
+ "message": "ऑटो छिपाने के पैनल"
+ },
+ "doNotAutoHidePanels": {
+ "description": "[___Do not auto-hide panels___] after [x] seconds",
+ "message": "पैनलों ऑटो छिपा नहीं है"
+ },
+ "optionsPageDisplayOptionsAutoHideAfter": {
+ "description": "[Do auto-hide panels] ___ after___ [x] seconds",
+ "message": "बाद"
+ },
+ "optionsPageDisplayOptionsAutoHideSeconds": {
+ "description": "[Do auto-hide panels] after [x] ___seconds___",
+ "message": "सेकंड"
+ },
+
+ "optionsPageHideRequestHeaders": {
+ "description": "Hide request headers",
+ "message": "मिटायें अनुरोध हेडर"
+ },
+ "optionsPageHideRequestHeadersDescription": {
+ "description": "Request headers (or patterns thereof) that will not be displayed.",
+ "message": "अनुरोध हेडर (या पैटर्न क्या है) कि प्रदर्शित नहीं किया जाएगा।"
+ },
+
+ "optionsPageHideResponseHeaders": {
+ "description": "Hide response headers",
+ "message": "प्रतिक्रिया हेडर छुपाएं"
+ },
+ "optionsPageHideResponseHeadersDescription": {
+ "description": "Response headers (or patterns thereof) that will not be displayed.",
+ "message": "प्रतिक्रिया हेडर (या पैटर्न क्या है) कि प्रदर्शित नहीं किया जाएगा।"
+ },
+
+ "optionsPageMicroModeHeaders": {
+ "description": "Headers to show in Micro mode",
+ "message": "हेडर माइक्रो मोड में दिखाने के लिए"
+ },
+ "optionsPageMicroModeHeadersDescription": {
+ "description": "Response headers (or patterns thereof) that will be shown in micro mode.",
+ "message": "प्रतिक्रिया हेडर (या पैटर्न क्या है) कि माइक्रो मोड में दिखाया जाएगा।"
+ },
+
+ "optionsPageStringsToHightlight": {
+ "description": "Strings to highlight",
+ "message": "स्ट्रिंग्स को उजागर करने के लिए"
+ },
+ "optionsPageStringsToHightlightDescription": {
+ "description": "Headers (or patterns thereof) that will be",
+ "message": "हेडर (या उसके पैटर्न) कि हो जाएगा"
+ },
+ "optionsPageStringsToHightlightDescriptionHighlighted": {
+ "description": "Headers (or patterns thereof) that will be ___highlighted___",
+ "message": "प्रकाश डाला"
+ },
+
+ "plansPageTitle": {
+ "description": "Enable extra options",
+ "message": "अतिरिक्त विकल्प सक्षम करें"
+ },
+ "plansPageYouCan": {
+ "description": "___You can___ test all these great features every first 15 minutes of every hour:",
+ "message": "आप ऐसा कर सकते हैं"
+ },
+ "plansPageTest": {
+ "description": "You can ___test___ all these great features every first 15 minutes of every hour:",
+ "message": "परीक्षण"
+ },
+ "plansPageTheseFeatures": {
+ "description": "You can test ___all these great features___ every first 15 minutes of every hour:",
+ "message": "इन सभी अतिरिक्त सुविधाओं"
+ },
+ "plansPageEveryFirst": {
+ "description": "You can test all these great features ___every first 15 minutes___ of every hour:",
+ "message": "हर 15 मिनट पहले"
+ },
+ "plansPageOfEveryHour": {
+ "description": "You can test all these great features every first 15 minutes ___of every hour___:",
+ "message": "हर घंटे के"
+ },
+ "plansPageOptionServerIp": {
+ "description": "Server IP address",
+ "message": "सर्वर आईपी पता"
+ },
+ "plansPageOptionSubFrameRequests": {
+ "description": "Sub-frame requests",
+ "message": "उप फ्रेम अनुरोधों"
+ },
+ "plansPageOptionXhrRequests": {
+ "description": "XML HTTP Requests (XHR / AJAX)",
+ "message": "एक्सएमएल HTTP अनुरोध (एक्सएचआर / AJAX)"
+ },
+ "plansPageOptionRequestTimes": {
+ "description": "Request times: time to headers received, time to first byte and time to complete",
+ "message": "अनुरोध बार में: हेडर के लिए समय पहली बाइट और पूरा करने के लिए समय के लिए प्राप्त किया, समय"
+ },
+ "plansPageOptionFilterBar": {
+ "description": "Use the filter bar to filter the headers",
+ "message": "हेडर फिल्टर करने के लिए फिल्टर पट्टी का उपयोग करें"
+ },
+ "plansPageOneTimeBeerSupport": {
+ "description": "One-time beer support",
+ "message": "एक बार बीयर समर्थन"
+ },
+ "plansPageOneTimePizzaSupport": {
+ "description": "One-time pizza support",
+ "message": "एक बार पिज्जा समर्थन"
+ },
+ "plansPageSubscriptions": {
+ "description": "Subscriptions",
+ "message": "सदस्यताएँ"
+ },
+ "plansPageMangeSubscriptions": {
+ "description": "Manage subscriptions",
+ "message": "सदस्यता प्रबंधित करें"
+ },
+ "plansPageEnableFeatures": {
+ "description": "___If you want to enable these features___ permanently, please support further development by donating me some beer/pizza:",
+ "message": "यदि आप इन सुविधाओं सक्षम करना चाहते हैं"
+ },
+ "plansPageEnableFeaturesPermanently": {
+ "description": "If you want to enable these features ___permanently___, please support further development by donating me some beer/pizza:",
+ "message": "स्थायी रूप से"
+ },
+ "plansPageEnableFeaturesPleaseSupport": {
+ "description": "If you want to enable these features permanently___, please support further development by donating me some beer/pizza___:",
+ "message": ", मुझे कुछ बियर / पिज्जा दान करके आगे विकास का समर्थन करें"
+ },
+ "plansPageIWillSupportYouWith": {
+ "description": "___I'll support you with___ [x] pizzas",
+ "message": "मैं के साथ आप का समर्थन करेंगे"
+ },
+ "plansPageBeers": {
+ "description": "I'll support you with [x] ___beers___",
+ "message": "बियर"
+ },
+ "plansPagePizzas": {
+ "description": "I'll support you with [x] ___pizzas___",
+ "message": "पिज्जा"
+ },
+ "plansPageThankYou": {
+ "description": "Thank you for your support ;-)",
+ "message": "आपके सहयोग के लिए धन्यवाद ;-)"
+ },
+
+ "buyStatusRetrievingProducts": {
+ "description": "Retreiving available products",
+ "message": "उपलब्ध उत्पादों को पुन: प्राप्त"
+ },
+ "buyErrorRetrievingProducts": {
+ "description": "Error retrieving product list",
+ "message": "उत्पाद की सूची को पुन: प्राप्त त्रुटि"
+ },
+ "buyStatusRetrievingPurchasedProducts": {
+ "description": "Retreiving list of purchased products",
+ "message": "खरीदे गए उत्पादों का पुन: प्राप्त सूची"
+ },
+ "buyErrorRetrievingPurchasedProducts": {
+ "description": "Error retreiving list of purchased products",
+ "message": "खरीदे गए उत्पादों की सूची को पुन: प्राप्त त्रुटि"
+ },
+ "buyStatusPurchaseComplete": {
+ "description": "Purchase completed. Order ID",
+ "message": "क्रय पूरा किया। आदेश आईडी"
+ },
+ "buyErrorPurchaseFailed": {
+ "description": "Purchase failed",
+ "message": "खरीद विफल रही"
+ },
+
+ "aboutPageContent": {
+ "description": "Section of text describing Me",
+ "message": "ेरा नाम Michiel Roos है। मैं इस ऐड-ऑन के विकास का एक बहुत मज़ा किया था। मैं भी बहुत कुछ सीखा। मैं आपको यह उपयोगी है और इसे उपयोग का आनंद मिल उम्मीद है। आप किसी भी suggetstions या रचनात्मक आलोचना है, तो कृपया मुझसे संपर्क करें।"
+ },
+ "popupDefaultMessage": {
+ "description": "The default message shown in the browserAction popup",
+ "message": "कोई हेडर अभी तक कब्जा कर लिया गया। हेडर को देखने के लिए इस टैब को फिर से लोड करें।"
+ },
+
+ "contentMessagesEnableExtraOptions": {
+ "description": "enable XHR and sub-frame requests",
+ "message": "एक्सएचआर और उप फ्रेम अनुरोधों सक्षम"
+ },
+ "contentMessagesPressEscToClosePanels": {
+ "description": "[esc] closes these panels. Click to toggle panels.",
+ "message": "[ईएससी] इन पैनलों बंद कर देता है। पैनलों को चालू करने के लिए क्लिक करें।"
+ },
+ "contentMessagesCache": {
+ "description": "cache",
+ "message": "कैश"
+ },
+ "contentMessagesCached": {
+ "description": "cached",
+ "message": "कैश्ड"
+ },
+ "contentMessagesFromDiskCache": {
+ "description": "from disk cache",
+ "message": "डिस्क कैश से"
+ },
+ "contentMessagesHeadersReceived": {
+ "description": "shorthand for headers received: ___headers recv___",
+ "message": "हेडर recv"
+ },
+ "contentMessagesTimeToFirstByte": {
+ "description": "shorthand for time to first byte: ___first byte___",
+ "message": "पहली बाइट"
+ },
+ "contentMessagesRequestComplete": {
+ "description": "shorthand for request completed: ___complete___",
+ "message": "पूर्ण"
+ },
+ "contentMessagesPanelTitleRequest": {
+ "description": "Request",
+ "message": "निवेदन"
+ },
+ "contentMessagesPanelTitleResponse": {
+ "description": "Response",
+ "message": "प्रतिक्रिया"
+ },
+ "contentMessagesPanelTitleCookies": {
+ "description": "Cookies",
+ "message": "कुकीज़"
+ },
+ "contentMessagesPanelTitleFormData": {
+ "description": "Form Data",
+ "message": "प्रपत्र डेटा"
+ },
+ "contentMessagesPanelTitleQuery": {
+ "description": "Query",
+ "message": "सवाल"
+ },
+ "contentMessagesFilterBarFilter": {
+ "description": "Filter",
+ "message": "फ़िल्टर"
+ },
+ "contentMessagesFilterBarRegex": {
+ "description": "Regex",
+ "message": "regex"
+ },
+ "contentMessagesRequestTypeDoc": {
+ "description": "Doc",
+ "message": "डॉक्टर"
+ },
+ "contentMessagesRequestTypeFrame": {
+ "description": "Frame",
+ "message": "ढांचा"
+ },
+ "contentMessagesRequestTypeXhr": {
+ "description": "XHR",
+ "message": "एक्सएचआर"
+ },
+ "contentMessagesProEnableServerIp": {
+ "description": "enable server IP",
+ "message": "सर्वर आईपी सक्षम"
+ },
+ "contentMessagesProEnableResponseTimes": {
+ "description": "enable response times",
+ "message": "प्रतिक्रिया समय के लिए सक्षम"
+ }
+}
diff --git a/public/_locales/nl/messages.json b/public/_locales/nl/messages.json
new file mode 100644
index 0000000..2992671
--- /dev/null
+++ b/public/_locales/nl/messages.json
@@ -0,0 +1,386 @@
+{
+ "extensionDescription": {
+ "description": "The description of the extension",
+ "message": "HTTP Header Spy toont de request-, response headers en cookies direct nadat een pagina geladen is, zonder extra klikken."
+ },
+ "extensionName": {
+ "description": "The name of the extension",
+ "message": "HTTP Header Spy"
+ },
+ "extensionNameShort": {
+ "description": "The short name of the extension",
+ "message": "HTTP Headers"
+ },
+
+ "optionsDisplayName": {
+ "description": "Menu title for options page",
+ "message": "Opties"
+ },
+ "aboutDisplayName": {
+ "description": "Menu title for about page",
+ "message": "Over"
+ },
+ "plansDisplayName": {
+ "description": "Menu title for 'Enable extra options' page",
+ "message": "Schakel extra opties in"
+ },
+
+ "buttonAdd": {
+ "description": "Add button text",
+ "message": "Toevoegen"
+ },
+ "buttonOptions": {
+ "description": "Options page button text",
+ "message": "Opties pagina"
+ },
+
+ "optionsPageDisplayOptions": {
+ "description": "Display options",
+ "message": "Weergave opties"
+ },
+ "optionsPageDisplayOptionsPressEscapeToHidePanels": {
+ "description": "Press the ESC key to hide panels.",
+ "message": "Gebruik de ESC toets om panelen te verbergen."
+ },
+ "optionsPageDisplayOptionsAutoHide": {
+ "description": "Press the ESC key to hide panels.",
+ "message": "Als automatisch verbergen is ingeschakeld, wordt de filter balk niet getoond."
+ },
+ "optionsPageDisplayOptionsShowIn": {
+ "description": "___Show in___ [mode]",
+ "message": "Toon in"
+ },
+ "renderModeNormal": {
+ "description": "Show in [___normal___]",
+ "message": "normale"
+ },
+ "renderModeMicro": {
+ "description": "Show in [___micro___]",
+ "message": "micro"
+ },
+ "renderModeDisabled": {
+ "description": "Show in [___disabled___]",
+ "message": "uitgeschakelde"
+ },
+ "optionsPageDisplayOptionsModeInThe": {
+ "description": "Show in [mode] ___mode, in the___",
+ "message": "modus, in de"
+ },
+ "locationTopLeftCorner": {
+ "description": "mode, in the [___top left corner___]",
+ "message": "linkerbovenhoek"
+ },
+ "locationTopRightCorner": {
+ "description": "mode, in the [___top right corner___]",
+ "message": "rechterbovenhoek"
+ },
+ "locationBottomLeftCorner": {
+ "description": "mode, in the [___bottom left corner___]",
+ "message": "linkeronderhoek"
+ },
+ "locationBottomRightCorner": {
+ "description": "mode, in the [___bottom right corner___]",
+ "message": "rechteronderhoek"
+ },
+ "optionsPageDisplayOptionsModeUsingA": {
+ "description": "mode, in the [bottom right corner] ___using a___",
+ "message": "gebruik een"
+ },
+ "themeDark": {
+ "description": "using a [___dark theme___]",
+ "message": "donker thema"
+ },
+ "themeLight": {
+ "description": "using a [___light theme___]",
+ "message": "licht thema"
+ },
+ "optionsPageDisplayOptionsAndShowThe": {
+ "description": "using a [light theme] ___and show the___ [x] most recent requests",
+ "message": "en toon de"
+ },
+ "optionsPageDisplayOptionsMostRecentRequests": {
+ "description": "using a [light theme] and show the [x] ___most recent requests___",
+ "message": "meest recente requests"
+ },
+ "doAutoHidePanels": {
+ "description": "[___Do auto-hide panels___] after [x] seconds",
+ "message": "Verberg panelen"
+ },
+ "doNotAutoHidePanels": {
+ "description": "[___Do not auto-hide panels___] after [x] seconds",
+ "message": "Verberg panelen niet"
+ },
+ "optionsPageDisplayOptionsAutoHideAfter": {
+ "description": "[Do auto-hide panels] ___ after___ [x] seconds",
+ "message": "na"
+ },
+ "optionsPageDisplayOptionsAutoHideSeconds": {
+ "description": "[Do auto-hide panels] after [x] ___seconds___",
+ "message": "seconden"
+ },
+
+ "optionsPageHideRequestHeaders": {
+ "description": "Hide request headers",
+ "message": "Verberg request headers"
+ },
+ "optionsPageHideRequestHeadersDescription": {
+ "description": "Request headers (or patterns thereof) that will not be displayed.",
+ "message": "Request headers (of delen daarvan) die niet zullen worden getoond."
+ },
+
+ "optionsPageHideResponseHeaders": {
+ "description": "Hide response headers",
+ "message": "Verberg response headers"
+ },
+ "optionsPageHideResponseHeadersDescription": {
+ "description": "Response headers (or patterns thereof) that will not be displayed.",
+ "message": "Response headers (of delen daarvan) die niet zullen worden getoond."
+ },
+
+ "optionsPageMicroModeHeaders": {
+ "description": "Headers to show in Micro mode",
+ "message": "Headers die in Micro modus getoond worden"
+ },
+ "optionsPageMicroModeHeadersDescription": {
+ "description": "Response headers (or patterns thereof) that will be shown in micro mode.",
+ "message": "Response headers (of delen daarvan) die zullen worden getoond in micro modus."
+ },
+ "optionsPageStringsToHightlight": {
+ "description": "Strings to highlight",
+ "message": "Te markeren strings"
+ },
+ "optionsPageStringsToHightlightDescription": {
+ "description": "Headers (or patterns thereof) that will be",
+ "message": "Headers (of delen daarvan) die zullen worden"
+ },
+ "optionsPageStringsToHightlightDescriptionHighlighted": {
+ "description": "Headers (or patterns thereof) that will be ___highlighted___",
+ "message": "gemarkeerd"
+ },
+
+ "plansPageTitle": {
+ "description": "Enable extra options",
+ "message": "Schakel extra opties in"
+ },
+ "plansPageYouCan": {
+ "description": "___You can___ test all these great features every first 15 minutes of every hour:",
+ "message": "Je kunt deze extra opties"
+ },
+ "plansPageTest": {
+ "description": "You can ___test___ all these great features every first 15 minutes of every hour:",
+ "message": "testen"
+ },
+ "plansPageTheseFeatures": {
+ "description": "You can test ___all these great features___ every first 15 minutes of every hour:",
+ "message": "tijdens"
+ },
+ "plansPageEveryFirst": {
+ "description": "You can test all these great features ___every first 15 minutes___ of every hour:",
+ "message": "iedere eerste 15 minuten"
+ },
+ "plansPageOfEveryHour": {
+ "description": "You can test all these great features every first 15 minutes ___of every hour___:",
+ "message": "van ieder uur"
+ },
+ "plansPageOptionServerIp": {
+ "description": "Server IP address",
+ "message": "Server IP adres"
+ },
+ "plansPageOptionSubFrameRequests": {
+ "description": "Sub-frame requests",
+ "message": "Sub-frame requests"
+ },
+ "plansPageOptionXhrRequests": {
+ "description": "XML HTTP Requests (XHR / AJAX)",
+ "message": "XML HTTP Requests (XHR / AJAX)"
+ },
+ "plansPageOptionRequestTimes": {
+ "description": "Request times: time to headers received, time to first byte and time to complete",
+ "message": "Request tijden: tijd tot ontvangen response headers, tijd tot eerste byte en tijd tot voltooiing"
+ },
+ "plansPageOptionFilterBar": {
+ "description": "Use the filter bar to filter the headers",
+ "message": "Gebruik de filter-balk om headers te filteren"
+ },
+ "plansPageOneTimeBeerSupport": {
+ "description": "One-time beer support",
+ "message": "Eenmalige bier donatie"
+ },
+ "plansPageOneTimePizzaSupport": {
+ "description": "One-time pizza support",
+ "message": "Eenmalige pizza donatie"
+ },
+ "plansPageSubscriptions": {
+ "description": "Subscriptions",
+ "message": "Abonnementen"
+ },
+ "plansPageMangeSubscriptions": {
+ "description": "Manage subscriptions",
+ "message": "Betalingen beheer"
+ },
+ "plansPageEnableFeatures": {
+ "description": "___If you want to enable these features___ permanently, please support further development by donating me some beer/pizza:",
+ "message": "Als je deze opties"
+ },
+ "plansPageEnableFeaturesPermanently": {
+ "description": "If you want to enable these features ___permanently___, please support further development by donating me some beer/pizza:",
+ "message": "permanent"
+ },
+ "plansPageEnableFeaturesPleaseSupport": {
+ "description": "If you want to enable these features permanently___, please support further development by donating me some beer/pizza___:",
+ "message": " wilt inschakelen, kun je verdere ontwikkeling ondersteunen door wat bier/pizza te doneren"
+ },
+ "plansPageIWillSupportYouWith": {
+ "description": "___I'll support you with___ [x] pizzas",
+ "message": "Ik ondersteun je met"
+ },
+ "plansPageBeers": {
+ "description": "I'll support you with [x] ___beers___",
+ "message": "biertjes"
+ },
+ "plansPagePizzas": {
+ "description": "I'll support you with [x] ___pizzas___",
+ "message": "pizzas"
+ },
+ "plansPageThankYou": {
+ "description": "Thank you for your support ;-)",
+ "message": "Bedankt voor je ondersteuning ;-)"
+ },
+
+ "buyStatusRetrievingProducts": {
+ "description": "Retreiving available products",
+ "message": "Produkten ophalen"
+ },
+ "buyErrorRetrievingProducts": {
+ "description": "Error retrieving product list",
+ "message": "Er is een fout opgetreden bij het ophalen van de produkten"
+ },
+ "buyStatusRetrievingPurchasedProducts": {
+ "description": "Retreiving list of purchased products",
+ "message": "Produkten ophalen"
+ },
+ "buyErrorRetrievingPurchasedProducts": {
+ "description": "Error retreiving list of purchased products",
+ "message": "Er is een fout opgetreden bij het ophalen van de produkten"
+ },
+ "buyStatusPurchaseComplete": {
+ "description": "Purchase completed. Order ID",
+ "message": "Aankoop voltooid. Order id"
+ },
+ "buyErrorPurchaseFailed": {
+ "description": "Purchase failed",
+ "message": "Aankoop mislukt"
+ },
+ "aboutPageContent": {
+ "description": "Section of text describing Me",
+ "message": "Mijn naam is Michiel Roos. Ik vond het leuk om deze add-on te ontwikkelen. Ik heb er veel van geleerd. Ik hoop dat je hem nuttig vindt en hem gebruikt met plezier. Als je suggesties of opbouwende kritiek hebt, neem dan contact met me op."
+ },
+ "aboutPageContentConsiderDonation": {
+ "description": "Do you enjoy this extension? Please consider a donation:",
+ "message": "Heb je plezier van deze extensie, overweeg een donatie."
+ },
+ "aboutPageContentSayThanks": {
+ "description": "Section of text: say thanks",
+ "message": "Zeg dankjewel ;-)"
+ },
+ "thanksDisplayName": {
+ "description": "Thank you!",
+ "message": "Dank!"
+ },
+ "thanksPageThankYou": {
+ "description": "Thank you message",
+ "message": "Dank!"
+ },
+ "thanksPagePatreon": {
+ "description": "Become a patreon on",
+ "message": "Word patreon op"
+ },
+ "thanksPagePaypal": {
+ "description": "Make a donation via",
+ "message": "Doneer via"
+ },
+ "popupDefaultMessage": {
+ "description": "The default message shown in the browserAction popup",
+ "message": "Er zijn nog geen headers ontvangen. Ververs deze tab om de headers te zien."
+ },
+ "contentMessagesEnableExtraOptions": {
+ "description": "enable XHR and sub-frame requests",
+ "message": "toon XHR en sub-frame requests"
+ },
+ "contentMessagesPressEscToClosePanels": {
+ "description": "[esc] closes these panels. Click to toggle panels.",
+ "message": "[esc] sluit deze panelen. Klik om panelen te tonen / verbergen."
+ },
+ "contentMessagesCache": {
+ "description": "cache",
+ "message": "cache"
+ },
+ "contentMessagesCached": {
+ "description": "cached",
+ "message": "gecached"
+ },
+ "contentMessagesFromDiskCache": {
+ "description": "from disk cache",
+ "message": "van schijf cache"
+ },
+ "contentMessagesHeadersReceived": {
+ "description": "shorthand for headers received: ___headers recv___",
+ "message": "headers recv"
+ },
+ "contentMessagesTimeToFirstByte": {
+ "description": "shorthand for time to first byte: ___first byte___",
+ "message": "first byte"
+ },
+ "contentMessagesRequestComplete": {
+ "description": "shorthand for request completed: ___complete___",
+ "message": "complete"
+ },
+ "contentMessagesPanelTitleRequest": {
+ "description": "Request",
+ "message": "Request"
+ },
+ "contentMessagesPanelTitleResponse": {
+ "description": "Response",
+ "message": "Response"
+ },
+ "contentMessagesPanelTitleCookies": {
+ "description": "Cookies",
+ "message": "Cookies"
+ },
+ "contentMessagesPanelTitleFormData": {
+ "description": "Form Data",
+ "message": "Form Data"
+ },
+ "contentMessagesPanelTitleQuery": {
+ "description": "Query",
+ "message": "Query"
+ },
+ "contentMessagesFilterBarFilter": {
+ "description": "Filter",
+ "message": "Filter"
+ },
+ "contentMessagesFilterBarRegex": {
+ "description": "Regex",
+ "message": "Regex"
+ },
+ "contentMessagesRequestTypeDoc": {
+ "description": "Doc",
+ "message": "Doc"
+ },
+ "contentMessagesRequestTypeFrame": {
+ "description": "Frame",
+ "message": "Frame"
+ },
+ "contentMessagesRequestTypeXhr": {
+ "description": "XHR",
+ "message": "XHR"
+ },
+ "contentMessagesProEnableServerIp": {
+ "description": "enable server IP",
+ "message": "toon server IP"
+ },
+ "contentMessagesProEnableResponseTimes": {
+ "description": "enable response times",
+ "message": "toon response tijden"
+ }
+}
diff --git a/public/_locales/ru/messages.json b/public/_locales/ru/messages.json
new file mode 100644
index 0000000..1857815
--- /dev/null
+++ b/public/_locales/ru/messages.json
@@ -0,0 +1,365 @@
+{
+ "extensionDescription": {
+ "description": "The description of the extension",
+ "message": "HTTP Header Spy позволяет проверять request- заголовки ответа и печенье сразу после загрузки страницы без дополнительных кликов."
+ },
+ "extensionName": {
+ "description": "The name of the extension",
+ "message": "HTTP Header Spy"
+ },
+ "extensionNameShort": {
+ "description": "The short name of the extension",
+ "message": "Заголовки HTTP"
+ },
+
+ "optionsDisplayName": {
+ "description": "Menu title for options page",
+ "message": "Опции"
+ },
+ "aboutDisplayName": {
+ "description": "Menu title for about page",
+ "message": "О"
+ },
+ "plansDisplayName": {
+ "description": "Menu title for 'Enable extra options' page",
+ "message": "Включить дополнительные опции"
+ },
+
+ "buttonAdd": {
+ "description": "Add button text",
+ "message": "Добавить"
+ },
+ "buttonOptions": {
+ "description": "Options page button text",
+ "message": "Параметры сканирования"
+ },
+
+ "optionsPageDisplayOptions": {
+ "description": "Display options",
+ "message": "Параметры отображения"
+ },
+ "optionsPageDisplayOptionsPressEscapeToHidePanels": {
+ "description": "Press the ESC key to hide panels.",
+ "message": "Нажмите клавишу ESC, чтобы скрыть панели."
+ },
+ "optionsPageDisplayOptionsAutoHide": {
+ "description": "Press the ESC key to hide panels.",
+ "message": "Если включена функция автоматического скрытия включена, строка фильтра не будет отображаться."
+ },
+ "optionsPageDisplayOptionsShowIn": {
+ "description": "___Show in___ [mode]",
+ "message": "Показывать в"
+ },
+ "renderModeNormal": {
+ "description": "Show in [___normal___]",
+ "message": "нормальный"
+ },
+ "renderModeMicro": {
+ "description": "Show in [___micro___]",
+ "message": "микро"
+ },
+ "renderModeDisabled": {
+ "description": "Show in [___disabled___]",
+ "message": "отключено"
+ },
+ "optionsPageDisplayOptionsModeInThe": {
+ "description": "Show in [mode] ___mode, in the___",
+ "message": "Режим, в"
+ },
+ "locationTopLeftCorner": {
+ "description": "mode, in the [___top left corner___]",
+ "message": "верхний левый угол"
+ },
+ "locationTopRightCorner": {
+ "description": "mode, in the [___top right corner___]",
+ "message": "в правом верхнем углу"
+ },
+ "locationBottomLeftCorner": {
+ "description": "mode, in the [___bottom left corner___]",
+ "message": "левый нижний угол"
+ },
+ "locationBottomRightCorner": {
+ "description": "mode, in the [___bottom right corner___]",
+ "message": "нижний правый угол"
+ },
+ "optionsPageDisplayOptionsModeUsingA": {
+ "description": "mode, in the [bottom right corner] ___using a___",
+ "message": "с помощью"
+ },
+ "themeDark": {
+ "description": "using a [___dark theme___]",
+ "message": "темная тема"
+ },
+ "themeLight": {
+ "description": "using a [___light theme___]",
+ "message": "свет тема"
+ },
+ "optionsPageDisplayOptionsAndShowThe": {
+ "description": "using a [light theme] ___and show the___ [x] most recent requests",
+ "message": "и показать"
+ },
+ "optionsPageDisplayOptionsMostRecentRequests": {
+ "description": "using a [light theme] and show the [x] ___most recent requests___",
+ "message": "большинство недавних запросов"
+ },
+ "doAutoHidePanels": {
+ "description": "[___Do auto-hide panels___] after [x] seconds",
+ "message": "Do автоматического скрытия панели"
+ },
+ "doNotAutoHidePanels": {
+ "description": "[___Do not auto-hide panels___] after [x] seconds",
+ "message": "Не автоматическое скрытие панели"
+ },
+ "optionsPageDisplayOptionsAutoHideAfter": {
+ "description": "[Do auto-hide panels] ___ after___ [x] seconds",
+ "message": "после того, как"
+ },
+ "optionsPageDisplayOptionsAutoHideSeconds": {
+ "description": "[Do auto-hide panels] after [x] ___seconds___",
+ "message": "секунды"
+ },
+
+ "optionsPageHideRequestHeaders": {
+ "description": "Hide request headers",
+ "message": "Скрыть заголовки запроса"
+ },
+ "optionsPageHideRequestHeadersDescription": {
+ "description": "Request headers (or patterns thereof) that will not be displayed.",
+ "message": "В заголовках запросов (или их образцы), которые не будут отображаться."
+ },
+
+ "optionsPageHideResponseHeaders": {
+ "description": "Hide response headers",
+ "message": "Скрыть заголовки ответа"
+ },
+ "optionsPageHideResponseHeadersDescription": {
+ "description": "Response headers (or patterns thereof) that will not be displayed.",
+ "message": "заголовки ответа (или их структуры), которые не будут отображаться."
+ },
+
+ "optionsPageMicroModeHeaders": {
+ "description": "Headers to show in Micro mode",
+ "message": "Заголовки, чтобы показать в режиме Micro"
+ },
+ "optionsPageMicroModeHeadersDescription": {
+ "description": "Response headers (or patterns thereof) that will be shown in micro mode.",
+ "message": "заголовки ответа (или их структуры), которые будут показаны в микро режиме."
+ },
+
+ "optionsPageStringsToHightlight": {
+ "description": "Strings to highlight",
+ "message": "Строки, чтобы выделить"
+ },
+ "optionsPageStringsToHightlightDescription": {
+ "description": "Headers (or patterns thereof) that will be",
+ "message": "Заголовки (или шаблоны их), которые будут"
+ },
+ "optionsPageStringsToHightlightDescriptionHighlighted": {
+ "description": "Headers (or patterns thereof) that will be ___highlighted___",
+ "message": "выделенный"
+ },
+
+ "plansPageTitle": {
+ "description": "Enable extra options",
+ "message": "Включить дополнительные опции"
+ },
+ "plansPageYouCan": {
+ "description": "___You can___ test all these great features every first 15 minutes of every hour:",
+ "message": "Вы можете"
+ },
+ "plansPageTest": {
+ "description": "You can ___test___ all these great features every first 15 minutes of every hour:",
+ "message": "тест"
+ },
+ "plansPageTheseFeatures": {
+ "description": "You can test ___all these great features___ every first 15 minutes of every hour:",
+ "message": "все эти дополнительные функции"
+ },
+ "plansPageEveryFirst": {
+ "description": "You can test all these great features ___every first 15 minutes___ of every hour:",
+ "message": "каждые первые 15 минут"
+ },
+ "plansPageOfEveryHour": {
+ "description": "You can test all these great features every first 15 minutes ___of every hour___:",
+ "message": "каждого часа"
+ },
+ "plansPageOptionServerIp": {
+ "description": "Server IP address",
+ "message": "IP-адрес сервера"
+ },
+ "plansPageOptionSubFrameRequests": {
+ "description": "Sub-frame requests",
+ "message": "запросы подрамник"
+ },
+ "plansPageOptionXhrRequests": {
+ "description": "XML HTTP Requests (XHR / AJAX)",
+ "message": "XML HTTP-запросов (XHR / AJAX)"
+ },
+ "plansPageOptionRequestTimes": {
+ "description": "Request times: time to headers received, time to first byte and time to complete",
+ "message": "Запрос раз: время заголовки получены, время до первого байта и времени для завершения"
+ },
+ "plansPageOptionFilterBar": {
+ "description": "Use the filter bar to filter the headers",
+ "message": "С помощью панели фильтра для фильтрации заголовков"
+ },
+ "plansPageOneTimeBeerSupport": {
+ "description": "One-time beer support",
+ "message": "поддержка пиво Одноразовый"
+ },
+ "plansPageOneTimePizzaSupport": {
+ "description": "One-time pizza support",
+ "message": "поддержка пиццы Одноразовый"
+ },
+ "plansPageSubscriptions": {
+ "description": "Subscriptions",
+ "message": "Подписки"
+ },
+ "plansPageMangeSubscriptions": {
+ "description": "Manage subscriptions",
+ "message": "Управление подписками"
+ },
+ "plansPageEnableFeatures": {
+ "description": "___If you want to enable these features___ permanently, please support further development by donating me some beer/pizza:",
+ "message": "Если вы хотите, чтобы включить эти функции"
+ },
+ "plansPageEnableFeaturesPermanently": {
+ "description": "If you want to enable these features ___permanently___, please support further development by donating me some beer/pizza:",
+ "message": "постоянно"
+ },
+ "plansPageEnableFeaturesPleaseSupport": {
+ "description": "If you want to enable these features permanently___, please support further development by donating me some beer/pizza___:",
+ "message": ", пожалуйста, поддерживать дальнейшее развитие, пожертвовав мне пиво / пицца"
+ },
+ "plansPageIWillSupportYouWith": {
+ "description": "___I'll support you with___ [x] pizzas",
+ "message": "Я буду поддерживать вас"
+ },
+ "plansPageBeers": {
+ "description": "I'll support you with [x] ___beers___",
+ "message": "пиво"
+ },
+ "plansPagePizzas": {
+ "description": "I'll support you with [x] ___pizzas___",
+ "message": "пицц"
+ },
+ "plansPageThankYou": {
+ "description": "Thank you for your support ;-)",
+ "message": "Спасибо за Вашу поддержку ;-)"
+ },
+
+ "buyStatusRetrievingProducts": {
+ "description": "Retreiving available products",
+ "message": "Получение доступных продуктов"
+ },
+ "buyErrorRetrievingProducts": {
+ "description": "Error retrieving product list",
+ "message": "Ошибка получения списка продукции"
+ },
+ "buyStatusRetrievingPurchasedProducts": {
+ "description": "Retreiving list of purchased products",
+ "message": "Получение списка купленных продуктов"
+ },
+ "buyErrorRetrievingPurchasedProducts": {
+ "description": "Error retreiving list of purchased products",
+ "message": "Ошибка при получении списка купленных продуктов"
+ },
+ "buyStatusPurchaseComplete": {
+ "description": "Purchase completed. Order ID",
+ "message": "Покупка завершена. номер заказа"
+ },
+ "buyErrorPurchaseFailed": {
+ "description": "Purchase failed",
+ "message": "Не удалось совершить покупку"
+ },
+
+ "aboutPageContent": {
+ "description": "Section of text describing Me",
+ "message": "Меня зовут Михель Роос. У меня было много веселья разработке этого дополнения. Я также узнал много нового. Я надеюсь, что вы найдете это и полезно пользоваться ею. Если у вас есть какие-либо suggetstions или конструктивную критику, пожалуйста, свяжитесь со мной."
+ },
+ "popupDefaultMessage": {
+ "description": "The default message shown in the browserAction popup",
+ "message": "Нет заголовки еще не были захвачены в плен. Пожалуйста, перезагрузите эту вкладку, чтобы увидеть заголовки."
+ },
+
+ "contentMessagesEnableExtraOptions": {
+ "description": "enable XHR and sub-frame requests",
+ "message": "включить XHR и подрамника запросы"
+ },
+ "contentMessagesPressEscToClosePanels": {
+ "description": "[esc] closes these panels. Click to toggle panels.",
+ "message": "[ESC] закрывает эти панели. Нажмите для переключения панелей."
+ },
+ "contentMessagesCache": {
+ "description": "cache",
+ "message": "кэш"
+ },
+ "contentMessagesCached": {
+ "description": "cached",
+ "message": "кэшируются"
+ },
+ "contentMessagesFromDiskCache": {
+ "description": "from disk cache",
+ "message": "из дискового кэша"
+ },
+ "contentMessagesHeadersReceived": {
+ "description": "shorthand for headers received: ___headers recv___",
+ "message": "заголовки recv"
+ },
+ "contentMessagesTimeToFirstByte": {
+ "description": "shorthand for time to first byte: ___first byte___",
+ "message": "первый байт"
+ },
+ "contentMessagesRequestComplete": {
+ "description": "shorthand for request completed: ___complete___",
+ "message": "полный"
+ },
+ "contentMessagesPanelTitleRequest": {
+ "description": "Request",
+ "message": "Запрос"
+ },
+ "contentMessagesPanelTitleResponse": {
+ "description": "Response",
+ "message": "отклик"
+ },
+ "contentMessagesPanelTitleCookies": {
+ "description": "Cookies",
+ "message": "Печенье"
+ },
+ "contentMessagesPanelTitleFormData": {
+ "description": "Form Data",
+ "message": "Форма данных"
+ },
+ "contentMessagesPanelTitleQuery": {
+ "description": "Query",
+ "message": "запрос"
+ },
+ "contentMessagesFilterBarFilter": {
+ "description": "Filter",
+ "message": "Фильтр"
+ },
+ "contentMessagesFilterBarRegex": {
+ "description": "Regex",
+ "message": "Regex"
+ },
+ "contentMessagesRequestTypeDoc": {
+ "description": "Doc",
+ "message": "Doc"
+ },
+ "contentMessagesRequestTypeFrame": {
+ "description": "Frame",
+ "message": "Рамка"
+ },
+ "contentMessagesRequestTypeXhr": {
+ "description": "XHR",
+ "message": "XHR"
+ },
+ "contentMessagesProEnableServerIp": {
+ "description": "enable server IP",
+ "message": "включить IP-адрес сервера"
+ },
+ "contentMessagesProEnableResponseTimes": {
+ "description": "enable response times",
+ "message": "включить время отклика"
+ }
+}
diff --git a/public/_locales/zh_CN/messages.json b/public/_locales/zh_CN/messages.json
new file mode 100644
index 0000000..c80364f
--- /dev/null
+++ b/public/_locales/zh_CN/messages.json
@@ -0,0 +1,364 @@
+{
+ "extensionDescription": {
+ "description": "The description of the extension",
+ "message": "HTTP Header Spy使您可以在页面加载后立即检查请求 - 响应头和Cookie,无需额外的点击。"
+ },
+ "extensionName": {
+ "description": "The name of the extension",
+ "message": "HTTP间谍"
+ },
+ "extensionNameShort": {
+ "description": "The short name of the extension",
+ "message": "HTTP头"
+ },
+
+ "optionsDisplayName": {
+ "description": "Menu title for options page",
+ "message": "选项"
+ },
+ "aboutDisplayName": {
+ "description": "Menu title for about page",
+ "message": "关于"
+ },
+ "plansDisplayName": {
+ "description": "Menu title for 'Enable extra options' page",
+ "message": "启用额外选项"
+ },
+ "buttonAdd": {
+ "description": "Add button text",
+ "message": "加"
+ },
+ "buttonOptions": {
+ "description": "Options page button text",
+ "message": "选项页面"
+ },
+
+ "optionsPageDisplayOptions": {
+ "description": "Display options",
+ "message": "显示选项"
+ },
+ "optionsPageDisplayOptionsPressEscapeToHidePanels": {
+ "description": "Press the ESC key to hide panels.",
+ "message": "按ESC键隐藏面板。"
+ },
+ "optionsPageDisplayOptionsAutoHide": {
+ "description": "Press the ESC key to hide panels.",
+ "message": "启用自动隐藏时,不会显示过滤器栏。"
+ },
+ "optionsPageDisplayOptionsShowIn": {
+ "description": "___Show in___ [mode]",
+ "message": "显示"
+ },
+ "renderModeNormal": {
+ "description": "Show in [___normal___]",
+ "message": "正常"
+ },
+ "renderModeMicro": {
+ "description": "Show in [___micro___]",
+ "message": "微"
+ },
+ "renderModeDisabled": {
+ "description": "Show in [___disabled___]",
+ "message": "禁用"
+ },
+ "optionsPageDisplayOptionsModeInThe": {
+ "description": "Show in [mode] ___mode, in the___",
+ "message": "模式,在"
+ },
+ "locationTopLeftCorner": {
+ "description": "mode, in the [___top left corner___]",
+ "message": "左上角"
+ },
+ "locationTopRightCorner": {
+ "description": "mode, in the [___top right corner___]",
+ "message": "右上角"
+ },
+ "locationBottomLeftCorner": {
+ "description": "mode, in the [___bottom left corner___]",
+ "message": "左下角"
+ },
+ "locationBottomRightCorner": {
+ "description": "mode, in the [___bottom right corner___]",
+ "message": "右下角"
+ },
+ "optionsPageDisplayOptionsModeUsingA": {
+ "description": "mode, in the [bottom right corner] ___using a___",
+ "message": "使用a"
+ },
+ "themeDark": {
+ "description": "using a [___dark theme___]",
+ "message": "黑暗的主题"
+ },
+ "themeLight": {
+ "description": "using a [___light theme___]",
+ "message": "光主题"
+ },
+ "optionsPageDisplayOptionsAndShowThe": {
+ "description": "using a [light theme] ___and show the___ [x] most recent requests",
+ "message": "并显示"
+ },
+ "optionsPageDisplayOptionsMostRecentRequests": {
+ "description": "using a [light theme] and show the [x] ___most recent requests___",
+ "message": "最近的请求"
+ },
+ "doAutoHidePanels": {
+ "description": "[___Do auto-hide panels___] after [x] seconds",
+ "message": "自动隐藏面板"
+ },
+ "doNotAutoHidePanels": {
+ "description": "[___Do not auto-hide panels___] after [x] seconds",
+ "message": "不要自动隐藏面板"
+ },
+ "optionsPageDisplayOptionsAutoHideAfter": {
+ "description": "[Do auto-hide panels] ___ after___ [x] seconds",
+ "message": "后"
+ },
+ "optionsPageDisplayOptionsAutoHideSeconds": {
+ "description": "[Do auto-hide panels] after [x] ___seconds___",
+ "message": "秒"
+ },
+
+ "optionsPageHideRequestHeaders": {
+ "description": "Hide request headers",
+ "message": "隐藏请求标头"
+ },
+ "optionsPageHideRequestHeadersDescription": {
+ "description": "Request headers (or patterns thereof) that will not be displayed.",
+ "message": "将不显示的请求标头(或其模式)。"
+ },
+
+ "optionsPageHideResponseHeaders": {
+ "description": "Hide response headers",
+ "message": "隐藏响应标头"
+ },
+ "optionsPageHideResponseHeadersDescription": {
+ "description": "Response headers (or patterns thereof) that will not be displayed.",
+ "message": "将不显示的响应标头(或其模式)。"
+ },
+
+ "optionsPageMicroModeHeaders": {
+ "description": "Headers to show in Micro mode",
+ "message": "标题在微模式下显示"
+ },
+ "optionsPageMicroModeHeadersDescription": {
+ "description": "Response headers (or patterns thereof) that will be shown in micro mode.",
+ "message": "将在微模式中显示的响应头(或其模式)。"
+ },
+
+ "optionsPageStringsToHightlight": {
+ "description": "Strings to highlight",
+ "message": "字符串高亮"
+ },
+ "optionsPageStringsToHightlightDescription": {
+ "description": "Headers (or patterns thereof) that will be",
+ "message": "将是的标题(或其模式)"
+ },
+ "optionsPageStringsToHightlightDescriptionHighlighted": {
+ "description": "Headers (or patterns thereof) that will be ___highlighted___",
+ "message": "突出显示"
+ },
+
+ "plansPageTitle": {
+ "description": "Enable extra options",
+ "message": "启用额外选项"
+ },
+ "plansPageYouCan": {
+ "description": "___You can___ test all these great features every first 15 minutes of every hour:",
+ "message": "您可以"
+ },
+ "plansPageTest": {
+ "description": "You can ___test___ all these great features every first 15 minutes of every hour:",
+ "message": "测试"
+ },
+ "plansPageTheseFeatures": {
+ "description": "You can test ___all these great features___ every first 15 minutes of every hour:",
+ "message": "所有这些额外的功能"
+ },
+ "plansPageEveryFirst": {
+ "description": "You can test all these great features ___every first 15 minutes___ of every hour:",
+ "message": "每隔15分钟"
+ },
+ "plansPageOfEveryHour": {
+ "description": "You can test all these great features every first 15 minutes ___of every hour___:",
+ "message": "的每小时"
+ },
+ "plansPageOptionServerIp": {
+ "description": "Server IP address",
+ "message": "服务器IP地址"
+ },
+ "plansPageOptionSubFrameRequests": {
+ "description": "Sub-frame requests",
+ "message": "子帧请求"
+ },
+ "plansPageOptionXhrRequests": {
+ "description": "XML HTTP Requests (XHR / AJAX)",
+ "message": "XML HTTP请求(XHR / AJAX)"
+ },
+ "plansPageOptionRequestTimes": {
+ "description": "Request times: time to headers received, time to first byte and time to complete",
+ "message": "请求时间:接收到标头的时间,到第一个字节的时间和完成时间"
+ },
+ "plansPageOptionFilterBar": {
+ "description": "Use the filter bar to filter the headers",
+ "message": "使用过滤器栏过滤标题"
+ },
+ "plansPageOneTimeBeerSupport": {
+ "description": "One-time beer support",
+ "message": "一次性啤酒支持"
+ },
+ "plansPageOneTimePizzaSupport": {
+ "description": "One-time pizza support",
+ "message": "一次性比萨饼支持"
+ },
+ "plansPageSubscriptions": {
+ "description": "Subscriptions",
+ "message": "订阅"
+ },
+ "plansPageMangeSubscriptions": {
+ "description": "Manage subscriptions",
+ "message": "管理订阅"
+ },
+ "plansPageEnableFeatures": {
+ "description": "___If you want to enable these features___ permanently, please support further development by donating me some beer/pizza:",
+ "message": "如果要启用这些功能"
+ },
+ "plansPageEnableFeaturesPermanently": {
+ "description": "If you want to enable these features ___permanently___, please support further development by donating me some beer/pizza:",
+ "message": "永久"
+ },
+ "plansPageEnableFeaturesPleaseSupport": {
+ "description": "If you want to enable these features permanently___, please support further development by donating me some beer/pizza___:",
+ "message": ",请支持进一步发展捐赠我一些啤酒/比萨饼"
+ },
+ "plansPageIWillSupportYouWith": {
+ "description": "___I'll support you with___ [x] pizzas",
+ "message": "我会支持你的"
+ },
+ "plansPageBeers": {
+ "description": "I'll support you with [x] ___beers___",
+ "message": "啤酒"
+ },
+ "plansPagePizzas": {
+ "description": "I'll support you with [x] ___pizzas___",
+ "message": "比萨饼"
+ },
+ "plansPageThankYou": {
+ "description": "Thank you for your support ;-)",
+ "message": "感谢您的支持 ;-)"
+ },
+
+ "buyStatusRetrievingProducts": {
+ "description": "Retreiving available products",
+ "message": "检索可用产品"
+ },
+ "buyErrorRetrievingProducts": {
+ "description": "Error retrieving product list",
+ "message": "检索产品列表时出错"
+ },
+ "buyStatusRetrievingPurchasedProducts": {
+ "description": "Retreiving list of purchased products",
+ "message": "检索已购买产品的列表"
+ },
+ "buyErrorRetrievingPurchasedProducts": {
+ "description": "Error retreiving list of purchased products",
+ "message": "检索已购买产品的列表时出错"
+ },
+ "buyStatusPurchaseComplete": {
+ "description": "Purchase completed. Order ID",
+ "message": "购买完成。订单ID"
+ },
+ "buyErrorPurchaseFailed": {
+ "description": "Purchase failed",
+ "message": "购买失败"
+ },
+
+ "aboutPageContent": {
+ "description": "Section of text describing Me",
+ "message": "我的名字是Michiel Roos。我有很多乐趣开发这个插件。我也学到了很多。我希望你发现它有用,喜欢使用它。如果你有任何建议或建设性的批评,请与我联系。"
+ },
+ "popupDefaultMessage": {
+ "description": "The default message shown in the browserAction popup",
+ "message": "尚未捕获任何标头。请重新载入此标签以查看标题。"
+ },
+
+ "contentMessagesEnableExtraOptions": {
+ "description": "enable XHR and sub-frame requests",
+ "message": "启用XHR和子帧请求"
+ },
+ "contentMessagesPressEscToClosePanels": {
+ "description": "[esc] closes these panels. Click to toggle panels.",
+ "message": "[esc]关闭这些面板。单击可切换面板。"
+ },
+ "contentMessagesCache": {
+ "description": "cache",
+ "message": "缓存"
+ },
+ "contentMessagesCached": {
+ "description": "cached",
+ "message": "缓存"
+ },
+ "contentMessagesFromDiskCache": {
+ "description": "from disk cache",
+ "message": "从磁盘缓存"
+ },
+ "contentMessagesHeadersReceived": {
+ "description": "shorthand for headers received: ___headers recv___",
+ "message": "标题recv"
+ },
+ "contentMessagesTimeToFirstByte": {
+ "description": "shorthand for time to first byte: ___first byte___",
+ "message": "第一字节"
+ },
+ "contentMessagesRequestComplete": {
+ "description": "shorthand for request completed: ___complete___",
+ "message": "完成"
+ },
+ "contentMessagesPanelTitleRequest": {
+ "description": "Request",
+ "message": "请求"
+ },
+ "contentMessagesPanelTitleResponse": {
+ "description": "Response",
+ "message": "响应"
+ },
+ "contentMessagesPanelTitleCookies": {
+ "description": "Cookies",
+ "message": "饼干"
+ },
+ "contentMessagesPanelTitleFormData": {
+ "description": "Form Data",
+ "message": "表单数据"
+ },
+ "contentMessagesPanelTitleQuery": {
+ "description": "Query",
+ "message": "查询"
+ },
+ "contentMessagesFilterBarFilter": {
+ "description": "Filter",
+ "message": "过滤"
+ },
+ "contentMessagesFilterBarRegex": {
+ "description": "Regex",
+ "message": "正则表达式"
+ },
+ "contentMessagesRequestTypeDoc": {
+ "description": "Doc",
+ "message": "Doc"
+ },
+ "contentMessagesRequestTypeFrame": {
+ "description": "Frame",
+ "message": "帧"
+ },
+ "contentMessagesRequestTypeXhr": {
+ "description": "XHR",
+ "message": "XHR"
+ },
+ "contentMessagesProEnableServerIp": {
+ "description": "enable server IP",
+ "message": "启用服务器IP"
+ },
+ "contentMessagesProEnableResponseTimes": {
+ "description": "enable response times",
+ "message": "启用响应时间"
+ }
+}
diff --git a/tsconfig.json b/tsconfig.json
new file mode 100644
index 0000000..7922889
--- /dev/null
+++ b/tsconfig.json
@@ -0,0 +1,10 @@
+{
+ "extends": "./.wxt/tsconfig.json",
+ "compilerOptions": {
+ "strict": true,
+ "esModuleInterop": true,
+ "skipLibCheck": true,
+ "strictPropertyInitialization": false,
+ "typeRoots": ["./node_modules/@types", "./types"]
+ }
+}
diff --git a/types/mark.js.d.ts b/types/mark.js.d.ts
new file mode 100644
index 0000000..c1cb582
--- /dev/null
+++ b/types/mark.js.d.ts
@@ -0,0 +1,8 @@
+declare module 'mark.js' {
+ export default class Mark {
+ constructor(context: HTMLElement | Document | NodeList | Node[] | string);
+ mark(keyword: string | string[], options?: object): void;
+ markRegExp(regexp: RegExp, options?: object): void;
+ unmark(options?: object): void;
+ }
+}
diff --git a/types/wxt-browser.d.ts b/types/wxt-browser.d.ts
new file mode 100644
index 0000000..735d878
--- /dev/null
+++ b/types/wxt-browser.d.ts
@@ -0,0 +1,3 @@
+declare module 'wxt/browser' {
+ export const browser: typeof chrome;
+}
diff --git a/utils/library.ts b/utils/library.ts
new file mode 100644
index 0000000..116b153
--- /dev/null
+++ b/utils/library.ts
@@ -0,0 +1,624 @@
+import { browser } from 'wxt/browser';
+
+/**
+ * Container ID for the HTTP Header Spy elements
+ */
+export const containerId = 'httpSpyContainer_sq27T8VFex4CtQ623afyMoiYA89kG6UZ';
+
+/**
+ * Extension options interface
+ */
+export interface ExtensionOptions {
+ renderMode: string;
+ location: string;
+ theme: string;
+ tabRequestLimit: number;
+ hidePanelAfterTimeout: boolean;
+ timeout: number;
+ hideonhover: number | null;
+ hiddenRequestHeaders: string[];
+ hiddenResponseHeaders: string[];
+ shownResponseHeaders: string[];
+ activeRequestTypes: string[];
+ markers: string[];
+}
+
+/**
+ * Check if the object is defined
+ */
+export function isDefined(object: any): boolean {
+ return typeof object !== 'undefined';
+}
+
+/**
+ * Format bytes in human readable form
+ */
+export function formatBytes(bytes: number): string {
+ if (bytes >= 1000000000) {
+ return (bytes / 1000000000).toFixed(2) + ' GB';
+ }
+ else if (bytes >= 1000000) {
+ return (bytes / 1000000).toFixed(2) + ' MB';
+ }
+ else if (bytes >= 1000) {
+ return (bytes / 1000).toFixed(2) + ' KB';
+ }
+ else if (bytes > 1) {
+ return bytes + ' bytes';
+ }
+ else if (bytes == 1) {
+ return bytes + ' byte';
+ }
+ else {
+ return '0 byte';
+ }
+}
+
+/**
+ * Filter the headers
+ */
+export function filterHeaders(container: HTMLElement, query: string, isRegex: boolean): void {
+ if (isRegex) {
+ try {
+ const regex = new RegExp(query, 'ig');
+ Array.from(container.getElementsByTagName('tr')).forEach((element) => {
+ if (element.textContent && element.textContent.match(regex) !== null) {
+ element.style.display = 'table-row';
+ } else {
+ element.style.display = 'none';
+ }
+ });
+
+ import('mark.js').then(({ default: Mark }) => {
+ const magicMarker = new Mark(container);
+ const regexp = new RegExp(query, 'gmi');
+ magicMarker.unmark();
+ magicMarker.markRegExp(regexp);
+ });
+ } catch (e) {
+ console.error('Invalid regex:', e);
+ }
+ } else {
+ Array.from(container.getElementsByTagName('tr')).forEach((element) => {
+ if (element.textContent && element.textContent.toLowerCase().includes(query.toLowerCase())) {
+ element.style.display = 'table-row';
+ } else {
+ element.style.display = 'none';
+ }
+ });
+
+ import('mark.js').then(({ default: Mark }) => {
+ const magicMarker = new Mark(container);
+ magicMarker.unmark();
+ magicMarker.mark(query);
+ });
+ }
+}
+
+/**
+ * Format milliseconds in human readable form
+ */
+export function formatMilliseconds(ms: number): string {
+ const zeroDate = new Date();
+ zeroDate.setHours(0);
+ zeroDate.setMinutes(0);
+ zeroDate.setSeconds(0);
+ zeroDate.setMilliseconds(0);
+
+ const date = new Date(zeroDate.getTime() + parseInt(ms.toString(), 10));
+ const hours = date.getHours();
+ const minutes = date.getMinutes();
+ const seconds = date.getSeconds();
+ const milliseconds = date.getMilliseconds();
+ const duration: string[] = [];
+
+ if (hours) {
+ duration.push(hours + 'h');
+ }
+ if (minutes) {
+ duration.push(minutes + 'm');
+ }
+ if (seconds) {
+ duration.push(seconds + 's');
+ }
+ if (milliseconds) {
+ duration.push(milliseconds + ' ms');
+ }
+
+ return duration.join(' ');
+}
+
+/**
+ * Create a table row
+ */
+export function getTableRow(key: string, value: string): HTMLTableRowElement {
+ const row = document.createElement('tr');
+ const keyCell = document.createElement('td');
+ const keyText = document.createTextNode(key);
+ const valueCell = document.createElement('td');
+ const valueText = document.createTextNode(value);
+ const cutoffKeySpan = document.createElement('span');
+ const cutoffValueSpan = document.createElement('span');
+
+ cutoffKeySpan.className = 'cutoff';
+ cutoffKeySpan.appendChild(keyText);
+ cutoffValueSpan.className = 'cutoff';
+
+ keyCell.className = 'key';
+ keyCell.title = key;
+ keyCell.appendChild(cutoffKeySpan);
+
+ valueCell.className = 'value';
+ cutoffValueSpan.appendChild(valueText);
+ valueCell.title = value;
+ valueCell.appendChild(cutoffValueSpan);
+
+ row.appendChild(keyCell);
+ row.appendChild(valueCell);
+
+ return row;
+}
+
+/**
+ * Check if a value is in a list
+ */
+export function isValueInList(list: string[], value: string): boolean {
+ if (!list || !Array.isArray(list)) {
+ return false;
+ }
+
+ return list.some(item =>
+ item.toLowerCase() === value.toLowerCase()
+ );
+}
+
+/**
+ * Get time to complete style
+ */
+export function getTimeToCompleteStyle(time: number): string {
+ if (time < 100) {
+ return 'veryFast';
+ } else if (time < 250) {
+ return 'fast';
+ } else if (time < 500) {
+ return 'medium';
+ } else if (time < 1000) {
+ return 'slow';
+ } else {
+ return 'verySlow';
+ }
+}
+
+/**
+ * Get a separator
+ */
+export function getSeparator(): HTMLDivElement {
+ const separator = document.createElement('div');
+ separator.className = 'separator';
+ return separator;
+}
+
+/**
+ * Get status style
+ */
+export function getStatusStyle(statusCode: string): string {
+ const code = parseInt(statusCode, 10);
+ if (code >= 500) {
+ return 'serverError';
+ } else if (code >= 400) {
+ return 'clientError';
+ } else if (code >= 300) {
+ return 'redirect';
+ } else if (code >= 200) {
+ return 'success';
+ } else {
+ return 'info';
+ }
+}
+
+/**
+ * Toggle element visibility
+ */
+export function toggleElementVisibility(element: HTMLElement): void {
+ if (element.classList.contains('hidden')) {
+ element.classList.remove('hidden');
+ element.classList.add('visible');
+ } else {
+ element.classList.remove('visible');
+ element.classList.add('hidden');
+ }
+}
+
+/**
+ * Hide element
+ */
+export function hideElement(element: HTMLElement): void {
+ element.classList.remove('visible');
+ element.classList.add('hidden');
+}
+
+/**
+ * Show element
+ */
+export function showElement(element: HTMLElement): void {
+ element.classList.remove('hidden');
+ element.classList.add('visible');
+}
+
+/**
+ * Restore options from storage
+ */
+export async function restoreOptions(): Promise {
+ const defaultOptions: ExtensionOptions = {
+ renderMode: 'microMode',
+ location: 'bottomRight',
+ theme: 'dark',
+ tabRequestLimit: 15,
+ hidePanelAfterTimeout: true,
+ timeout: 5,
+ hideonhover: null,
+ hiddenRequestHeaders: [],
+ hiddenResponseHeaders: [],
+ shownResponseHeaders: ['content-type', 'content-length', 'cache-control'],
+ activeRequestTypes: ['main_frame', 'sub_frame', 'xmlhttprequest'],
+ markers: []
+ };
+
+ const result = await browser.storage.local.get(Object.keys(defaultOptions));
+ return { ...defaultOptions, ...result };
+}
+
+/**
+ * Save option to storage
+ */
+export async function saveOption(key: string, value: any): Promise {
+ const option: Record = {};
+ option[key] = value;
+ await browser.storage.local.set(option);
+}
+
+/**
+ * Check if URL is valid for the extension
+ */
+export function isValidUrl(url: string): boolean {
+ return url !== undefined &&
+ url !== 'about:blank' &&
+ !url.startsWith('chrome://') &&
+ !url.startsWith('chrome-extension://') &&
+ !url.startsWith('moz-extension://') &&
+ !url.startsWith('about:');
+}
+
+/**
+ * Get a cookie table
+ */
+export function getCookieTable(value: string): HTMLTableElement {
+ const table = document.createElement('table');
+ const cookieLines = value.split('; ');
+
+ table.className = 'cookieTable';
+ cookieLines.forEach(function (line) {
+ const key = line.substring(0, line.indexOf('='));
+ const value = line.substring(line.indexOf('=') + 1);
+ table.appendChild(getTableRow(key, value));
+ });
+
+ return table;
+}
+
+/**
+ * Create panel section
+ */
+export function getPanelSection(
+ title: string,
+ isOpen: boolean,
+ content: HTMLElement,
+ cookies?: HTMLElement,
+ query?: HTMLElement,
+ formData?: HTMLElement
+): HTMLDivElement {
+ const section = document.createElement('div');
+ const summary = document.createElement('summary');
+ const details = document.createElement('details');
+ const sectionTitleText = document.createTextNode(title);
+
+ summary.classList.add('sectionTitle', 'noSelect');
+ summary.appendChild(sectionTitleText);
+ details.open = Boolean(isOpen);
+ details.appendChild(summary);
+ details.appendChild(content);
+
+ if (isDefined(query) && query) {
+ const querySummary = document.createElement('summary');
+ const queryDetails = document.createElement('details');
+ const sectionQueryTitleText = document.createTextNode(browser.i18n.getMessage('contentMessagesPanelTitleQuery') || 'Query');
+
+ querySummary.appendChild(sectionQueryTitleText);
+ querySummary.classList.add('sectionTitle', 'noSelect');
+ queryDetails.appendChild(querySummary);
+ queryDetails.appendChild(query);
+ details.appendChild(queryDetails);
+ }
+
+ if (isDefined(cookies) && cookies) {
+ const cookieSummary = document.createElement('summary');
+ const cookieDetails = document.createElement('details');
+ const sectionCookieTitleText = document.createTextNode(title + ' ' + (browser.i18n.getMessage('contentMessagesPanelTitleCookies') || 'Cookies'));
+
+ cookieSummary.appendChild(sectionCookieTitleText);
+ cookieSummary.classList.add('sectionTitle', 'noSelect');
+ cookieDetails.appendChild(cookieSummary);
+ cookieDetails.appendChild(cookies);
+ details.appendChild(cookieDetails);
+ }
+
+ if (isDefined(formData) && formData) {
+ const formDataSummary = document.createElement('summary');
+ const formDataDetails = document.createElement('details');
+ const sectionFormDataTitleText = document.createTextNode(browser.i18n.getMessage('contentMessagesPanelTitleFormData') || 'Form Data');
+
+ formDataSummary.appendChild(sectionFormDataTitleText);
+ formDataSummary.classList.add('sectionTitle', 'noSelect');
+ formDataDetails.appendChild(formDataSummary);
+ formDataDetails.appendChild(formData);
+ details.appendChild(formDataDetails);
+ }
+
+ section.appendChild(details);
+ return section;
+}
+
+/**
+ * Get time to first byte
+ */
+export function getTimeToFirstByte(headers: any, i: number): number {
+ if (!isDefined(headers.timeToFirstByte[i]) || headers.timeToFirstByte[i] === null) {
+ return 0;
+ }
+
+ const time = new Date(headers.timeToFirstByte[i].timeStamp - headers.request[i].timeStamp);
+ const milliseconds = time.getMilliseconds();
+ const seconds = time.getSeconds();
+ const minutes = time.getMinutes();
+
+ return milliseconds + seconds * 1000 + minutes * 60 * 1000;
+}
+
+/**
+ * Get time to completion
+ */
+export function getTimeToComplete(headers: any, i: number): number {
+ if (!isDefined(headers.timeToComplete[i]) || headers.timeToComplete[i] === null) {
+ return 0;
+ }
+
+ const time = new Date(headers.timeToComplete[i].timeStamp - headers.request[i].timeStamp);
+ const milliseconds = time.getMilliseconds();
+ const seconds = time.getSeconds();
+ const minutes = time.getMinutes();
+
+ return milliseconds + seconds * 1000 + minutes * 60 * 1000;
+}
+
+/**
+ * Get time to first header
+ */
+export function getTimeToFirstHeader(headers: any, i: number): number {
+ if (!isDefined(headers.timeToHeadersReceived[i]) || headers.timeToHeadersReceived[i] === null) {
+ return 0;
+ }
+
+ const time = new Date(headers.timeToHeadersReceived[i].timeStamp - headers.request[i].timeStamp);
+ const milliseconds = time.getMilliseconds();
+ const seconds = time.getSeconds();
+ const minutes = time.getMinutes();
+
+ return milliseconds + seconds * 1000 + minutes * 60 * 1000;
+}
+
+/**
+ * Get a request panel
+ */
+export function getPanel(headers: any, requestId: string, options: ExtensionOptions): HTMLDivElement {
+ const content = document.createElement('div');
+
+ content.className = 'normalMode';
+ content.dataset.requestId = requestId;
+
+ for (let i = 0, len = Object.keys(headers.request).length; i < len; ++i) {
+ const panel = document.createElement('div');
+ const request = headers.request[i];
+ const response = headers.response[i];
+
+ if (!isDefined(response)) {
+ continue;
+ }
+
+ content.classList.add(options.activeRequestTypes.includes(request.type) ? 'visible' : 'hidden');
+ content.dataset.requestType = request.type;
+
+ const urlDiv = document.createElement('div');
+ const method = document.createTextNode(request.method);
+ const statusSpan = document.createElement('span');
+ const urlLink = document.createElement('a');
+ const urlText = document.createTextNode(request.url);
+ const statusLine = document.createElement('p');
+ const statusLineText = document.createTextNode(response.statusLine);
+ const statusLineCacheSpan = document.createElement('span');
+ const statusLineCacheText = document.createTextNode(response.fromCache ?
+ ' (' + (browser.i18n.getMessage('contentMessagesFromDiskCache') || 'from disk cache') + ')' : '');
+
+ urlDiv.classList.add('url', 'key');
+ urlLink.className = 'location';
+ urlLink.href = request.url;
+ urlLink.title = request.url;
+ urlLink.appendChild(urlText);
+ statusSpan.classList.add('status', getStatusStyle(String(response.statusCode)));
+ statusSpan.appendChild(method);
+ urlDiv.appendChild(statusSpan);
+ urlDiv.appendChild(urlLink);
+ panel.appendChild(urlDiv);
+
+ statusLine.className = 'value';
+ statusLine.title = 'tabId\t\t' + request.tabId +
+ '\nframeId\t' + request.frameId +
+ '\nrequestId\t' + request.requestId +
+ '\ntype\t\t' + request.type;
+ statusLine.appendChild(statusLineText);
+ statusLineCacheSpan.appendChild(statusLineCacheText);
+ statusLineCacheSpan.className = 'key';
+ statusLine.appendChild(statusLineCacheSpan);
+ panel.appendChild(statusLine);
+
+ const sectionContentTable = document.createElement('table');
+ const sectionCookieTables = document.createElement('div');
+ sectionCookieTables.className = 'cookieTables';
+
+ request.requestHeaders.forEach(function (header: any) {
+ const lowercaseName = header.name.toLowerCase();
+ if (lowercaseName === 'cookie') {
+ sectionCookieTables.appendChild(getCookieTable(header.value));
+ } else {
+ if (!isValueInList(options.hiddenRequestHeaders, lowercaseName)) {
+ sectionContentTable.appendChild(getTableRow(header.name, header.value));
+ }
+ }
+ });
+
+ let queryContentTable: HTMLTableElement | undefined;
+ if (isDefined(request.getData) && request.getData && request.getData.length) {
+ queryContentTable = document.createElement('table');
+ request.getData.forEach(function (parameter: any) {
+ if (queryContentTable) {
+ queryContentTable.appendChild(getTableRow(parameter.key, parameter.value));
+ }
+ });
+ }
+
+ let formDataContentTable: HTMLTableElement | undefined;
+ if (isDefined(request.requestBody) && request.requestBody && request.requestBody.formData) {
+ formDataContentTable = document.createElement('table');
+ for (let parameterKey in request.requestBody.formData) {
+ let value: string | any[] = '';
+ if (request.requestBody.formData.hasOwnProperty(parameterKey)) {
+ value = request.requestBody.formData[parameterKey];
+ if (typeof value === 'object' && value !== null && Array.isArray(value)) {
+ switch (value.length) {
+ case 0:
+ value = '';
+ break;
+ case 1:
+ value = value[0];
+ break;
+ default:
+ value = JSON.stringify(value);
+ }
+ }
+ }
+ formDataContentTable.appendChild(getTableRow(parameterKey, String(value)));
+ }
+ }
+
+ panel.appendChild(getPanelSection(
+ browser.i18n.getMessage('contentMessagesPanelTitleRequest') || 'Request',
+ false,
+ sectionContentTable,
+ sectionCookieTables.hasChildNodes() ? sectionCookieTables : undefined,
+ queryContentTable,
+ formDataContentTable
+ ));
+
+ const responseContentTable = document.createElement('table');
+ const responseCookieTables = document.createElement('div');
+ responseCookieTables.className = 'cookieTables';
+
+ response.responseHeaders.forEach(function (header: any) {
+ const lowercaseName = header.name.toLowerCase();
+ if (lowercaseName === 'set-cookie') {
+ responseCookieTables.appendChild(getCookieTable(header.value));
+ } else {
+ if (!isValueInList(options.hiddenResponseHeaders, header.name.toLowerCase())) {
+ responseContentTable.appendChild(getTableRow(header.name, header.value));
+ }
+ }
+ });
+
+ panel.appendChild(getPanelSection(
+ browser.i18n.getMessage('contentMessagesPanelTitleResponse') || 'Response',
+ i === (len - 1),
+ responseContentTable,
+ responseCookieTables.hasChildNodes() ? responseCookieTables : undefined
+ ));
+
+ content.appendChild(panel);
+ if (i < (len - 1)) {
+ content.appendChild(getSeparator());
+ }
+ }
+
+ return content;
+}
+
+/**
+ * Get request types
+ */
+export function getRequestTypeFiters(options: ExtensionOptions): HTMLDivElement {
+ const requestTypes = document.createElement('div');
+ const xhr = document.createElement('div');
+ const mainFrame = document.createElement('div');
+ const subFrame = document.createElement('div');
+
+ requestTypes.className = 'requestTypes';
+
+ xhr.className = 'type xmlhttprequest';
+ xhr.textContent = 'XHR';
+ xhr.title = 'XMLHttpRequest';
+ xhr.classList.add(options.activeRequestTypes.includes('xmlhttprequest') ? 'active' : 'inactive');
+
+ mainFrame.className = 'type main_frame';
+ mainFrame.textContent = 'DOC';
+ mainFrame.title = 'Document';
+ mainFrame.classList.add(options.activeRequestTypes.includes('main_frame') ? 'active' : 'inactive');
+
+ subFrame.className = 'type sub_frame';
+ subFrame.textContent = 'FRM';
+ subFrame.title = 'Frame';
+ subFrame.classList.add(options.activeRequestTypes.includes('sub_frame') ? 'active' : 'inactive');
+
+ requestTypes.appendChild(xhr);
+ requestTypes.appendChild(mainFrame);
+ requestTypes.appendChild(subFrame);
+
+ return requestTypes;
+}
+
+/**
+ * Get toolbar
+ */
+export function getToolbar(options: ExtensionOptions): HTMLDivElement {
+ const toolBarContainer = document.createElement('div');
+ toolBarContainer.className = options.renderMode;
+ toolBarContainer.id = 'toolBar';
+
+ const requestTypes = getRequestTypeFiters(options);
+ toolBarContainer.appendChild(requestTypes);
+
+ const filterContainer = document.createElement('div');
+ filterContainer.className = 'filter';
+
+ const filterInput = document.createElement('input');
+ filterInput.type = 'text';
+ filterInput.id = 'inlineFilterInput';
+ filterInput.placeholder = browser.i18n.getMessage('contentMessagesFilterHeaders') || 'Filter headers';
+
+ const filterAllowRegex = document.createElement('input');
+ filterAllowRegex.type = 'checkbox';
+ filterAllowRegex.id = 'inlineFilterAllowRegex';
+ filterAllowRegex.title = browser.i18n.getMessage('contentMessagesAllowRegex') || 'Allow regex';
+
+ filterContainer.appendChild(filterInput);
+ filterContainer.appendChild(filterAllowRegex);
+ toolBarContainer.appendChild(filterContainer);
+
+ return toolBarContainer;
+}
diff --git a/wxt.config.ts b/wxt.config.ts
new file mode 100644
index 0000000..26b3e30
--- /dev/null
+++ b/wxt.config.ts
@@ -0,0 +1,28 @@
+import { defineConfig } from 'wxt';
+
+export default defineConfig({
+ manifest: {
+ name: '__MSG_extensionName__',
+ short_name: '__MSG_extensionNameShort__',
+ version: '2.0.49',
+ description: '__MSG_extensionDescription__',
+ author: { email: 'michiel@michielroos.com' },
+ homepage_url: 'http://www.michielroos.com/',
+ default_locale: 'en',
+ permissions: [
+ 'tabs',
+ 'activeTab',
+ 'storage',
+ 'webRequest',
+ 'webRequestBlocking'
+ ],
+ host_permissions: [
+ 'http://*/*',
+ 'https://*/*'
+ ],
+ web_accessible_resources: [{
+ resources: ['Resources/HTML/plans.html', 'Resources/HTML/thanks.html'],
+ matches: ['']
+ }]
+ }
+});