Merge pull request #1 from timmyrs/master

Update from sources
This commit is contained in:
Rom 2019-02-21 13:36:45 +01:00 committed by GitHub
commit 3716e8796f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
59 changed files with 25525 additions and 907 deletions

View File

@ -1,4 +1,6 @@
{
"html_has_js": false,
"json_severity": "failure"
{
"html_has_js": false,
"php_has_html": false,
"json_severity": "failure",
"ignore": ["html/ace/"]
}

63
.build.php Normal file
View File

@ -0,0 +1,63 @@
<?php
if(file_exists("Universal Bypass.zip"))
{
unlink("Universal Bypass.zip");
}
if(file_exists("Universal Bypass for Firefox.zip"))
{
unlink("Universal Bypass for Firefox.zip");
}
echo "Indexing...\n";
$index = [];
function recursivelyIndex($dir)
{
global $index;
foreach(scandir($dir) as $f)
{
if(substr($f, 0, 1) != ".")
{
$fn = $dir."/".$f;
if(is_dir($fn))
{
recursivelyIndex($fn);
}
else
{
array_push($index, substr($fn, 2));
}
}
}
}
recursivelyIndex(".");
echo "Building...\n";
function createZip($file)
{
$zip = new ZipArchive();
$zip->open($file, ZipArchive::CREATE + ZipArchive::EXCL + ZipArchive::CHECKCONS) or die("Failed to create {$file}.\n");
return $zip;
}
$build = createZip("Universal Bypass.zip");
$firefox = createZip("Universal Bypass for Firefox.zip");
foreach($index as $fn)
{
if($fn == "README.md")
{
continue;
}
if($fn == "manifest.json")
{
$json = json_decode(file_get_contents($fn), true);
unset($json["web_accessible_resources"]);
$json["incognito"] = "split";
$build->addFromString($fn, json_encode($json, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES));
}
else
{
$build->addFile($fn, $fn);
}
$firefox->addFile($fn, $fn);
}
$build->close();
$firefox->close();

1
.gitignore vendored
View File

@ -1 +0,0 @@
Universal Bypass.zip

50
.update_locales.php Normal file
View File

@ -0,0 +1,50 @@
<?php
function recursivelyDelete($file)
{
if(is_dir($file))
{
foreach(scandir($file) as $child)
{
if(!in_array($child, [".", ".."]))
{
recursivelyDelete($file."/".$child);
}
}
rmdir($file);
}
else
{
unlink($file);
}
}
if(!file_exists("bypass.zip"))
{
die("bypass.zip not found.\n");
}
$zip = new ZipArchive();
$zip->open("bypass.zip") or die("Failed to open bypass.zip\n");
rename("_locales/en/messages.json", "messages.json");
recursivelyDelete("_locales");
$zip->extractTo("_locales");
foreach(scandir("_locales") as $locale)
{
if(in_array($locale, [".", ".."]))
{
continue;
}
unlink("_locales/{$locale}/marketing.json");
if(file_get_contents("_locales/{$locale}/messages.json") == "{\n\n}")
{
recursivelyDelete("_locales/{$locale}");
continue;
}
if(in_array($locale, ["es-ES"]))
{
rename("_locales/{$locale}", "_locales/".substr($locale, 0, 2));
}
}
$zip->close();
unlink("bypass.zip");
mkdir("_locales/en");
rename("messages.json", "_locales/en/messages.json");

View File

@ -1,6 +1,6 @@
MIT License
Copyright (c) 2018 Hellsh Ltd.
Copyright (c) 2018-2019, Tim "timmyRS" Speckhals
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

5
PRIVACY.md Normal file
View File

@ -0,0 +1,5 @@
# Privacy Policy
When Crowd Bypass (Options > "Give and take the destinations of unbypassable shorteners.") is enabled, a request to my server is being sent for it to work, of which I store nothing.
I use Clouflare and [their privacy policy](https://www.cloudflare.com/privacypolicy/) applies to you as an "End User."

View File

@ -2,4 +2,8 @@
Don't waste your time with compliance. Universal Bypass automatically skips annoying link shorteners.
[Get the Extension for Chrome and/or Firefox.](https://universal-bypass.org)
- [Translate Universal Bypass on Crowdin](https://crowdin.com/project/bypass)
- [Homepage](https://universal-bypass.org)
- [Install Universal Bypass](https://universal-bypass.org/install)
- [FAQ](https://universal-bypass.org/faq)
- [Changelog](https://universal-bypass.org/changelog)

68
_locales/ar/messages.json Normal file
View File

@ -0,0 +1,68 @@
{
"appDesc": {
"message": "لا تضيع وقتك بالتخطي. المتجاوز الشامل سيتخطى تلقائيًا كل مواقع إختصار الروابط المزعجة."
},
"firstrunTitle": {
"message": "شكرًا لتثبيتك المتجاوز الشامل!"
},
"firstrunSubtitle": {
"message": "أنت رائع!"
},
"firstrunNoScript": {
"message": "للاسف يبدو أنك تستخدم NoScript أو احد الاضافات المماثلة التي تكون غير متوافقة مع المتجاوز الشامل."
},
"faq": {
"message": "الأسئلة المتداولة"
},
"options": {
"message": "الخيارات"
},
"optionsEnabled": {
"message": "تمكين تجاوز مواقع الويب."
},
"optionsInstantNavigation": {
"message": "قم بنقلي إلى الوجهات تلقائيًا."
},
"optionsTrackerBypass": {
"message": "تجاوز المتتبعين بإستخدام Apimon.de."
},
"optionsBlockIPLoggers": {
"message": "حظر مسجلات الـ IP إذا كان لا يمكن تجاوزهم."
},
"optionsCrowdBypass": {
"message": "إعطاء وأخذ وجهات الروابط المختصرة الغير قابلة للتجاوز."
},
"privacyPolicy": {
"message": "سياسة الخصوصية"
},
"optionsUserscripts": {
"message": "عمليات التجاوز المخصصة"
},
"optionsUserscriptsSubtitle": {
"message": "سيكون من الرائع إذا كنت تستطيع إرسال متجاوزات تعمل إلى صفحة الـ GitHub، حتى يستطيع اﻵخرين اﻹستفادة منها."
},
"beforeNavigate": {
"message": "انت الأن قريب من وجهتك."
},
"beforeNavigateDestination": {
"message": "وجهتك هي %"
},
"beforeNavigateInfo": {
"message": "هل تريد من المتجاوز الشامل إعادة توجيهك علي الفور الي وجهتك؟"
},
"blockedTitle": {
"message": "المتجاوز الشامل قام بمنع تسجيل عنوان الـ IP الخاص بك."
},
"blockedSubtitle": {
"message": "لا تريد من المتجاوز الشامل ان يمنع الجهات السيئه من الحصول علي الأي بي الخاص بك ؟"
},
"crowdBypassed": {
"message": "ربما لن تحتاج للإنتظار بعد الأن!"
},
"crowdBypassedInfo": {
"message": "قام مستخدمون آخرون للمتجاوز الشامل بالإنتظار بدلاً عنك والتبليع بأن هذا الرابط يؤدي إلى %"
},
"crowdBypassedIgnore": {
"message": "ليس هذا صحيحًا؟"
}
}

50
_locales/az/messages.json Normal file
View File

@ -0,0 +1,50 @@
{
"appDesc": {
"message": "Vaxtınızı uyğunlaşdırmaya xərcləməyin. Universal Bypass, zəhlətökən bağlantı qısaldıcılarını ötürür."
},
"firstrunTitle": {
"message": "Universal Bypass quraşdırdığınız üçün təşəkkürlər!"
},
"firstrunSubtitle": {
"message": "Mükəmməlsiniz!"
},
"firstrunNoScript": {
"message": "Buna baxmayaraq, Universal Bypass ilə uyğunlaşmayan NoScript və ya oxşarını istifadə edirsiniz."
},
"optionsInstantNavigation": {
"message": "Məni dərhal təyinat yerinə apar."
},
"optionsTrackerBypass": {
"message": "Apimon.de istifadə edən Bypass izləyiciləri."
},
"optionsBlockIPLoggers": {
"message": "Ötürə bilməsə, IP qeydlərini əngəllə."
},
"optionsCrowdBypass": {
"message": "Ötürülə bilməyən qısaldıcıların yerlərini verin və aparın."
},
"privacyPolicy": {
"message": "Gizlilik Siyasəti"
},
"optionsUserscripts": {
"message": "Özəl Bypass-lar"
},
"beforeNavigate": {
"message": "Demək olar ki, təyinat yerindəsiniz."
},
"beforeNavigateDestination": {
"message": "Təyinat yeri %"
},
"blockedTitle": {
"message": "Universal Bypass, IP ünvanların qeydlərə əlavə edilməsinin qarşısı aldı."
},
"crowdBypassed": {
"message": "Gözləməyinizə ehtiyac yoxdur!"
},
"crowdBypassedInfo": {
"message": "Digər Universal Bypass istifadəçiləri artıq sizi gözlədilər və bunun % a çatdığı bildirildi"
},
"crowdBypassedIgnore": {
"message": "Bu doğru deyil?"
}
}

68
_locales/bg/messages.json Normal file
View File

@ -0,0 +1,68 @@
{
"appDesc": {
"message": "Не си губете времето със спазването. Universal Bypass автоматично прескача досадни съкращения на връзки."
},
"firstrunTitle": {
"message": "Благодарим ви за инсталирането на Universal Bypass!"
},
"firstrunSubtitle": {
"message": "Ти си невероятен!"
},
"firstrunNoScript": {
"message": "Въпреки това изглежда, че използвате NoScript или подобен, с който Universal Bypass не е съвместим."
},
"faq": {
"message": "Често задавани въпроси (FAQ)"
},
"options": {
"message": "Настроики"
},
"optionsEnabled": {
"message": "Активирайте заобикалянето на уебсайтовете."
},
"optionsInstantNavigation": {
"message": "Незабавно ме отведе до дестинации."
},
"optionsTrackerBypass": {
"message": "Заобиколете тракерите, използвайки Apimon.de."
},
"optionsBlockIPLoggers": {
"message": "Блокирайте IP регистраторите, ако не могат да бъдат прескочени."
},
"optionsCrowdBypass": {
"message": "Дайте и вземете дестинациите на непроходимите сайтове."
},
"privacyPolicy": {
"message": "Декларация за поверителност"
},
"optionsUserscripts": {
"message": "Персонализирани байпаси"
},
"optionsUserscriptsSubtitle": {
"message": "Би било хубаво, ако можете да изпратите работещи байпаси на GitHub, за да могат другите да се възползват от тях."
},
"beforeNavigate": {
"message": "Почти сте на местоназначението си."
},
"beforeNavigateDestination": {
"message": "Вашата дестинация е %"
},
"beforeNavigateInfo": {
"message": "Искате ли Universal Bypass незабавно да ви пренасочи към вашата дестинация?"
},
"blockedTitle": {
"message": "Universal Bypass предотврати регистрирането на вашия IP адрес."
},
"blockedSubtitle": {
"message": "Не искате Universal Bypass да попречи на лошите хора да получат вашия IP адрес?"
},
"crowdBypassed": {
"message": "Може да не се наложи да чакате!"
},
"crowdBypassedInfo": {
"message": "Други потребители на Universal Bypass вече са ви чакали и съобщиха, че това води до %"
},
"crowdBypassedIgnore": {
"message": "Не беше ли това правилно?"
}
}

41
_locales/ca/messages.json Normal file
View File

@ -0,0 +1,41 @@
{
"appDesc": {
"message": "No perdis el teu temps amb la conformitat. Universal Bypass se salta automàticament molests escurçadors d'enllaços."
},
"firstrunTitle": {
"message": "Gràcies per instal·lar Universal Bypass!"
},
"firstrunSubtitle": {
"message": "Ets fantàstic!"
},
"firstrunNoScript": {
"message": "Però, sembla que estàs utilitzant NoScript o similar, amb la qual Universal Bypass no és compatible."
},
"optionsTrackerBypass": {
"message": "Circumval·la rastrejadors utilitzant Apimon.de."
},
"optionsBlockIPLoggers": {
"message": "Bloqueja registradors d'adreces IP si no poden circumval·lar-se."
},
"optionsCrowdBypass": {
"message": "Comparteix i rep la destinació de escurçadors no circumval·lables."
},
"privacyPolicy": {
"message": "Política de privacitat"
},
"optionsUserscripts": {
"message": "Circumval·lacions personalitzades"
},
"blockedTitle": {
"message": "Universal Bypass ha impedit que la seva adreça IP es registrés."
},
"crowdBypassed": {
"message": "Potser que no hagis d'esperar!"
},
"crowdBypassedInfo": {
"message": "Altres usuaris de Universal Bypass ja han esperat per tu i han informat que això porta a %"
},
"crowdBypassedIgnore": {
"message": "Això no era correcte?"
}
}

View File

@ -8,52 +8,61 @@
"firstrunSubtitle": {
"message": "Du bist der Beste!"
},
"firstrunWhatnow": {
"message": "Was du nun tun kannst:"
"firstrunNoScript": {
"message": "Jedoch sieht es so aus, als ob du NoScript oder ähnliches verwendest, womit Universal Bypass nicht kompatibel ist."
},
"firstrunOptions": {
"message": "Ändere die Universal Bypass Optionen."
},
"firstrunTwitter": {
"message": "Folge Universal Bypass auf Twitter um immer auf dem neusten Stand zu sein."
},
"homepage": {
"message": "Homepage"
},
"popupOptions": {
"message": "Optionen"
"faq": {
"message": "Häufig gestellte Fragen (FAQ)"
},
"options": {
"message": "Universal Bypass Optionen"
"message": "Optionen"
},
"save": {
"message": "Speichern"
"optionsEnabled": {
"message": "Aktiviere Webseiten-Umgehungen."
},
"optionsNotifications": {
"message": "Status-Meldungen auf Webseiten, die Universal Bypass kennt, anzeigen."
"optionsInstantNavigation": {
"message": "Navigiere mich automatisch zu Ziel-Urls."
},
"optionsTrackerBypass": {
"message": "Umgehe Tracker mit Apimon.de."
},
"optionsBlockIPLoggers": {
"message": "Blockiere IP-Logger wenn sie nicht umgangen werden können."
},
"optionsCrowdBypass": {
"message": "Gebe und nehme die Ziel-Urls von unumgänglichen Linkkürzern."
},
"privacyPolicy": {
"message": "Datenschutzerklärung"
},
"optionsUserscripts": {
"message": "Eigene Umgehungen"
},
"optionsUserscriptsSubtitle": {
"message": "Es wäre nett, wenn du funktionierende Umgehungen auf GitHub einreichen wüdest, damit Andere auch davon profitieren können: "
"message": "Es wäre nett, wenn du funktionierende Umgehungen auf GitHub einreichen würdest, damit Andere auch davon profitieren können."
},
"optionsUserscriptsName": {
"message": "Name. Mit einem leeren Namen, wird diese Umgehung gelöscht."
"beforeNavigate": {
"message": "Du bist fast am Ziel."
},
"optionsUserscriptsDomains": {
"message": "Domains. Nutze * damit diese Umgehung überall in effekt tritt."
"beforeNavigateDestination": {
"message": "Dein Ziel ist %"
},
"optionsUserscriptsDelete": {
"message": "Umgehung löschen"
"beforeNavigateInfo": {
"message": "Willst du, dass Universal Bypass dich automatisch an dein Ziel bringt?"
},
"notificationTimerSkip": {
"message": "Universal Bypass hat gerade den Timer übersprungen."
"blockedTitle": {
"message": "Universal Bypass hat dich vor einem IP-Logger geschützt."
},
"notificationTimerLeap": {
"message": "Universal Bypass hat gerade %secs% Sekunde(n) von dem Timer entfernt."
"blockedSubtitle": {
"message": "Möchtest du nicht, dass Universal Bypass deine IP vor bösen Leuten schützt?"
},
"notificationBackend": {
"message": "Universal Bypass kann diese Seite nicht umgehen, da diese einen Server-seitigen Check hat."
"crowdBypassed": {
"message": "Du musst vielleicht nicht warten!"
},
"crowdBypassedInfo": {
"message": "Andere Universal Bypass-Nutzer haben bereits für dich gewartet und gemeldet, dass das zu % führt."
},
"crowdBypassedIgnore": {
"message": "War das nicht richtig?"
}
}
}

41
_locales/el/messages.json Normal file
View File

@ -0,0 +1,41 @@
{
"appDesc": {
"message": "Μην σπαταλάτε το χρόνο σας περιμένοντας. Ο Universal Bypass παραλείπει αυτόματα ενοχλητικούς συνδέσμους συντομεύσεων."
},
"firstrunTitle": {
"message": "Ευχαριστούμε που εγκαταστήσατε το Universal Bypass!"
},
"firstrunSubtitle": {
"message": "Είστε καταπληκτικός\/ή!"
},
"firstrunNoScript": {
"message": "Ωστόσο, φαίνεται να χρησιμοποιείτε NoScript ή παρόμοιο, με τα οποία το Universal Bypass δεν είναι συμβατό."
},
"optionsTrackerBypass": {
"message": "Παράκαμψη trackers χρησιμοποιώντας το Apimon.de."
},
"optionsBlockIPLoggers": {
"message": "Μπλόκαρε IP loggers, αν αυτοί δεν μπορούν να παρακάμπτουν."
},
"optionsCrowdBypass": {
"message": "Δώσε και να πάρε τους προορισμούς των unbypassable shorteners."
},
"privacyPolicy": {
"message": "Πολιτική Απορρήτου"
},
"optionsUserscripts": {
"message": "Προσαρμοσμένες παρακάμψεις"
},
"blockedTitle": {
"message": "Το Universal Bypass εμπόδισε την IP σας από το να καταγραφεί."
},
"crowdBypassed": {
"message": "Ίσως να μην χρειαστεί να περιμένετε!"
},
"crowdBypassedInfo": {
"message": "Άλλοι χρήστες του Universal Bypass έχουν ήδη περιμένει εσάς και έχουν αναφέρει ότι αυτό οδηγεί σε %"
},
"crowdBypassedIgnore": {
"message": "Δεν ήταν αυτό σωστό;"
}
}

View File

@ -8,52 +8,61 @@
"firstrunSubtitle": {
"message": "You're amazing!"
},
"firstrunWhatnow": {
"message": "What you can do now:"
"firstrunNoScript": {
"message": "However, you seem to be using NoScript or similar, which Universal Bypass is not compatible with."
},
"firstrunOptions": {
"message": "Change Universal Bypass' options."
},
"firstrunTwitter": {
"message": "Follow Universal Bypass on Twitter to always be in the loop about Universal Bypass."
},
"homepage": {
"message": "Homepage"
},
"popupOptions": {
"message": "Options"
"faq": {
"message": "Frequently Asked Questions (FAQ)"
},
"options": {
"message": "Universal Bypass Options"
"message": "Options"
},
"save": {
"message": "Save"
"optionsEnabled": {
"message": "Enable website bypasses."
},
"optionsNotifications": {
"message": "Show status notifications on websites Universal Bypass knows."
"optionsInstantNavigation": {
"message": "Instantly take me to destinations."
},
"optionsTrackerBypass": {
"message": "Bypass trackers using Apimon.de."
},
"optionsBlockIPLoggers": {
"message": "Block IP loggers if they can't be bypassed."
},
"optionsCrowdBypass": {
"message": "Give and take the destinations of unbypassable shorteners."
},
"privacyPolicy": {
"message": "Privacy Policy"
},
"optionsUserscripts": {
"message": "Custom Bypasses"
},
"optionsUserscriptsSubtitle": {
"message": "It would be nice if you could submit working bypasses to GitHub, so others can benefit from it: "
"message": "It would be nice if you could submit working bypasses on GitHub, so others can benefit from it."
},
"optionsUserscriptsName": {
"message": "Name. With an empty name, this bypass will be deleted."
"beforeNavigate": {
"message": "You're almost at your destination."
},
"optionsUserscriptsDomains": {
"message": "Domains. Use * for this bypass to be effective everywhere."
"beforeNavigateDestination": {
"message": "Your destination is %"
},
"optionsUserscriptsDelete": {
"message": "Delete Bypass"
"beforeNavigateInfo": {
"message": "Do you want Universal Bypass to instantly redirect you to your destination?"
},
"notificationTimerSkip": {
"message": "Universal Bypass just skipped that timer for you."
"blockedTitle": {
"message": "Universal Bypass prevented your IP from being logged."
},
"notificationTimerLeap": {
"message": "Universal Bypass just removed %secs% second(s) from that timer."
"blockedSubtitle": {
"message": "Don't want Universal Bypass to prevent bad actors from getting your IP?"
},
"notificationBackend": {
"message": "Universal Bypass can't bypass this site because they have a server-side check."
"crowdBypassed": {
"message": "You might not have to wait!"
},
"crowdBypassedInfo": {
"message": "Other Universal Bypass users have already waited for you and reported that this leads to %"
},
"crowdBypassedIgnore": {
"message": "Was this not correct?"
}
}

View File

@ -3,45 +3,66 @@
"message": "No pierdas el tiempo para acceder. Universal Bypass omite automáticamente los molestos acortadores de enlaces."
},
"firstrunTitle": {
"message": "Gracias por instalar Universal Bypass!"
"message": "¡Gracias por instalar Universal Bypass!"
},
"firstrunSubtitle": {
"message": "¡Eres increíble!"
},
"firstrunWhatnow": {
"message": "Lo que puedes hacer ahora:"
"firstrunNoScript": {
"message": "No obstante, parece que estés utilizando NoScript o similar, con la que Universal Bypass no es compatible."
},
"firstrunOptions": {
"message": "Configura Universal Bypass' opción."
},
"firstrunTwitter": {
"message": "Siga a Universal Bypass en Twitter para estar informado sobre Universal Bypass."
},
"homepage": {
"message": "Inicio"
},
"popupOptions": {
"message": "Opciones"
"faq": {
"message": "Preguntas más frecuentes"
},
"options": {
"message": "Universal Bypass Opciones"
"message": "Opciones"
},
"save": {
"message": "Guardar"
"optionsEnabled": {
"message": "Activar bypass pagina web."
},
"optionsInstantNavigation": {
"message": "Llevarme directamente al destino."
},
"optionsTrackerBypass": {
"message": "Evita rastreadores usando Apimon.de."
},
"optionsBlockIPLoggers": {
"message": "Bloquea los registradores IP si no pueden ser Saltados."
},
"optionsCrowdBypass": {
"message": "Da y toma los destinos de los acortadores que no se pueden Saltar."
},
"privacyPolicy": {
"message": "Política de privacidad"
},
"optionsUserscripts": {
"message": "Personalizar Bypasses"
"message": "Bypasses personalizadas"
},
"optionsUserscriptsSubtitle": {
"message": "Sería bueno que pudieras enviarle a GitHub las bifurcaciones (fork) que funcionan, para que otros puedan beneficiarse de ello: "
"message": "Sería bueno que pudieras enviarle a GitHub las bifurcaciones (fork) que funcionan, para que otros puedan beneficiarse de ello."
},
"optionsUserscriptsName": {
"message": "Nombre. Con un nombre vacío, este bypass será borrado."
"beforeNavigate": {
"message": "Ya casi estas en tu destino."
},
"optionsUserscriptsDomains": {
"message": "Dominios. Utilice * para que este bypass sea efectivo en todas partes."
"beforeNavigateDestination": {
"message": "Tu dirección de destino es %"
},
"optionsUserscriptsDelete": {
"message": "Eliminar Bypass"
"beforeNavigateInfo": {
"message": "¿Desea que Universal Bypass lo redirija instantáneamente a su destino?"
},
"blockedTitle": {
"message": "Bypass Universal evitó que su IP se registrara."
},
"blockedSubtitle": {
"message": "¿No quiere que Universal Bypass impida que los actores malos obtengan su IP?"
},
"crowdBypassed": {
"message": "Puede que no tengas que esperar!"
},
"crowdBypassedInfo": {
"message": "Otros usuarios de Universal Bypass ya han esperado por ti y han informado que esto lleva a %"
},
"crowdBypassedIgnore": {
"message": "¿No era eso correcto?"
}
}
}

View File

@ -6,56 +6,63 @@
"message": "Merci d'avoir installer Universal Bypass!"
},
"firstrunSubtitle": {
"message": "Vou-êtes incroyable!"
"message": "Vous êtes incroyable!"
},
"firstrunWhatnow": {
"message": "Voici ce que vous pouvez faire maintenant:"
"firstrunNoScript": {
"message": "Cependant, vous semblez utiliser le module NoScript ou quelque chose de similaire, qui n'est pas compatible avec le contourneur universel."
},
"firstrunOptions": {
"message": "Changer les options de Universal Bypass."
},
"firstrunTwitter": {
"message": "Suivre Universal Bypass sur Twitter pour être toujours tenu au courrant de Universal Bypass."
},
"homepage": {
"message": "Page d'accueil"
},
"popupOptions": {
"message": "Options"
"faq": {
"message": "Questions fréquemment posées (FAQ)"
},
"options": {
"message": "Options d'Universal Bypass"
"message": "Réglages"
},
"save": {
"message": "Sauvegarder"
"optionsEnabled": {
"message": "Activez les contournements de site Web."
},
"save": {
"message": "Sauvegarder"
"optionsInstantNavigation": {
"message": "M'envoyer instantanément vers les destinations."
},
"optionsNotifications": {
"message": "Afficher notifications de statut sur les sites webs que Universal Bypass connaît."
"optionsTrackerBypass": {
"message": "Contourner les traqueurs en utilisant Apimon.de."
},
"optionsBlockIPLoggers": {
"message": "Bloque les enregistreurs dIP si ils ne peuvent être contournés."
},
"optionsCrowdBypass": {
"message": "Donner et prendre les cibles des raccourcisseurs incontournables."
},
"privacyPolicy": {
"message": "Politique Vie Privée"
},
"optionsUserscripts": {
"message": "Bypass sur mesure"
},
"optionsUserscriptsSubtitle": {
"message": "Ce serait bien si vous pouviez soumettre des dérivations de travail à GitHub, afin que d'autres puissent en bénéficier: "
"message": "Ce serait bien si vous pouviez soumettre des dérivations fonctionelles sur GitHub, afin que d'autres puissent en bénéficier."
},
"optionsUserscriptsName": {
"message": "Nom. Avec un nom vide, ce contournements sera supprimé."
"beforeNavigate": {
"message": "Vous êtes presque arrivé à destination."
},
"optionsUserscriptsDomains": {
"message": "Domaines. Utiliser * pour ce contournement pour qu'il soit éffectif partout."
"beforeNavigateDestination": {
"message": "Votre destination est %"
},
"optionsUserscriptsDelete": {
"message": "Supprimer Bypass"
"beforeNavigateInfo": {
"message": "Vouslez-vous qu'Universal Bypass vous redirige instantanément à votre destination?"
},
"notificationTimerSkip": {
"message": "Universal Bypass zappe juste ce compteur pour vous."
"blockedTitle": {
"message": "Universal Bypass empêche lenregistrement de votre IP."
},
"notificationTimerLeap": {
"message": "Universal Bypass supprime juste les %secs% seconde(s) fr votre compteur."
"blockedSubtitle": {
"message": "Pas envie qu'Universal Bypass empêche de mauvais acteurs d'acquérir votre IP?"
},
"notificationBackend": {
"message": "Universal Bypass ne peut pas contourner ce site parce qu\'ils ont une vérification côté serveur."
}
"crowdBypassed": {
"message": "Vous n'aurez peut-être pas à attendre !"
},
"crowdBypassedInfo": {
"message": "D'autres utilisateurs du contourneur universel vous ont déjà attendu et ont rapporté que cela mène à %"
},
"crowdBypassedIgnore": {
"message": "Cela n'était-il pas exact ?"
}
}

35
_locales/hu/messages.json Normal file
View File

@ -0,0 +1,35 @@
{
"appDesc": {
"message": "Ne vesztegesd az időd beleegyezésekkel. A Universal Bypass automatikusan kikerüli a bosszantó link-rövidítőket."
},
"firstrunTitle": {
"message": "Köszönjük, hogy telepítetted a Universal Bypass-t!"
},
"firstrunSubtitle": {
"message": "Csodálatos vagy!"
},
"optionsTrackerBypass": {
"message": "Apimon.de-t használó trackerek kikerülése."
},
"optionsBlockIPLoggers": {
"message": "IP-loggerek blokkolása, ha nem kerülhetők ki."
},
"privacyPolicy": {
"message": "Adatvédelmi irányelvek"
},
"optionsUserscripts": {
"message": "Egyéni kikerülések"
},
"blockedTitle": {
"message": "A Universal Bypass megtiltotta, hogy az IP-t naplózható legyen."
},
"crowdBypassed": {
"message": "Talán nem kell várakoznod!"
},
"crowdBypassedInfo": {
"message": "Más Universal Bypass felhasználók már vártak helyetted, és szerintük ez a(z) % webhelyhez vezet"
},
"crowdBypassedIgnore": {
"message": "Ez helytelen?"
}
}

68
_locales/id/messages.json Normal file
View File

@ -0,0 +1,68 @@
{
"appDesc": {
"message": "Jangan habiskan waktu anda dengan menaati aturan. Universal Bypass secara otomatis akan melompati link pemendek yang menyebalkan."
},
"firstrunTitle": {
"message": "Terima kasih anda sudah menginstal Universal Bypass!"
},
"firstrunSubtitle": {
"message": "Anda luar biasa!"
},
"firstrunNoScript": {
"message": "Akan tetapi, anda sepertinya menggunakan NoScript atau menyerupai itu, Karena itu Universal Bypass tidak kompatibel dengannya."
},
"faq": {
"message": "Pertanyaan yang Sering Diajukan\n(FAQ)"
},
"options": {
"message": "Pilihan"
},
"optionsEnabled": {
"message": "Aktifkan bypass website."
},
"optionsInstantNavigation": {
"message": "Langsung arahkan ke tujuan."
},
"optionsTrackerBypass": {
"message": "Pelacak Bypass menggunakan Apimon.de."
},
"optionsBlockIPLoggers": {
"message": "Memblokir IP Logger jika tidak dapat dilewati."
},
"optionsCrowdBypass": {
"message": "Memberikan dan mendapatkan tujuan dari pemendek yang tidak dapat dilewati."
},
"privacyPolicy": {
"message": "Kebijakan Pribadi"
},
"optionsUserscripts": {
"message": "Atur Bypass sesuai keinginan"
},
"optionsUserscriptsSubtitle": {
"message": "Akan lebih baik jika Anda bisa mengirimkan bypass karya anda lewat GitHub, sehingga orang lain dapat memperoleh manfaatnya."
},
"beforeNavigate": {
"message": "Anda hampir sampai pada destinasi anda."
},
"beforeNavigateDestination": {
"message": "Destinasi anda adalah %"
},
"beforeNavigateInfo": {
"message": "Apakah Anda ingin Universal Bypass langsung mengarahkan ke tujuan Anda?"
},
"blockedTitle": {
"message": "Universal Bypass mencegah IP Anda saat sedang login."
},
"blockedSubtitle": {
"message": "Tidak ingin Universal Bypass untuk mencegah situs buruk dari mendapatkan IP Anda?"
},
"crowdBypassed": {
"message": "Anda mungkin tidak perlu menunggu !"
},
"crowdBypassedInfo": {
"message": "Pengguna Universal Bypass lainnya sudah menunggu untuk anda dan melaporkan bahwa hal ini menyebabkan %"
},
"crowdBypassedIgnore": {
"message": "Apakah ini tidak benar ?"
}
}

68
_locales/it/messages.json Normal file
View File

@ -0,0 +1,68 @@
{
"appDesc": {
"message": "Non sprecare il tuo tempo con il conformismo. Universal Bypass salta automaticamente i fastidiosi link shortener."
},
"firstrunTitle": {
"message": "Grazie per aver installato Universal Bypass!"
},
"firstrunSubtitle": {
"message": "Sei incredibile!"
},
"firstrunNoScript": {
"message": "Però, sembra che tu stia usando NoScript o simili, con le quali Universal Bypass non è compatibile."
},
"faq": {
"message": "Domande frequenti (FAQ)"
},
"options": {
"message": "Opzioni"
},
"optionsEnabled": {
"message": "Attiva i bypass dei siti web."
},
"optionsInstantNavigation": {
"message": "Portami istantaneamente alla destinazione."
},
"optionsTrackerBypass": {
"message": "Bypass tracker utilizzando Apimon.de."
},
"optionsBlockIPLoggers": {
"message": "Blocca i logger IP se essi non possono essere bypassati."
},
"optionsCrowdBypass": {
"message": "Dai e ottieni le destinazioni degli shorteners non bypassati."
},
"privacyPolicy": {
"message": "Informativa sulla privacy"
},
"optionsUserscripts": {
"message": "Bypass personalizzati"
},
"optionsUserscriptsSubtitle": {
"message": "Sarebbe bello se tu potessi inviare i bypass funzionanti su GitHub, in modo che anche altri possano trarne beneficio."
},
"beforeNavigate": {
"message": "Sei quasi a destinazione."
},
"beforeNavigateDestination": {
"message": "La tua destinazione è %"
},
"beforeNavigateInfo": {
"message": "Vuoi che Universal Bypass ti porti istantaneamente a destinazione?"
},
"blockedTitle": {
"message": "Universal Bypass ha impedito la registrazione del tuo IP."
},
"blockedSubtitle": {
"message": "Non vuoi che Universal Bypass impedisca ai malintenzionati di ottenere il tuo IP?"
},
"crowdBypassed": {
"message": "Forse non dovrai aspettare!"
},
"crowdBypassedInfo": {
"message": "Altri utenti di Universal Bypass hanno già aspettato e hanno riferito che questo porta a%"
},
"crowdBypassedIgnore": {
"message": "Non era corretto?"
}
}

56
_locales/ja/messages.json Normal file
View File

@ -0,0 +1,56 @@
{
"appDesc": {
"message": "ユニバーサルバイパスは、迷惑な短縮URLを自動的にスキップします。コンプライアンスとあなたの時間を無駄にしません。"
},
"firstrunTitle": {
"message": "ユニバーサルバイパスをインストールしていただきありがとうございます!"
},
"firstrunSubtitle": {
"message": "素晴らしいです!"
},
"firstrunNoScript": {
"message": "あなたはNoScriptなどを使用しているようですが、ユニバーサルバイパスとは互換性がありません。"
},
"options": {
"message": "オプション"
},
"optionsEnabled": {
"message": "ウェブサイトのバイパスを有効化する"
},
"optionsInstantNavigation": {
"message": "即座にリンク先へ移動します。"
},
"optionsTrackerBypass": {
"message": "Apimon.deを使用してトラッカーをバイパスする"
},
"optionsBlockIPLoggers": {
"message": "バイパスできない場合は、IPロガーをブロックする"
},
"optionsCrowdBypass": {
"message": "バイパスできない短縮urlの行き先を設定する"
},
"privacyPolicy": {
"message": "プライバシーポリシー"
},
"optionsUserscripts": {
"message": "カスタムバイパス"
},
"beforeNavigate": {
"message": "リンク先まであと少しです。"
},
"beforeNavigateDestination": {
"message": "リンク先は %"
},
"blockedTitle": {
"message": "ユニバーサルバイパスにより、IPがログに記録されなくなりました。"
},
"crowdBypassed": {
"message": "あなたは待つ必要はありません!"
},
"crowdBypassedInfo": {
"message": "他のユニバーサルバイパスユーザーはすでにあなたを待っていて、これが % につながっていると報告しています。"
},
"crowdBypassedIgnore": {
"message": "これは間違っていたのですか?"
}
}

41
_locales/ko/messages.json Normal file
View File

@ -0,0 +1,41 @@
{
"appDesc": {
"message": "순하게 시간을 낭비하고 있지 마세요. Universal Bypass로 성가신 URL 단축 서비스를 자동 생략하세요."
},
"firstrunTitle": {
"message": "Universal Bypass를 설치해 주셔서 감사합니다!"
},
"firstrunSubtitle": {
"message": "당신은 멋쟁이에요!"
},
"firstrunNoScript": {
"message": "물론, NoScript나 그와 비슷한 걸 쓰는 것 같지만, Universal Bypass는 그런 것들과 호환되지 않습니다."
},
"optionsTrackerBypass": {
"message": "Apimon.de 로 추적 우회하기."
},
"optionsBlockIPLoggers": {
"message": "우회할 수 없다면 해당 페이지를 차단합니다."
},
"optionsCrowdBypass": {
"message": "우회할 수 없는 URL 단축 사이트 목적지 주고 받기."
},
"privacyPolicy": {
"message": "개인정보 취급방침"
},
"optionsUserscripts": {
"message": "사용자 지정 우회책"
},
"blockedTitle": {
"message": "Universal Bypass가 당신의 IP를 기록하지 못하게 막았습니다."
},
"crowdBypassed": {
"message": "이제 기다리지 않을 겁니다!"
},
"crowdBypassedInfo": {
"message": "다른 Universal Bypass 사용자가 이미 기다리고 있고, 끝난 순간에 % 로 이동합니다."
},
"crowdBypassedIgnore": {
"message": "올바르지 않나요?"
}
}

View File

@ -8,52 +8,61 @@
"firstrunSubtitle": {
"message": "Je bent geweldig!"
},
"firstrunWhatnow": {
"message": "Wat je nu kan doen:"
"firstrunNoScript": {
"message": "U lijkt NoScript of dergelijke te gebruiken, daarmee werkt Universal Bypass niet."
},
"firstrunOptions": {
"message": "Wijzig de Universal Bypass-opties."
},
"firstrunTwitter": {
"message": "Volg Universal Bypass op Twitter om altijd op de hoogte te blijven van Universal Bypass."
},
"homepage": {
"message": "Startpagina"
},
"popupOptions": {
"message": "Opties"
"faq": {
"message": "Veelgestelde Vragen (FAQ)"
},
"options": {
"message": "Universal Bypass Opties"
"message": "Opties"
},
"save": {
"message": "Opslaan"
"optionsEnabled": {
"message": "Website bypass inschakelen."
},
"optionsNotifications": {
"message": "Toon statusmeldingen op websites die Universal Bypass kent."
"optionsInstantNavigation": {
"message": "Stuur me gelijk door naar de site."
},
"optionsTrackerBypass": {
"message": "Omzeil trackers met behulp van Apimon.de."
},
"optionsBlockIPLoggers": {
"message": "Blokkeer IP-loggers als ze niet kunnen worden omzeilt."
},
"optionsCrowdBypass": {
"message": "Geef en neem de bestemmingen van ondoorlaatbare verkortingen."
},
"privacyPolicy": {
"message": "Privacy Verklaring"
},
"optionsUserscripts": {
"message": "Aangepaste bypasses"
},
"optionsUserscriptsSubtitle": {
"message": "Het zou leuk zijn als je je eigen toevoegingen naar GitHub zou kunnen aanbieden, zodat anderen er profijt van kunnen hebben: "
"message": "Het zou leuk zijn als je je eigen toevoegingen op Github zou publiceren, zodat anderen er ook profijt van kunnen hebben."
},
"optionsUserscriptsName": {
"message": "Naam. Met een lege naam wordt deze bypass verwijderd."
"beforeNavigate": {
"message": "Je bent bijna op je bestemming."
},
"optionsUserscriptsDomains": {
"message": "Domeinen. Gebruik * om deze bypass overal effectief te maken."
"beforeNavigateDestination": {
"message": "Uw bestemming is %"
},
"optionsUserscriptsDelete": {
"message": "Verwijder Bypass"
"beforeNavigateInfo": {
"message": "Wilt u dat Universal Bypass u direct doorstuurt naar uw bestemming?"
},
"notificationTimerSkip": {
"message": "Universal Bypass heeft die timer voor u overgeslagen."
"blockedTitle": {
"message": "Universal Bypass voorkomt dat uw IP wordt geregistreerd."
},
"notificationTimerLeap": {
"message": "Universal Bypass heeft zojuist %sec% seconde(n) uit die timer verwijderd."
"blockedSubtitle": {
"message": "Weet u zeker dat u IP-Logger bescherming wilt uitschakelen?"
},
"notificationBackend": {
"message": "Universal Bypass kan deze site niet omzeilen omdat ze een controle aan de serverzijde hebben."
"crowdBypassed": {
"message": "U hoeft misschien niet te wachten!"
},
"crowdBypassedInfo": {
"message": "Andere Universal Bypass-gebruikers hebben al aangegeven dat dit aan % ligt"
},
"crowdBypassedIgnore": {
"message": "Klopt dit niet?"
}
}

41
_locales/no/messages.json Normal file
View File

@ -0,0 +1,41 @@
{
"appDesc": {
"message": "Ikke kast bort tiden din på å følge krav. Universal Bypass hopper automatisk over irriterende lenkeforkortere."
},
"firstrunTitle": {
"message": "Takk for at du har installert Universal Bypass!"
},
"firstrunSubtitle": {
"message": "Du er fantastisk!"
},
"firstrunNoScript": {
"message": "Men du ser ut til å bruke NoScript eller noe lignende, som Universal Bypass ikke er kompatibel med."
},
"optionsTrackerBypass": {
"message": "Hopp forbi sporere ved hjelp av Apimon.de."
},
"optionsBlockIPLoggers": {
"message": "Blokker IP-loggførere dersom de ikke kan bli hoppet forbi."
},
"optionsCrowdBypass": {
"message": "Gi og ta ankomstpunktene til upasserbare forkortere."
},
"privacyPolicy": {
"message": "Privatlivsretningslinjer"
},
"optionsUserscripts": {
"message": "Tilpassede forbipasserere"
},
"blockedTitle": {
"message": "Universal Bypass hindret IP-adressen din fra å bli loggført."
},
"crowdBypassed": {
"message": "Du vil kanskje ikke måtte vente!"
},
"crowdBypassedInfo": {
"message": "Andre Universal Bypass-brukere har allerede ventet på deg, og har meldt ifra om at dette fører til %"
},
"crowdBypassedIgnore": {
"message": "Var ikke dette korrekt?"
}
}

View File

@ -0,0 +1,68 @@
{
"appDesc": {
"message": "Não perca tempo com conformidades. O Universal Bypass automaticamente ignora encurtadores de links irritantes."
},
"firstrunTitle": {
"message": "Obrigado por instalar o Universal Bypass!"
},
"firstrunSubtitle": {
"message": "Você é demais!"
},
"firstrunNoScript": {
"message": "No entanto, parece que você está usando o NoScript ou similar, com o qual o Universal Bypass não é compatível."
},
"faq": {
"message": "Perguntas Frequentes (FAQ)"
},
"options": {
"message": "Opções"
},
"optionsEnabled": {
"message": "Habilite bypasses de websites."
},
"optionsInstantNavigation": {
"message": "Levar-me instantaneamente aos destinos."
},
"optionsTrackerBypass": {
"message": "Ignorar rastreadores usando Apimon.de."
},
"optionsBlockIPLoggers": {
"message": "Bloqueie os registradores de IP se eles não puderem ser ignorados."
},
"optionsCrowdBypass": {
"message": "Dê e pegue o destino de encurtadores não-passáveis."
},
"privacyPolicy": {
"message": "Política de Privacidade"
},
"optionsUserscripts": {
"message": "Bypasses Personalizados"
},
"optionsUserscriptsSubtitle": {
"message": "Seria legal se você pudesse enviar bypasses funcionais para o GitHub, para que outros se beneficiem deles."
},
"beforeNavigate": {
"message": "Você está quase no seu destino."
},
"beforeNavigateDestination": {
"message": "Seu destino é %"
},
"beforeNavigateInfo": {
"message": "Deseja que o Universal Bypass instantaneamente redirecione você para o seu destino?"
},
"blockedTitle": {
"message": "O Universal Bypass preveniu que seu IP fosse registrado."
},
"blockedSubtitle": {
"message": "Você quer que o Universal Bypass previna que pessoas mal intencionadas obtenham seu IP?"
},
"crowdBypassed": {
"message": "Talvez você não precise esperar!"
},
"crowdBypassedInfo": {
"message": "Outros usuários do Universal Bypass já esperaram para você e reportaram que isto leva para %"
},
"crowdBypassedIgnore": {
"message": "Isto não estava correto?"
}
}

68
_locales/ru/messages.json Normal file
View File

@ -0,0 +1,68 @@
{
"appDesc": {
"message": "Не тратьте зря своё время на уступчивость. Universal Bypass автоматически пропускает раздражающие сокращатели ссылок."
},
"firstrunTitle": {
"message": "Спасибо за установку Universal Bypass!"
},
"firstrunSubtitle": {
"message": "Вы восхитительны!"
},
"firstrunNoScript": {
"message": "Тем не менее, похоже, что Вы используете NoScript или что-то подобное, с чем Universal Bypass несовместим."
},
"faq": {
"message": "Часто задаваемые вопросы (FAQ)"
},
"options": {
"message": "Настройки"
},
"optionsEnabled": {
"message": "Включить обходы веб-сайтов."
},
"optionsInstantNavigation": {
"message": "Сразу переходить по адресу назначения."
},
"optionsTrackerBypass": {
"message": "Обходить средства слежки, используя Apimon.de."
},
"optionsBlockIPLoggers": {
"message": "Блокировать всех сохраняющих IP, если их нельзя обойти."
},
"optionsCrowdBypass": {
"message": "Отправлять и принимать адреса назначения сокращателей, которых невозможно обойти."
},
"privacyPolicy": {
"message": "Политика конфиденциальности"
},
"optionsUserscripts": {
"message": "Пользовательские обходы"
},
"optionsUserscriptsSubtitle": {
"message": "Было бы хорошо, если бы Вы могли сообщить о работающих обходах на GitHub, чтобы они стали полезны другим людям."
},
"beforeNavigate": {
"message": "Вы почти достигли адреса назначения."
},
"beforeNavigateDestination": {
"message": "Ваш адрес назначения - %"
},
"beforeNavigateInfo": {
"message": "Хотите ли Вы, чтобы Universal Bypass сразу перенаправлял Вас по адресу назначения?"
},
"blockedTitle": {
"message": "Universal Bypass предотвратил запись Вашего IP."
},
"blockedSubtitle": {
"message": "Не хотите, чтобы Universal Bypass предотвращал получение Вашего IP нежелательными лицами?"
},
"crowdBypassed": {
"message": "Вы можете не ждать!"
},
"crowdBypassedInfo": {
"message": "Другие пользователи Universal Bypass уже подождали за Вас и сообщили, что это ведёт на %"
},
"crowdBypassedIgnore": {
"message": "Это было неправильно?"
}
}

View File

@ -0,0 +1,68 @@
{
"appDesc": {
"message": "Slösa inte bort din tid med samstämmighet. Universal Bypass hoppar automatiskt över irriterande länkförkortare."
},
"firstrunTitle": {
"message": "Tack för att du installerat Universal Bypass!"
},
"firstrunSubtitle": {
"message": "Du är fantastisk!"
},
"firstrunNoScript": {
"message": "Det verkar som om du använder NoScript eller något liknande vilket Universal Bypass inte är kompatibel med."
},
"faq": {
"message": "Vanliga frågor (FAQ)"
},
"options": {
"message": "Alternativ"
},
"optionsEnabled": {
"message": "Aktivera förbikopplingar av webbplats."
},
"optionsInstantNavigation": {
"message": "Ta mig omedelbart till målen."
},
"optionsTrackerBypass": {
"message": "Förbikopplare som använder Apimon.de."
},
"optionsBlockIPLoggers": {
"message": "Blockera IP-loggerare om de inte kan förbikopplas."
},
"optionsCrowdBypass": {
"message": "Ge och ta destinationerna för icke förbikopplade länkförkortare."
},
"privacyPolicy": {
"message": "Integritetspolicy"
},
"optionsUserscripts": {
"message": "Anpassade förbikopplingar"
},
"optionsUserscriptsSubtitle": {
"message": "Det vore snällt om du kunde skicka upp fungerande förbikopplingar till GitHub, så andra också kan ha nytta av dem."
},
"beforeNavigate": {
"message": "Du har nästan nått ditt mål."
},
"beforeNavigateDestination": {
"message": "Ditt mål är %"
},
"beforeNavigateInfo": {
"message": "Vill du att Universal Bypass omdirigerar dig direkt till ditt mål?"
},
"blockedTitle": {
"message": "Universal Bypass förhindrade din IP-adress från att loggas."
},
"blockedSubtitle": {
"message": "Vill du inte att Universal Bypass ska förhindra skurkar från att få tag på din IP-adress?"
},
"crowdBypassed": {
"message": "Det är inte säkert du behöver vänta!"
},
"crowdBypassedInfo": {
"message": "Andra användare av Universal Bypass har redan väntat på dig och rapporterat att denna leder till %"
},
"crowdBypassedIgnore": {
"message": "Var detta inte korrekt?"
}
}

29
_locales/th/messages.json Normal file
View File

@ -0,0 +1,29 @@
{
"appDesc": {
"message": "อย่าไปเสียเวลากับสิ่งที่ต้องทำตามมัน Universal Bypass ช่วยให้คุณข้ามพวกตัวย่อลิงค์ที่โครตราคาญให้อัตโนมัติ"
},
"firstrunTitle": {
"message": "ขอขอบคุณที่ติดตั้ง Universal Bypass!"
},
"firstrunSubtitle": {
"message": "คุณนี้มันเจ๋งจริงๆเลยแหะ!"
},
"firstrunNoScript": {
"message": "แต่อย่างไรก็ตาม ดูเหมือนคุณกำลังใช้ NoScript หรืออะไรที่มันคล้ายๆกัน ซึ่ง Universal Bypass นั้นไม่เข้ากันกับพวกนี้"
},
"optionsBlockIPLoggers": {
"message": "หยุดตัวบันทึก IP ถ้าเขาไม่สามารถให้ผ่านไปได้"
},
"privacyPolicy": {
"message": "นโยบายความเป็นส่วนตัว"
},
"optionsUserscripts": {
"message": "สร้างตัวข้ามเอง"
},
"blockedTitle": {
"message": "Universal Bypass ช่วยป้องกัน IP คุณจากการถูกเก็บประวัติ"
},
"crowdBypassed": {
"message": "คุณอาจไม่ต้องรออีกต่อไป!"
}
}

62
_locales/tr/messages.json Normal file
View File

@ -0,0 +1,62 @@
{
"appDesc": {
"message": "Zamanınızı karmaşa ile harcamayın. Universal Bypass, rahatsız edici bağlantı kısaltıcıları kendiliğinden geçer."
},
"firstrunTitle": {
"message": "Universal Bypass'i kurduğunuz için çok teşekkürler!"
},
"firstrunSubtitle": {
"message": "Harikasınız!"
},
"firstrunNoScript": {
"message": "Ancak görünen o ki Universal Baypass'in uyumlu olmadığı NoScript veya benzeri bir betik kullanıyorsunuz."
},
"options": {
"message": "Seçenekler"
},
"optionsEnabled": {
"message": "Web sayfalarını es geçmeyi etkinleştir."
},
"optionsInstantNavigation": {
"message": "Beni anında hedef adrese yönlendir."
},
"optionsTrackerBypass": {
"message": "Apimon.de kullanan bypass izleyicileri."
},
"optionsBlockIPLoggers": {
"message": "Eğer es geçilemezse IP kayıılarını engelle."
},
"optionsCrowdBypass": {
"message": "Ötürülə bilməyən qısaldıcıların yerlərini götür və apar."
},
"privacyPolicy": {
"message": "Gizlilik Sözleşmesi"
},
"optionsUserscripts": {
"message": "Özel Bypasslar"
},
"beforeNavigate": {
"message": "Neredeyse vardınız."
},
"beforeNavigateDestination": {
"message": "Hedefiniz: %"
},
"beforeNavigateInfo": {
"message": "Universal Bypass'in sizi doğrudan hedefe yönlendirmesini ister misiniz?"
},
"blockedTitle": {
"message": "Universal Bypass, IP adresinizin kayıtlara eklenmesini engelledi."
},
"blockedSubtitle": {
"message": "Universal Bypass'in sizi kötü adamların IP adresinizi almasından korumasını istemiyor musunuz?"
},
"crowdBypassed": {
"message": "Beklemek zorunda değilsin!"
},
"crowdBypassedInfo": {
"message": "Diğer Universal Baypass kullanıcıları sizin yerinize beklediler ve bunun % 'e gittiğini bildirdiler."
},
"crowdBypassedIgnore": {
"message": "Bu doğru değil miydi?"
}
}

68
_locales/vi/messages.json Normal file
View File

@ -0,0 +1,68 @@
{
"appDesc": {
"message": "Đừng lãng phí thời gian của bạn. Universal Bypass tự động bỏ qua các liên kết rút gọn phiền phức."
},
"firstrunTitle": {
"message": "Cảm ơn bạn đã cài đặt Universal Bypass!"
},
"firstrunSubtitle": {
"message": "Bạn thật tuyệt vời!"
},
"firstrunNoScript": {
"message": "Tuy nhiên, bạn dường như sử dụng NoScript hoặc tương tự, mà Universal Bypass không tương thích với."
},
"faq": {
"message": "Câu Hỏi Thường Gặp (FAQ)"
},
"options": {
"message": "Tùy chỉnh"
},
"optionsEnabled": {
"message": "Bật bỏ qua website."
},
"optionsInstantNavigation": {
"message": "Lập tức dẫn tôi đến đích đến."
},
"optionsTrackerBypass": {
"message": "Bỏ qua trackers bằng cách sử dụng Apimon.de."
},
"optionsBlockIPLoggers": {
"message": "Chặn IP Logger nếu nó không thể bỏ qua."
},
"optionsCrowdBypass": {
"message": "Gửi và lấy đích đến của rút gọn chưa thế bypass."
},
"privacyPolicy": {
"message": "Chính sách bảo mật"
},
"optionsUserscripts": {
"message": "Bypasses tùy chỉnh"
},
"optionsUserscriptsSubtitle": {
"message": "Sẽ thật tuyệt vời nếu bạn có thể gửi Code bỏ qua hoạt động được lên GitHub, để giúp đỡ người khác."
},
"beforeNavigate": {
"message": "Bạn sắp đến đích đến."
},
"beforeNavigateDestination": {
"message": "Điểm đến của bạn là %"
},
"beforeNavigateInfo": {
"message": "Bạn có muốn Universal Bypass chuyển hướng bạn đến đích đến của bạn ngay lập tức?"
},
"blockedTitle": {
"message": "Universal Bypass đã ngăn chặn IP của bạn bị ghi lại."
},
"blockedSubtitle": {
"message": "Không muốn Universal Bypass ngăn kẻ xấu lấy được IP của bạn?"
},
"crowdBypassed": {
"message": "Bạn không cần phải đợi!"
},
"crowdBypassedInfo": {
"message": "Người dùng Universal Bypass khác hiện đang chờ bạn và được báo cáo rằng điều này dẫn đến %"
},
"crowdBypassedIgnore": {
"message": "Điều này chưa chính xác?"
}
}

View File

@ -0,0 +1,68 @@
{
"appDesc": {
"message": "別浪費時間在等待上Universal Bypass 能夠全自動地繞過煩人的短連結!"
},
"firstrunTitle": {
"message": "感謝您安裝 Universal Bypass"
},
"firstrunSubtitle": {
"message": "這真是令人驚嘆!"
},
"firstrunNoScript": {
"message": "然而,您似乎安裝了 NoScript 或類似的插件,導致與 Universal Bypass 造成衝突。"
},
"faq": {
"message": "常見問答 (FAQ)"
},
"options": {
"message": "選項"
},
"optionsEnabled": {
"message": "啟用網站繞過功能"
},
"optionsInstantNavigation": {
"message": "跳過確認頁面,直接帶我到目的地。"
},
"optionsTrackerBypass": {
"message": "利用 Apimon.de 繞過隱私追蹤器。"
},
"optionsBlockIPLoggers": {
"message": "若實在無法繞過直接禁止瀏覽器訪問IP記錄網站。"
},
"optionsCrowdBypass": {
"message": "對於無法繞過的短連結,直接帶我到短連結頁面。"
},
"privacyPolicy": {
"message": "隱私權政策"
},
"optionsUserscripts": {
"message": "自定義繞過規則"
},
"optionsUserscriptsSubtitle": {
"message": "如果您能夠在 GitHub 上協助添加新的繞過規則,那就實在太好了,如此一來大家都能夠受惠於您。"
},
"beforeNavigate": {
"message": "您與目的地觸手可及。"
},
"beforeNavigateDestination": {
"message": "您的目的地是 %"
},
"beforeNavigateInfo": {
"message": "您希望下次 Universal Bypass 自動地帶您到目的地嗎?"
},
"blockedTitle": {
"message": "Universal Bypass 防止您的IP被記錄。"
},
"blockedSubtitle": {
"message": "不希望Universal Bypass自動防止不法者獲取您的IP嗎?"
},
"crowdBypassed": {
"message": "或許您可以不用再等待了。"
},
"crowdBypassedInfo": {
"message": "其他的 Universal Bypass 用戶已經替您省下寶貴的時間,並回報該短連結重導向 %"
},
"crowdBypassedIgnore": {
"message": "該回報資訊有誤嗎?"
}
}

View File

@ -1,3 +1,428 @@
let r=chrome.runtime;
r.onInstalled.addListener((d)=>{if(d.reason=="install")window.open(chrome.extension.getURL("/html/firstrun.html"))});
r.setUninstallURL("https://goo.gl/forms/H8FswYQ2a37LSxc13");
var brws = (typeof browser == "undefined" ? chrome : browser),
platform = brws.runtime.getURL("").split("-")[0],
//Keeping track of options
enabled = true,
instantNavigation = false,
trackerBypassEnabled = true,
blockIPLoggers = true,
crowdEnabled = true,
userscript="",
getRedirect=url=>({redirectUrl:(instantNavigation?url:brws.runtime.getURL("html/before-navigate.html")+"?target="+encodeURIComponent(url))})
encodedRedirect=url=>({redirectUrl:(instantNavigation?decodeURIComponent(url):brws.runtime.getURL("html/before-navigate.html")+"?target="+url)})
brws.storage.sync.get(["disable","instant_navigation","no_tracker_bypass","allow_ip_loggers","crowd_bypass_opt_out"],res=>{
if(res)
{
enabled=(!res.disable||res.disable!=="true")
instantNavigation=(res.instant_navigation&&res.instant_navigation==="true")
trackerBypassEnabled=(!res.no_tracker_bypass||res.no_tracker_bypass!=="true")
blockIPLoggers=(!res.allow_ip_loggers||res.allow_ip_loggers!=="true")
crowdEnabled=(!res.crowd_bypass_opt_out||res.crowd_bypass_opt_out!=="true")
}
})
brws.storage.local.get(["userscript"],res=>{
if(res&&res.userscript)
{
userscript=res.userscript
}
})
brws.storage.onChanged.addListener(changes=>{
if(changes.disable)
{
enabled=(changes.disable.newValue!=="true")
}
if(changes.instant_navigation)
{
instantNavigation=(changes.instant_navigation.newValue==="true")
}
if(changes.no_tracker_bypass)
{
trackerBypassEnabled=(changes.no_tracker_bypass.newValue!=="true")
}
if(changes.allow_ip_loggers)
{
blockIPLoggers=(changes.allow_ip_loggers.newValue!=="true")
}
if(changes.crowd_bypass_opt_out)
{
crowdEnabled=(changes.crowd_bypass_opt_out.newValue!=="true")
}
if(changes.userscript)
{
userscript=changes.userscript.newValue
}
})
chrome.runtime.onMessage.addListener((req, sender, respond) => {
respond({
enabled: enabled,
crowdEnabled: crowdEnabled,
userscript: userscript
})
})
//Internal redirects to extension URLs to bypass content script limitations
brws.webRequest.onBeforeRequest.addListener(details=>{
if(details.url.substr(38)=="1")
{
return {redirectUrl:brws.runtime.getURL("html/firstrun.html")}
}
else
{
return {redirectUrl:brws.runtime.getURL("html/firstrun-noscript.html")}
}
},{types:["main_frame"],urls:["https://universal-bypass.org/firstrun?*"]},["blocking"])
brws.webRequest.onBeforeRequest.addListener(details=>{
return encodedRedirect(details.url.substr(52))
},{types:["main_frame"],urls:["https://universal-bypass.org/before-navigate?target=*"]},["blocking"])
brws.webRequest.onBeforeRequest.addListener(details=>{
return {redirectUrl:brws.runtime.getURL("html/crowd-bypassed.html")+details.url.substr(43)}
},{types:["main_frame"],urls:["https://universal-bypass.org/crowd-bypassed?*"]},["blocking"])
//Preflight Bypasses
brws.webRequest.onBeforeRequest.addListener(details=>{
if(enabled)
{
return getRedirect(details.url.substr(details.url.indexOf("url=")+4))
}
},{types:["main_frame"],urls:["*://*/st?api=*&url=*","*://*.zxro.com/u/*?url=*"]},["blocking"])
brws.webRequest.onBeforeRequest.addListener(details=>{
if(enabled)
{
let url=new URL(details.url)
if(url.searchParams.has("url"))
{
return getRedirect(url.searchParams.get("url"))
}
}
},{types:["main_frame"],urls:[
"*://*.raidcall.com.tw/direct.php?url=*",
"*://*.raidcall.com.tw/direct.tips.php?url=*"
]},["blocking"])
brws.webRequest.onBeforeRequest.addListener(details=>{
if(enabled)
{
return encodedRedirect(details.url.substr(details.url.indexOf("link=")+5))
}
},{types:["main_frame"],urls:["*://*.spaste.com/r/*link=*",]},["blocking"])
brws.webRequest.onBeforeRequest.addListener(details=>{
if(enabled)
{
return getRedirect(atob(details.url.substr(details.url.indexOf("?link=")+6)))
}
},{types:["main_frame"],urls:["*://*.leechpremium.link/cheat/?link=*"]},["blocking"])
brws.webRequest.onBeforeRequest.addListener(details=>{
if(enabled)
{
return encodedRedirect(details.url.substr(details.url.indexOf("?s=")+3))
}
},{types:["main_frame"],urls:["*://*.ouo.io/s/*?s=*","*://*.cpmlink.net/s/*?s=*"]},["blocking"])
brws.webRequest.onBeforeRequest.addListener(details=>{
if(enabled)
{
return encodedRedirect(details.url.substr(details.url.indexOf("/12/1/")+6))
}
},{types:["main_frame"],urls:["*://*.sh.st/r/*/12/1/*"]},["blocking"])
brws.webRequest.onBeforeRequest.addListener(details=>{
if(enabled)
{
return encodedRedirect(details.url.substr(details.url.indexOf("/s/")+3))
}
},{types:["main_frame"],urls:["*://*.gslink.co/e/*/s/*"]},["blocking"])
brws.webRequest.onBeforeRequest.addListener(details=>{
if(enabled)
{
let url=new URL(details.url)
if(url.searchParams.has("u"))
{
return getRedirect(atob(url.searchParams.get("u"))+url.hash)
}
}
},{types:["main_frame"],urls:["*://*.noriskdomain.com/*/analyze?*"]},["blocking"])
//Install & Uninstall Actions
brws.runtime.onInstalled.addListener(details=>{
if(details.reason == "install")
{
if(platform == "ms" || platform == "moz")
{
brws.windows.create({url: "https://universal-bypass.org/firstrun"})
}
else
{
setTimeout(()=>window.open("https://universal-bypass.org/firstrun"),1000)
// For some reason, Chromium doesn't instantly register the webRequest handlers, so we're waiting.
}
}
else
{
//Upgrade configuration
brws.storage.local.get(["custom_bypasses"],result=>{
if(!result||!result.custom_bypasses)
{
return
}
let customBypasses=JSON.parse(result.custom_bypasses),userscript=""
for(let name in customBypasses)
{
userscript += "// " + name + "\ndomainBypass(\"" + customBypasses[name].domains + "\", ()=>{\n" + customBypasses[name].content + "})\n\n"
}
brws.storage.local.set({
userscript: userscript
}, ()=>brws.storage.local.remove("custom_bypasses"))
})
}
})
brws.runtime.setUninstallURL("https://docs.google.com/forms/d/e/1FAIpQLSdXw-Yf5IaDXZWw4fDHroZkDFOF6hgWEvVDaXT9ZADqnF2reg/viewform")
//Fixing Content-Security-Policy on Firefox because apparently extensions have no special privileges in Firefox
if(platform == "moz")
{
brws.webRequest.onHeadersReceived.addListener(details=>{
if(enabled)
{
let csp = false
for(let i in details.responseHeaders)
{
if("value"in details.responseHeaders[i]&&["content-security-policy","x-content-security-policy"].indexOf(details.responseHeaders[i].name.toLowerCase())>-1)
{
csp = true
let _policies = details.responseHeaders[i].value.replace(";,",";").split(";"),
policies = {}
for(let j in _policies)
{
let policy = _policies[j].trim(),name=policy.split(" ")[0]
policies[name] = policy.substr(name.length).trim().split(" ")
}
if(!("script-src"in policies)&&"default-src"in policies)
{
policies["script-src"] = policies["default-src"]
let ni = policies["script-src"].indexOf("'none'")
if(ni > -1)
{
policies["script-src"].splice(ni, 1)
}
}
if("script-src"in policies)
{
if(policies["script-src"].indexOf("'unsafe-inline'")==-1)
{
policies["script-src"].push("'unsafe-inline'")
}
if(policies["script-src"].indexOf("'unsafe-eval'")==-1)
{
policies["script-src"].push("'unsafe-eval'")
}
}
else
{
policies["script-src"]=["*","blob:","data:","'unsafe-inline'","'unsafe-eval'"]
}
let value=""
for(let name in policies)
{
value+=name;
for(let j in policies[name])
{
value+=" "+policies[name][j]
}
value+="; "
}
details.responseHeaders[i].value=value.substr(0,value.length-2)
}
}
if(csp)
{
return{responseHeaders:details.responseHeaders}
}
}
},{types:["main_frame"],urls:["<all_urls>"]},["blocking","responseHeaders"])
}
//Tracker Bypass using Apimon.de; see options for more details.
function resolveRedirect(url)
{
let xhr=new XMLHttpRequest(),destination
xhr.onreadystatechange=()=>{
if(xhr.readyState==4&&xhr.status==200)
{
let json=JSON.parse(xhr.responseText)
if(json&&json.destination)
destination=json.destination
}
}
xhr.open("GET","https://apimon.de/redirect/"+encodeURIComponent(url),false)
xhr.send()
return destination
}
brws.webRequest.onBeforeRequest.addListener(details=>{
if(trackerBypassEnabled && new URL(details.url).pathname != "/")
{
let destination = resolveRedirect(details.url)
if(destination && destination != details.url)
{
return {redirectUrl: destination}
}
}
},{
types:["main_frame"],
urls:[
"*://*.great.social/*",
"*://*.send.digital/*",
"*://*.snipli.com/*",
"*://*.shortcm.li/*",
"*://*.page.link/*",
"*://*.go2l.ink/*",
"*://*.buff.ly/*",
"*://*.snip.li/*",
"*://*.hive.am/*",
"*://*.cutt.ly/*",
"*://*.tiny.ie/*",
"*://*.bit.ly/*",
"*://*.goo.gl/*",
"*://*.bit.do/*",
"*://*.t2m.io/*",
"*://*.dis.gd/*",
"*://*.zii.bz/*",
"*://*.plu.sh/*",
"*://*.b.link/*",
"*://*.po.st/*",
"*://*.ow.ly/*",
"*://*.is.gd/*",
"*://*.1b.yt/*",
"*://*.1w.tf/*",
"*://*.t.co/*",
"*://*.x.co/*"
]
},["blocking"])
brws.webRequest.onBeforeRequest.addListener(details=>{
if(new URL(details.url).pathname != "/")
{
if(trackerBypassEnabled)
{
let destination = resolveRedirect(details.url)
if(destination && destination != details.url)
{
return {redirectUrl: destination}
}
}
if(blockIPLoggers)
{
return {redirectUrl: brws.runtime.getURL("html/blocked.html")}
}
}
},{types:["main_frame"],urls:getIPLoggerPatterns()},["blocking"])
function getIPLoggerPatterns()
{
let patterns=[],
//https://github.com/timmyrs/Evil-Domains/blob/master/lists/IP%20Loggers.txt
ipLoggers=`viral.over-blog.com
gyazo.in
ps3cfw.com
urlz.fr
webpanel.space
steamcommumity.com
i.imgur.com.de
www.fuglekos.com
# Grabify
grabify.link
bmwforum.co
leancoding.co
quickmessage.io
spottyfly.com
spötify.com
stopify.co
yoütu.be
yoütübe.co
yoütübe.com
xda-developers.io
starbucksiswrong.com
starbucksisbadforyou.com
bucks.as
discörd.com
minecräft.com
cyberh1.xyz
discördapp.com
freegiftcards.co
disçordapp.com
rëddït.com
# Cyberhub (formerly SkypeGrab)
ġooģle.com
drive.ġooģle.com
maps.ġooģle.com
disċordapp.com
ìṃgur.com
transferfiles.cloud
tvshare.co
publicwiki.me
hbotv.co
gameskeys.shop
videoblog.tech
twitch-stats.stream
anonfiles.download
bbcbloggers.co.uk
# Yip
yip.su
iplogger.com
iplogger.org
iplogger.ru
2no.co
02ip.ru
iplis.ru
iplo.ru
ezstat.ru
# What's their IP
www.whatstheirip.com
www.hondachat.com
www.bvog.com
www.youramonkey.com
# Pronosparadise
pronosparadise.com
freebooter.pro
# Blasze
blasze.com
blasze.tk
# IPGrab
ipgrab.org
i.gyazos.com`,
lines=ipLoggers.split("\n")
for(let i in lines)
{
let line=lines[i].trim();
if(line&&line.substr(0,1)!="#")
{
if(line.substr(0,4)=="www.")
line=line.substr(4)
else if(line.substr(0,2)=="i.")
line=line.substr(2)
else if(line.substr(0,6)=="drive.")
line=line.substr(6)
else if(line.substr(0,5)=="maps.")
line=line.substr(5)
if(patterns.indexOf(line)==-1)
patterns.push("*://*."+line+"/*")
}
}
return patterns
}

File diff suppressed because it is too large Load Diff

21618
html/ace/ace.js Normal file

File diff suppressed because it is too large Load Diff

797
html/ace/mode-javascript.js Normal file
View File

@ -0,0 +1,797 @@
ace.define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) {
"use strict";
var oop = require("../lib/oop");
var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;
var DocCommentHighlightRules = function() {
this.$rules = {
"start" : [ {
token : "comment.doc.tag",
regex : "@[\\w\\d_]+" // TODO: fix email addresses
},
DocCommentHighlightRules.getTagRule(),
{
defaultToken : "comment.doc",
caseInsensitive: true
}]
};
};
oop.inherits(DocCommentHighlightRules, TextHighlightRules);
DocCommentHighlightRules.getTagRule = function(start) {
return {
token : "comment.doc.tag.storage.type",
regex : "\\b(?:TODO|FIXME|XXX|HACK)\\b"
};
};
DocCommentHighlightRules.getStartRule = function(start) {
return {
token : "comment.doc", // doc comment
regex : "\\/\\*(?=\\*)",
next : start
};
};
DocCommentHighlightRules.getEndRule = function (start) {
return {
token : "comment.doc", // closing comment
regex : "\\*\\/",
next : start
};
};
exports.DocCommentHighlightRules = DocCommentHighlightRules;
});
ace.define("ace/mode/javascript_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"], function(require, exports, module) {
"use strict";
var oop = require("../lib/oop");
var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules;
var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;
var identifierRe = "[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*";
var JavaScriptHighlightRules = function(options) {
var keywordMapper = this.createKeywordMapper({
"variable.language":
"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|" + // Constructors
"Namespace|QName|XML|XMLList|" + // E4X
"ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|" +
"Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|" +
"Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|" + // Errors
"SyntaxError|TypeError|URIError|" +
"decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|" + // Non-constructor functions
"isNaN|parseFloat|parseInt|" +
"JSON|Math|" + // Other
"this|arguments|prototype|window|document" , // Pseudo
"keyword":
"const|yield|import|get|set|async|await|" +
"break|case|catch|continue|default|delete|do|else|finally|for|function|" +
"if|in|of|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|" +
"__parent__|__count__|escape|unescape|with|__proto__|" +
"class|enum|extends|super|export|implements|private|public|interface|package|protected|static",
"storage.type":
"const|let|var|function",
"constant.language":
"null|Infinity|NaN|undefined",
"support.function":
"alert",
"constant.language.boolean": "true|false"
}, "identifier");
var kwBeforeRe = "case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void";
var escapedRe = "\\\\(?:x[0-9a-fA-F]{2}|" + // hex
"u[0-9a-fA-F]{4}|" + // unicode
"u{[0-9a-fA-F]{1,6}}|" + // es6 unicode
"[0-2][0-7]{0,2}|" + // oct
"3[0-7][0-7]?|" + // oct
"[4-7][0-7]?|" + //oct
".)";
this.$rules = {
"no_regex" : [
DocCommentHighlightRules.getStartRule("doc-start"),
comments("no_regex"),
{
token : "string",
regex : "'(?=.)",
next : "qstring"
}, {
token : "string",
regex : '"(?=.)',
next : "qqstring"
}, {
token : "constant.numeric", // hexadecimal, octal and binary
regex : /0(?:[xX][0-9a-fA-F]+|[oO][0-7]+|[bB][01]+)\b/
}, {
token : "constant.numeric", // decimal integers and floats
regex : /(?:\d\d*(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+\b)?/
}, {
token : [
"storage.type", "punctuation.operator", "support.function",
"punctuation.operator", "entity.name.function", "text","keyword.operator"
],
regex : "(" + identifierRe + ")(\\.)(prototype)(\\.)(" + identifierRe +")(\\s*)(=)",
next: "function_arguments"
}, {
token : [
"storage.type", "punctuation.operator", "entity.name.function", "text",
"keyword.operator", "text", "storage.type", "text", "paren.lparen"
],
regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()",
next: "function_arguments"
}, {
token : [
"entity.name.function", "text", "keyword.operator", "text", "storage.type",
"text", "paren.lparen"
],
regex : "(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()",
next: "function_arguments"
}, {
token : [
"storage.type", "punctuation.operator", "entity.name.function", "text",
"keyword.operator", "text",
"storage.type", "text", "entity.name.function", "text", "paren.lparen"
],
regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()",
next: "function_arguments"
}, {
token : [
"storage.type", "text", "entity.name.function", "text", "paren.lparen"
],
regex : "(function)(\\s+)(" + identifierRe + ")(\\s*)(\\()",
next: "function_arguments"
}, {
token : [
"entity.name.function", "text", "punctuation.operator",
"text", "storage.type", "text", "paren.lparen"
],
regex : "(" + identifierRe + ")(\\s*)(:)(\\s*)(function)(\\s*)(\\()",
next: "function_arguments"
}, {
token : [
"text", "text", "storage.type", "text", "paren.lparen"
],
regex : "(:)(\\s*)(function)(\\s*)(\\()",
next: "function_arguments"
}, {
token : "keyword",
regex : "from(?=\\s*('|\"))"
}, {
token : "keyword",
regex : "(?:" + kwBeforeRe + ")\\b",
next : "start"
}, {
token : ["support.constant"],
regex : /that\b/
}, {
token : ["storage.type", "punctuation.operator", "support.function.firebug"],
regex : /(console)(\.)(warn|info|log|error|time|trace|timeEnd|assert)\b/
}, {
token : keywordMapper,
regex : identifierRe
}, {
token : "punctuation.operator",
regex : /[.](?![.])/,
next : "property"
}, {
token : "storage.type",
regex : /=>/,
next : "start"
}, {
token : "keyword.operator",
regex : /--|\+\+|\.{3}|===|==|=|!=|!==|<+=?|>+=?|!|&&|\|\||\?:|[!$%&*+\-~\/^]=?/,
next : "start"
}, {
token : "punctuation.operator",
regex : /[?:,;.]/,
next : "start"
}, {
token : "paren.lparen",
regex : /[\[({]/,
next : "start"
}, {
token : "paren.rparen",
regex : /[\])}]/
}, {
token: "comment",
regex: /^#!.*$/
}
],
property: [{
token : "text",
regex : "\\s+"
}, {
token : [
"storage.type", "punctuation.operator", "entity.name.function", "text",
"keyword.operator", "text",
"storage.type", "text", "entity.name.function", "text", "paren.lparen"
],
regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(?:(\\s+)(\\w+))?(\\s*)(\\()",
next: "function_arguments"
}, {
token : "punctuation.operator",
regex : /[.](?![.])/
}, {
token : "support.function",
regex : /(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\b(?=\()/
}, {
token : "support.function.dom",
regex : /(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/
}, {
token : "support.constant",
regex : /(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\b/
}, {
token : "identifier",
regex : identifierRe
}, {
regex: "",
token: "empty",
next: "no_regex"
}
],
"start": [
DocCommentHighlightRules.getStartRule("doc-start"),
comments("start"),
{
token: "string.regexp",
regex: "\\/",
next: "regex"
}, {
token : "text",
regex : "\\s+|^$",
next : "start"
}, {
token: "empty",
regex: "",
next: "no_regex"
}
],
"regex": [
{
token: "regexp.keyword.operator",
regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)"
}, {
token: "string.regexp",
regex: "/[sxngimy]*",
next: "no_regex"
}, {
token : "invalid",
regex: /\{\d+\b,?\d*\}[+*]|[+*$^?][+*]|[$^][?]|\?{3,}/
}, {
token : "constant.language.escape",
regex: /\(\?[:=!]|\)|\{\d+\b,?\d*\}|[+*]\?|[()$^+*?.]/
}, {
token : "constant.language.delimiter",
regex: /\|/
}, {
token: "constant.language.escape",
regex: /\[\^?/,
next: "regex_character_class"
}, {
token: "empty",
regex: "$",
next: "no_regex"
}, {
defaultToken: "string.regexp"
}
],
"regex_character_class": [
{
token: "regexp.charclass.keyword.operator",
regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)"
}, {
token: "constant.language.escape",
regex: "]",
next: "regex"
}, {
token: "constant.language.escape",
regex: "-"
}, {
token: "empty",
regex: "$",
next: "no_regex"
}, {
defaultToken: "string.regexp.charachterclass"
}
],
"function_arguments": [
{
token: "variable.parameter",
regex: identifierRe
}, {
token: "punctuation.operator",
regex: "[, ]+"
}, {
token: "punctuation.operator",
regex: "$"
}, {
token: "empty",
regex: "",
next: "no_regex"
}
],
"qqstring" : [
{
token : "constant.language.escape",
regex : escapedRe
}, {
token : "string",
regex : "\\\\$",
consumeLineEnd : true
}, {
token : "string",
regex : '"|$',
next : "no_regex"
}, {
defaultToken: "string"
}
],
"qstring" : [
{
token : "constant.language.escape",
regex : escapedRe
}, {
token : "string",
regex : "\\\\$",
consumeLineEnd : true
}, {
token : "string",
regex : "'|$",
next : "no_regex"
}, {
defaultToken: "string"
}
]
};
if (!options || !options.noES6) {
this.$rules.no_regex.unshift({
regex: "[{}]", onMatch: function(val, state, stack) {
this.next = val == "{" ? this.nextState : "";
if (val == "{" && stack.length) {
stack.unshift("start", state);
}
else if (val == "}" && stack.length) {
stack.shift();
this.next = stack.shift();
if (this.next.indexOf("string") != -1 || this.next.indexOf("jsx") != -1)
return "paren.quasi.end";
}
return val == "{" ? "paren.lparen" : "paren.rparen";
},
nextState: "start"
}, {
token : "string.quasi.start",
regex : /`/,
push : [{
token : "constant.language.escape",
regex : escapedRe
}, {
token : "paren.quasi.start",
regex : /\${/,
push : "start"
}, {
token : "string.quasi.end",
regex : /`/,
next : "pop"
}, {
defaultToken: "string.quasi"
}]
});
if (!options || options.jsx != false)
JSX.call(this);
}
this.embedRules(DocCommentHighlightRules, "doc-",
[ DocCommentHighlightRules.getEndRule("no_regex") ]);
this.normalizeRules();
};
oop.inherits(JavaScriptHighlightRules, TextHighlightRules);
function JSX() {
var tagRegex = identifierRe.replace("\\d", "\\d\\-");
var jsxTag = {
onMatch : function(val, state, stack) {
var offset = val.charAt(1) == "/" ? 2 : 1;
if (offset == 1) {
if (state != this.nextState)
stack.unshift(this.next, this.nextState, 0);
else
stack.unshift(this.next);
stack[2]++;
} else if (offset == 2) {
if (state == this.nextState) {
stack[1]--;
if (!stack[1] || stack[1] < 0) {
stack.shift();
stack.shift();
}
}
}
return [{
type: "meta.tag.punctuation." + (offset == 1 ? "" : "end-") + "tag-open.xml",
value: val.slice(0, offset)
}, {
type: "meta.tag.tag-name.xml",
value: val.substr(offset)
}];
},
regex : "</?" + tagRegex + "",
next: "jsxAttributes",
nextState: "jsx"
};
this.$rules.start.unshift(jsxTag);
var jsxJsRule = {
regex: "{",
token: "paren.quasi.start",
push: "start"
};
this.$rules.jsx = [
jsxJsRule,
jsxTag,
{include : "reference"},
{defaultToken: "string"}
];
this.$rules.jsxAttributes = [{
token : "meta.tag.punctuation.tag-close.xml",
regex : "/?>",
onMatch : function(value, currentState, stack) {
if (currentState == stack[0])
stack.shift();
if (value.length == 2) {
if (stack[0] == this.nextState)
stack[1]--;
if (!stack[1] || stack[1] < 0) {
stack.splice(0, 2);
}
}
this.next = stack[0] || "start";
return [{type: this.token, value: value}];
},
nextState: "jsx"
},
jsxJsRule,
comments("jsxAttributes"),
{
token : "entity.other.attribute-name.xml",
regex : tagRegex
}, {
token : "keyword.operator.attribute-equals.xml",
regex : "="
}, {
token : "text.tag-whitespace.xml",
regex : "\\s+"
}, {
token : "string.attribute-value.xml",
regex : "'",
stateName : "jsx_attr_q",
push : [
{token : "string.attribute-value.xml", regex: "'", next: "pop"},
{include : "reference"},
{defaultToken : "string.attribute-value.xml"}
]
}, {
token : "string.attribute-value.xml",
regex : '"',
stateName : "jsx_attr_qq",
push : [
{token : "string.attribute-value.xml", regex: '"', next: "pop"},
{include : "reference"},
{defaultToken : "string.attribute-value.xml"}
]
},
jsxTag
];
this.$rules.reference = [{
token : "constant.language.escape.reference.xml",
regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)"
}];
}
function comments(next) {
return [
{
token : "comment", // multi line comment
regex : /\/\*/,
next: [
DocCommentHighlightRules.getTagRule(),
{token : "comment", regex : "\\*\\/", next : next || "pop"},
{defaultToken : "comment", caseInsensitive: true}
]
}, {
token : "comment",
regex : "\\/\\/",
next: [
DocCommentHighlightRules.getTagRule(),
{token : "comment", regex : "$|^", next : next || "pop"},
{defaultToken : "comment", caseInsensitive: true}
]
}
];
}
exports.JavaScriptHighlightRules = JavaScriptHighlightRules;
});
ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"], function(require, exports, module) {
"use strict";
var Range = require("../range").Range;
var MatchingBraceOutdent = function() {};
(function() {
this.checkOutdent = function(line, input) {
if (! /^\s+$/.test(line))
return false;
return /^\s*\}/.test(input);
};
this.autoOutdent = function(doc, row) {
var line = doc.getLine(row);
var match = line.match(/^(\s*\})/);
if (!match) return 0;
var column = match[1].length;
var openBracePos = doc.findMatchingBracket({row: row, column: column});
if (!openBracePos || openBracePos.row == row) return 0;
var indent = this.$getIndent(doc.getLine(openBracePos.row));
doc.replace(new Range(row, 0, row, column-1), indent);
};
this.$getIndent = function(line) {
return line.match(/^\s*/)[0];
};
}).call(MatchingBraceOutdent.prototype);
exports.MatchingBraceOutdent = MatchingBraceOutdent;
});
ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) {
"use strict";
var oop = require("../../lib/oop");
var Range = require("../../range").Range;
var BaseFoldMode = require("./fold_mode").FoldMode;
var FoldMode = exports.FoldMode = function(commentRegex) {
if (commentRegex) {
this.foldingStartMarker = new RegExp(
this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start)
);
this.foldingStopMarker = new RegExp(
this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end)
);
}
};
oop.inherits(FoldMode, BaseFoldMode);
(function() {
this.foldingStartMarker = /([\{\[\(])[^\}\]\)]*$|^\s*(\/\*)/;
this.foldingStopMarker = /^[^\[\{\(]*([\}\]\)])|^[\s\*]*(\*\/)/;
this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/;
this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/;
this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/;
this._getFoldWidgetBase = this.getFoldWidget;
this.getFoldWidget = function(session, foldStyle, row) {
var line = session.getLine(row);
if (this.singleLineBlockCommentRe.test(line)) {
if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line))
return "";
}
var fw = this._getFoldWidgetBase(session, foldStyle, row);
if (!fw && this.startRegionRe.test(line))
return "start"; // lineCommentRegionStart
return fw;
};
this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {
var line = session.getLine(row);
if (this.startRegionRe.test(line))
return this.getCommentRegionBlock(session, line, row);
var match = line.match(this.foldingStartMarker);
if (match) {
var i = match.index;
if (match[1])
return this.openingBracketBlock(session, match[1], row, i);
var range = session.getCommentFoldRange(row, i + match[0].length, 1);
if (range && !range.isMultiLine()) {
if (forceMultiline) {
range = this.getSectionRange(session, row);
} else if (foldStyle != "all")
range = null;
}
return range;
}
if (foldStyle === "markbegin")
return;
var match = line.match(this.foldingStopMarker);
if (match) {
var i = match.index + match[0].length;
if (match[1])
return this.closingBracketBlock(session, match[1], row, i);
return session.getCommentFoldRange(row, i, -1);
}
};
this.getSectionRange = function(session, row) {
var line = session.getLine(row);
var startIndent = line.search(/\S/);
var startRow = row;
var startColumn = line.length;
row = row + 1;
var endRow = row;
var maxRow = session.getLength();
while (++row < maxRow) {
line = session.getLine(row);
var indent = line.search(/\S/);
if (indent === -1)
continue;
if (startIndent > indent)
break;
var subRange = this.getFoldWidgetRange(session, "all", row);
if (subRange) {
if (subRange.start.row <= startRow) {
break;
} else if (subRange.isMultiLine()) {
row = subRange.end.row;
} else if (startIndent == indent) {
break;
}
}
endRow = row;
}
return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);
};
this.getCommentRegionBlock = function(session, line, row) {
var startColumn = line.search(/\s*$/);
var maxRow = session.getLength();
var startRow = row;
var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/;
var depth = 1;
while (++row < maxRow) {
line = session.getLine(row);
var m = re.exec(line);
if (!m) continue;
if (m[1]) depth--;
else depth++;
if (!depth) break;
}
var endRow = row;
if (endRow > startRow) {
return new Range(startRow, startColumn, endRow, line.length);
}
};
}).call(FoldMode.prototype);
});
ace.define("ace/mode/javascript",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/javascript_highlight_rules","ace/mode/matching_brace_outdent","ace/worker/worker_client","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"], function(require, exports, module) {
"use strict";
var oop = require("../lib/oop");
var TextMode = require("./text").Mode;
var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules;
var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent;
var WorkerClient = require("../worker/worker_client").WorkerClient;
var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour;
var CStyleFoldMode = require("./folding/cstyle").FoldMode;
var Mode = function() {
this.HighlightRules = JavaScriptHighlightRules;
this.$outdent = new MatchingBraceOutdent();
this.$behaviour = new CstyleBehaviour();
this.foldingRules = new CStyleFoldMode();
};
oop.inherits(Mode, TextMode);
(function() {
this.lineCommentStart = "//";
this.blockComment = {start: "/*", end: "*/"};
this.$quotes = {'"': '"', "'": "'", "`": "`"};
this.getNextLineIndent = function(state, line, tab) {
var indent = this.$getIndent(line);
var tokenizedLine = this.getTokenizer().getLineTokens(line, state);
var tokens = tokenizedLine.tokens;
var endState = tokenizedLine.state;
if (tokens.length && tokens[tokens.length-1].type == "comment") {
return indent;
}
if (state == "start" || state == "no_regex") {
var match = line.match(/^.*(?:\bcase\b.*:|[\{\(\[])\s*$/);
if (match) {
indent += tab;
}
} else if (state == "doc-start") {
if (endState == "start" || endState == "no_regex") {
return "";
}
var match = line.match(/^\s*(\/?)\*/);
if (match) {
if (match[1]) {
indent += " ";
}
indent += "* ";
}
}
return indent;
};
this.checkOutdent = function(state, line, input) {
return this.$outdent.checkOutdent(line, input);
};
this.autoOutdent = function(state, doc, row) {
this.$outdent.autoOutdent(doc, row);
};
this.createWorker = function(session) {
var worker = new WorkerClient(["ace"], "ace/mode/javascript_worker", "JavaScriptWorker");
worker.attachToDocument(session.getDocument());
worker.on("annotate", function(results) {
session.setAnnotations(results.data);
});
worker.on("terminate", function() {
session.clearAnnotations();
});
return worker;
};
this.$id = "ace/mode/javascript";
}).call(Mode.prototype);
exports.Mode = Mode;
});
(function() {
ace.require(["ace/mode/javascript"], function(m) {
if (typeof module == "object" && typeof exports == "object" && module) {
module.exports = m;
}
});
})();

112
html/ace/theme-monokai.js Normal file
View File

@ -0,0 +1,112 @@
ace.define("ace/theme/monokai",["require","exports","module","ace/lib/dom"], function(require, exports, module) {
exports.isDark = true;
exports.cssClass = "ace-monokai";
exports.cssText = ".ace-monokai .ace_gutter {\
background: #2F3129;\
color: #8F908A\
}\
.ace-monokai .ace_print-margin {\
width: 1px;\
background: #555651\
}\
.ace-monokai {\
background-color: #272822;\
color: #F8F8F2\
}\
.ace-monokai .ace_cursor {\
color: #F8F8F0\
}\
.ace-monokai .ace_marker-layer .ace_selection {\
background: #49483E\
}\
.ace-monokai.ace_multiselect .ace_selection.ace_start {\
box-shadow: 0 0 3px 0px #272822;\
}\
.ace-monokai .ace_marker-layer .ace_step {\
background: rgb(102, 82, 0)\
}\
.ace-monokai .ace_marker-layer .ace_bracket {\
margin: -1px 0 0 -1px;\
border: 1px solid #49483E\
}\
.ace-monokai .ace_marker-layer .ace_active-line {\
background: #202020\
}\
.ace-monokai .ace_gutter-active-line {\
background-color: #272727\
}\
.ace-monokai .ace_marker-layer .ace_selected-word {\
border: 1px solid #49483E\
}\
.ace-monokai .ace_invisible {\
color: #52524d\
}\
.ace-monokai .ace_entity.ace_name.ace_tag,\
.ace-monokai .ace_keyword,\
.ace-monokai .ace_meta.ace_tag,\
.ace-monokai .ace_storage {\
color: #F92672\
}\
.ace-monokai .ace_punctuation,\
.ace-monokai .ace_punctuation.ace_tag {\
color: #fff\
}\
.ace-monokai .ace_constant.ace_character,\
.ace-monokai .ace_constant.ace_language,\
.ace-monokai .ace_constant.ace_numeric,\
.ace-monokai .ace_constant.ace_other {\
color: #AE81FF\
}\
.ace-monokai .ace_invalid {\
color: #F8F8F0;\
background-color: #F92672\
}\
.ace-monokai .ace_invalid.ace_deprecated {\
color: #F8F8F0;\
background-color: #AE81FF\
}\
.ace-monokai .ace_support.ace_constant,\
.ace-monokai .ace_support.ace_function {\
color: #66D9EF\
}\
.ace-monokai .ace_fold {\
background-color: #A6E22E;\
border-color: #F8F8F2\
}\
.ace-monokai .ace_storage.ace_type,\
.ace-monokai .ace_support.ace_class,\
.ace-monokai .ace_support.ace_type {\
font-style: italic;\
color: #66D9EF\
}\
.ace-monokai .ace_entity.ace_name.ace_function,\
.ace-monokai .ace_entity.ace_other,\
.ace-monokai .ace_entity.ace_other.ace_attribute-name,\
.ace-monokai .ace_variable {\
color: #A6E22E\
}\
.ace-monokai .ace_variable.ace_parameter {\
font-style: italic;\
color: #FD971F\
}\
.ace-monokai .ace_string {\
color: #E6DB74\
}\
.ace-monokai .ace_comment {\
color: #75715E\
}\
.ace-monokai .ace_indent-guide {\
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWPQ0FD0ZXBzd/wPAAjVAoxeSgNeAAAAAElFTkSuQmCC) right repeat-y\
}";
var dom = require("../lib/dom");
dom.importCssString(exports.cssText, exports.cssClass);
});
(function() {
ace.require(["ace/theme/monokai"], function(m) {
if (typeof module == "object" && typeof exports == "object" && module) {
module.exports = m;
}
});
})();

2
html/base.js Normal file
View File

@ -0,0 +1,2 @@
var brws=(typeof browser=="undefined"?chrome:browser)
document.querySelectorAll("[data-message]").forEach(e=>e.textContent=brws.i18n.getMessage(e.getAttribute("data-message")))

View File

@ -1 +0,0 @@
/*basic.css v1.1 | (c)2017-2018, Hellsh Ltd. | https://storage.hellsh.com/assets/basic.css*/body{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-size:1rem}h1,h2,h3,h4,h5,h6,p{margin:.5rem 0;font-family:inherit;font-weight:400}h1{font-size:2.5rem}h2{font-size:2rem}h3{font-size:1.75rem}h4{font-size:1.5rem}h5{font-size:1.25rem}h6{font-size:1rem}p{margin:5px 0}a{color:#0288D1;text-decoration:none}hr{border:none;border-bottom:1px solid #000;margin:10px 0}

17
html/before-navigate.html Normal file
View File

@ -0,0 +1,17 @@
<!DOCTYPE html>
<html>
<head>
<title data-message="beforeNavigate"></title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="style.css">
</head>
<body>
<h1 data-message="beforeNavigate"></h1>
<p data-message="beforeNavigateDestination"></p>
<br>
<p><span data-message="beforeNavigateInfo"></span> <a href="options.html" target="_blank" data-message="optionsLink"></a></p>
<script src="base.js"></script>
<script src="before-navigate.js"></script>
</body>
</html>

16
html/before-navigate.js Normal file
View File

@ -0,0 +1,16 @@
let params=new URLSearchParams(location.search)
if(params.has("target"))
{
brws.storage.sync.get(["instant_navigation"],res=>{
if(res&&res.instant_navigation&&res.instant_navigation==="true")
location.href=params.get("target")
})
let i=document.querySelector('[data-message="beforeNavigateDestination"]')
i.innerHTML=i.innerHTML.replace("%",'<a></a>')
let a=i.querySelector("a")
a.href=a.textContent=params.get("target")
}
else
{
history.back()
}

14
html/blocked.html Normal file
View File

@ -0,0 +1,14 @@
<!DOCTYPE html>
<html>
<head>
<title data-message="blockedTitle"></title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="style.css">
</head>
<body>
<h1 data-message="blockedTitle"></h1>
<p><span data-message="blockedSubtitle"></span> <a href="options.html" target="_blank" data-message="optionsLink"></a></p>
<script src="base.js"></script>
</body>
</html>

17
html/crowd-bypassed.html Normal file
View File

@ -0,0 +1,17 @@
<!DOCTYPE html>
<html>
<head>
<title data-message="crowdBypassed"></title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="style.css">
</head>
<body>
<h1 data-message="crowdBypassed"></h1>
<p data-message="crowdBypassedInfo"></p>
<br>
<p><a id="ignore" href="#" data-message="crowdBypassedIgnore"></a></p>
<script src="base.js"></script>
<script src="crowd-bypassed.js"></script>
</body>
</html>

14
html/crowd-bypassed.js Normal file
View File

@ -0,0 +1,14 @@
let params=new URLSearchParams(location.search)
if(params.has("target")&&params.has("back"))
{
let i=document.querySelector('[data-message="crowdBypassedInfo"]')
i.innerHTML=i.innerHTML.replace("%",'<a></a>')
let a=i.querySelector("a")
a.setAttribute("target","_blank")
a.href=a.textContent=params.get("target")
document.getElementById("ignore").href=params.get("back")+"#ignoreCrowdBypass"
}
else
{
history.back()
}

View File

@ -0,0 +1,18 @@
<!DOCTYPE html>
<html>
<head>
<title data-message="firstrunTitle"></title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="style.css">
</head>
<body>
<h1 data-message="firstrunTitle"></h1>
<p data-message="firstrunSubtitle"></p>
<br>
<p data-message="firstrunNoScript"></p>
<hr>
<p>Copyright (c) 2018-19 Tim "timmyRS" Speckhals</p>
<script src="base.js"></script>
</body>
</html>

View File

@ -3,19 +3,18 @@
<head>
<title data-message="firstrunTitle"></title>
<meta charset="UTF-8">
<link rel="stylesheet" href="basic.css">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="style.css">
</head>
<body>
<h1 data-message="firstrunTitle"></h1>
<p data-message="firstrunSubtitle"></p>
<hr>
<p data-message="firstrunWhatnow"></p>
<ul>
<li><a href="https://twitter.com/unibypass" target="_blank" data-message="firstrunTwitter"></a></li>
<li><a href="options.html" target="_blank" data-message="firstrunOptions"></a></li>
<li><a href="options.html" target="_blank" data-message="options"></a></li>
<li><a href="https://universal-bypass.org/faq" target="_blank" data-message="faq"></a></li>
</ul>
<hr>
<p>Copyright (c) 2018, <a href="https://hellsh.com" target="_blank">Hellsh Ltd.</a></p>
<script src="translations.js"></script>
<p>Copyright (c) 2018-19 Tim "timmyRS" Speckhals</p>
<script src="base.js"></script>
</body>
</html>

View File

@ -1,38 +1,30 @@
<!DOCTYPE html>
<html>
<head>
<title data-message="options"></title>
<title>Universal Bypass</title>
<meta charset="UTF-8">
<link rel="stylesheet" href="basic.css">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
<style>body{padding:20px}#custom-bypass-editor{font-family:"DejaVu Sans Mono",monospace;min-height:500px;min-height:calc(100vh - 370px)}</style>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="style.css">
</head>
<body>
<h1 data-message="options"></h1>
<br>
<p><input type="checkbox" id="option-notifications"> <label for="option-notifications" data-message="optionsNotifications"></label></li></p>
<h1>Universal Bypass</h1>
<p><a href="https://universal-bypass.org/faq" target="_blank" data-message="faq"></a></p>
<h2 data-message="options"></h2>
<p>
<input type="checkbox" id="option-enabled"> <label for="option-enabled" data-message="optionsEnabled"></label><br>
<input type="checkbox" id="option-instant-navigation"> <label for="option-instant-navigation" data-message="optionsInstantNavigation"></label><br>
<input type="checkbox" id="option-tracker-bypass"> <label for="option-tracker-bypass"><span data-message="optionsTrackerBypass"></span> (Bit.ly, Goo.gl, T.co, ...)</label> (<a href="https://apimon.de/privacy" target="_blank" data-message="privacyPolicy"></a>)<br>
<input type="checkbox" id="option-block-ip-loggers"> <label for="option-block-ip-loggers" data-message="optionsBlockIPLoggers"></label><br>
<input type="checkbox" id="option-crowd-bypass"> <label for="option-crowd-bypass" data-message="optionsCrowdBypass"></label> (<a href="https://github.com/timmyrs/Universal-Bypass/blob/master/PRIVACY.md" target="_blank" data-message="privacyPolicy"></a>)
</ul>
<h2 data-message="optionsUserscripts"></h2>
<a name="userscripts"></a>
<p><span data-message="optionsUserscriptsSubtitle"></span> <a href="https://github.com/hellshltd/Universal-Bypass" target="_blank">https://github.com/hellshltd/Universal-Bypass</a></p>
<div class="row">
<div class="col-lg-3">
<div class="list-group" id="custom-bypasses-list"></div>
</div>
<div class="col-lg-9">
<div id="custom-bypass-edit-container">
<p><input type="text" id="custom-bypass-name" class="form-control" data-placeholder="optionsUserscriptsName"></p>
<p><input type="text" id="custom-bypass-domains" class="form-control" data-placeholder="optionsUserscriptsDomains"></p>
<p><textarea id="custom-bypass-editor" class="form-control"></textarea></p>
<p>
<a href="#userscripts" id="save-custom-bypass" class="btn btn-primary" data-message="save"></a>
<a href="#" id="delete-custom-bypass" class="btn btn-outline-danger" data-message="optionsUserscriptsDelete"></a>
</p>
</div>
</div>
</div>
<p><span data-message="optionsUserscriptsSubtitle"></span></p>
<div id="userscript" style="font-family:'DejaVu Sans Mono',monospace;min-height:440px;height:calc(100vh - 400px)"></div>
<hr>
<p>Copyright (c) 2018, <a href="https://hellsh.com" target="_blank">Hellsh Ltd.</a></p>
<script src="translations.js"></script>
<p>Copyright (c) 2018-19 Tim "timmyRS" Speckhals</p>
<script src="base.js"></script>
<script src="ace/ace.js"></script>
<script src="options.js"></script>
</body>
</html>

View File

@ -1,96 +1,108 @@
chrome.storage.local.get(["custom_bypasses"],(result)=>{
let customBypasses=(result&&result.custom_bypasses)?JSON.parse(result.custom_bypasses):{},
customBypassesList=document.getElementById("custom-bypasses-list"),
customBypassName=document.getElementById("custom-bypass-name"),
customBypassDomains=document.getElementById("custom-bypass-domains"),
bypassEditor=document.getElementById("custom-bypass-editor"),
editingBypass="",
reloadCustomBypassList=()=>{
customBypassesList.innerHTML=""
customBypasses["+ Add"]={}
if(editingBypass)
document.getElementById("custom-bypass-edit-container").style.display="block"
else
document.getElementById("custom-bypass-edit-container").style.display="none"
for(let name in customBypasses)
{
let a=document.createElement("a")
a.id="custom-bypass-"+name
a.href="#userscripts"
a.className="list-group-item list-group-item-action"+(editingBypass==name?" active":"")
a.textContent=name
a.onclick=function()
{
let _active=document.querySelector(".list-group-item.active")
if(_active)
_active.className="list-group-item list-group-item-action"
editingBypass=this.id.substr(14)
if(editingBypass=="+ Add")
{
customBypasses[editingBypass="Untitled Bypass"]={
domains:"example.com,example.org",
content:'let b=document.getElementById("button")\nif(b&&b.href)\n location.href=b.href'
}
}
else
{
this.className="list-group-item list-group-item-action active"
}
customBypassName.value=editingBypass
customBypassDomains.value=customBypasses[editingBypass].domains
bypassEditor.textContent=customBypasses[editingBypass].content
saveCustomBypass()
}
customBypassesList.appendChild(a)
}
delete customBypasses["+ Add"]
},
saveCustomBypass=()=>{
if(customBypassName.value!=editingBypass)
{
if(customBypassName.value)
{
customBypasses[customBypassName.value]=customBypasses[editingBypass]
delete customBypasses[editingBypass]
editingBypass=customBypassName.value
}
else
{
if(confirm("Do you really want to delete this bypass?"))
{
delete customBypasses[editingBypass]
editingBypass=""
}
else
customBypassName.value=editingBypass
}
}
if(editingBypass!="")
{
customBypasses[editingBypass].domains=customBypassDomains.value
customBypasses[editingBypass].content=bypassEditor.value
}
chrome.storage.local.set({custom_bypasses:JSON.stringify(customBypasses)},reloadCustomBypassList);
}
reloadCustomBypassList()
document.getElementById("save-custom-bypass").onclick=saveCustomBypass
document.getElementById("delete-custom-bypass").onclick=()=>{
customBypassName.value=""
saveCustomBypass()
}
})
chrome.storage.sync.get(["no_notifications"],(result)=>{
let notificationsCheckbox=document.getElementById("option-notifications")
if(!result||!result.no_notifications||result.no_notifications!=="true")
var example=`//Some examples of what you can do with custom bypasses:
domainBypass("example.com", function()
{
ensureDomLoaded(function()
{
notificationsCheckbox.setAttribute("checked","checked")
let button = document.getElementById("skip-button")
if(button != null)
{
button.click()
}
})
})
hrefBypass(/example\\.(com|org)/, function()
{
// This bypass won't trigger on example.com because
// we have already defined a bypass for example.com.
sI(function()
{
// sI is a copy of window.setInterval.
// You may also use sT (setTimeout), ev (eval),
// and safelyNavigate(url) in your bypasses.
console.log("A second has passed")
}, 1000)
})
// Feel free to replace this with your own code now!
// Changes are automatically saved.
`,saveTimer,editor=ace.edit("userscript",{mode:"ace/mode/javascript",theme:"ace/theme/monokai"}),
span=document.querySelector("[data-message='optionsUserscriptsSubtitle']")
span.innerHTML=span.textContent.replace("GitHub","<a href='https://github.com/timmyrs/Universal-Bypass/blob/master/content_script.js' target='_blank'>GitHub</a>")
brws.storage.local.get(["userscript"],res=>{
if(res&&res.userscript)
{
editor.setValue(res.userscript)
}
notificationsCheckbox.onchange=()=>{
notificationsCheckbox.setAttribute("disabled","disabled")
chrome.storage.sync.set({
no_notifications:(!notificationsCheckbox.checked).toString()
},()=>{
notificationsCheckbox.removeAttribute("disabled")
else
{
editor.setValue(example)
brws.storage.local.set({
userscript: example
})
}
editor.resize()
editor.clearSelection()
editor.on("change", ()=>{
clearInterval(saveTimer)
saveTimer=setTimeout(()=>{
brws.storage.local.set({
userscript: editor.getValue()
})
},500)
})
})
brws.storage.sync.get(["disable","instant_navigation","no_tracker_bypass","allow_ip_loggers","crowd_bypass_opt_out"],res=>{
if(res==undefined)
{
res={}
}
let enabledCheckbox=document.getElementById("option-enabled"),
instantNavigationCheckbox=document.getElementById("option-instant-navigation"),
trackerBypassCheckbox=document.getElementById("option-tracker-bypass"),
blockIPLoggersCheckbox=document.getElementById("option-block-ip-loggers"),
crowdBypassCheckbox=document.getElementById("option-crowd-bypass")
if(!res.disable||res.disable!=="true")
{
enabledCheckbox.setAttribute("checked","checked")
}
if(res.instant_navigation&&res.instant_navigation==="true")
{
instantNavigationCheckbox.setAttribute("checked","checked")
}
if(!res.no_tracker_bypass||res.no_tracker_bypass!=="true")
{
trackerBypassCheckbox.setAttribute("checked","checked")
}
if(!res.allow_ip_loggers||res.allow_ip_loggers!=="true")
{
blockIPLoggersCheckbox.setAttribute("checked","checked")
}
if(!res.crowd_bypass_opt_out||res.crowd_bypass_opt_out!=="true")
{
crowdBypassCheckbox.setAttribute("checked","checked")
}
enabledCheckbox.onchange=()=>{
brws.storage.sync.set({
disable:(!enabledCheckbox.checked).toString()
})
}
instantNavigationCheckbox.onchange=()=>{
brws.storage.sync.set({
instant_navigation:instantNavigationCheckbox.checked.toString()
})
}
trackerBypassCheckbox.onchange=()=>{
brws.storage.sync.set({
no_tracker_bypass:(!trackerBypassCheckbox.checked).toString()
})
}
blockIPLoggersCheckbox.onchange=()=>{
brws.storage.sync.set({
allow_ip_loggers:(!blockIPLoggersCheckbox.checked).toString()
})
}
crowdBypassCheckbox.onchange=()=>{
brws.storage.sync.set({
crowd_bypass_opt_out:(!crowdBypassCheckbox.checked).toString()
})
}
})

View File

@ -1,19 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="basic.css">
<style>body{min-width:400px}</style>
</head>
<body>
<h1>Universal Bypass</h1>
<p data-message="appDesc"></p>
<ul>
<li><a href="options.html" target="_blank" data-message="popupOptions"></a></li>
<li><a href="https://universal-bypass.org" target="_blank" data-message="homepage"></a></li>
<li><a href="https://twitter.com/unibypass" target="_blank">Twitter</a></li>
</ul>
<p>Copyright (c) 2018, <a href="https://hellsh.com" target="_blank">Hellsh Ltd.</a></p>
<script src="translations.js"></script>
</body>
</html>

1
html/style.css Normal file
View File

@ -0,0 +1 @@
body{font-family:-apple-system,BlinkMacSystemFont,segoe ui,Roboto,helvetica neue,Arial,sans-serif,apple color emoji,segoe ui emoji,segoe ui symbol;font-size:1rem;direction:__MSG_@@bidi_dir__;padding:0 7px 3px 7px;min-width:650px}h1,h2,h3,h4,h5,h6,p{margin:.5rem 0;font-family:inherit;font-weight:400}h1{font-size:2.5rem}h2{font-size:2rem}h3{font-size:1.75rem}h4{font-size:1.5rem}h5{font-size:1.25rem}h6{font-size:1rem}p{margin:5px 0}a{color:#0288d1;text-decoration:none}hr{border:0;border-bottom:1px solid #000;margin:10px 0}

View File

@ -1,14 +0,0 @@
let elms=document.querySelectorAll("[data-message]")
for(let i in elms)
{
let elm=elms[i]
if(elm instanceof HTMLElement)
elm.textContent=chrome.i18n.getMessage(elm.getAttribute("data-message"))
}
elms=document.querySelectorAll("[data-placeholder]")
for(let i in elms)
{
let elm=elms[i]
if(elm instanceof HTMLElement)
elm.setAttribute("placeholder",chrome.i18n.getMessage(elm.getAttribute("data-placeholder")))
}

BIN
icon/128.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

BIN
icon/150.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

BIN
icon/176.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

BIN
icon/40.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 744 B

BIN
icon/48.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
icon/512.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

View File

@ -1,43 +1,55 @@
{
"manifest_version": 2,
"icons": {
"128": "icon/icon_128.png",
"256": "icon/icon_256.png",
"512": "icon/icon_512.png"
"40": "icon/40.png",
"48": "icon/48.png",
"128": "icon/128.png",
"150": "icon/150.png",
"176": "icon/176.png",
"512": "icon/512.png"
},
"default_locale": "en",
"name": "Universal Bypass",
"description": "__MSG_appDesc__",
"homepage_url": "https://universal-bypass.org/",
"version": "4.0.2",
"author": "timmyRS",
"minimum_chrome_version": "41",
"version": "9.6.5",
"author": "Tim \"timmyRS\" Speckhals",
"permissions": [
"storage",
"webRequest",
"webRequestBlocking",
"<all_urls>"
],
"options_ui": {
"page": "html/options.html",
"open_in_tab": true
},
"permissions": [
"storage"
],
"browser_action": {
"default_icon": {
"128": "icon/icon_128.png",
"256": "icon/icon_256.png",
"512": "icon/icon_512.png"
"40": "icon/40.png",
"48": "icon/48.png",
"128": "icon/128.png",
"150": "icon/150.png",
"176": "icon/176.png",
"512": "icon/512.png"
},
"default_popup": "html/popup.html"
"default_popup": "html/options.html"
},
"background": {
"scripts": ["background.js"],
"persistent": false
"scripts": ["background.js"]
},
"content_scripts": [
{
"matches": ["*://*/*"],
"js": [
"content_script.js"
],
"matches": ["<all_urls>"],
"js": ["content_script.js"],
"run_at": "document_start"
}
],
"web_accessible_resources": [
"html/before-navigate.html",
"html/blocked.html",
"html/crowd-bypassed.html",
"html/firstrun.html",
"html/firstrun-noscript.html"
]
}
}