293 Commits

Author SHA1 Message Date
Kevin Röbert
b3ed752f02 Version 1.13.0 2020-02-01 12:19:11 +01:00
Kevin Röbert
93f81983f0 Update CHANGELOG.md 2020-01-29 16:29:10 +01:00
Kevin Röbert
9cce46590a Version 1.12.0 2020-01-29 16:25:34 +01:00
Röbert
a554391183 Removed default translations 2020-01-29 10:00:26 +01:00
Kevin Röbert
e8ca631829 Update messages.json (POEditor.com) 2020-01-29 08:46:55 +00:00
Röbert
0447f9aa25 Revert "Update messages.json (POEditor.com)"
This reverts commit 51f7cf9464.
2020-01-29 09:36:47 +01:00
Kevin Röbert
b605e3aa62 Update messages.json (POEditor.com) 2020-01-29 08:32:07 +00:00
Kevin Röbert
2fb7ddab10 Update messages.json (POEditor.com) 2020-01-29 08:32:02 +00:00
Kevin Röbert
523b52d34a Update messages.json (POEditor.com) 2020-01-29 08:32:00 +00:00
Kevin Röbert
6954ad2eef Update messages.json (POEditor.com) 2020-01-29 08:31:57 +00:00
Kevin Röbert
8d51e54237 Update messages.json (POEditor.com) 2020-01-29 08:31:55 +00:00
Kevin Röbert
f94f1a2064 Update messages.json (POEditor.com) 2020-01-29 08:31:53 +00:00
Kevin Röbert
e6370cc5fa Update messages.json (POEditor.com) 2020-01-29 08:31:51 +00:00
Kevin Röbert
193caa3ae0 Update messages.json (POEditor.com) 2020-01-29 08:31:49 +00:00
Kevin Röbert
e797c232f1 Update messages.json (POEditor.com) 2020-01-29 08:31:47 +00:00
Kevin Röbert
7043119985 Update messages.json (POEditor.com) 2020-01-29 08:31:44 +00:00
Kevin Röbert
27ad8953c6 Update messages.json (POEditor.com) 2020-01-29 08:31:42 +00:00
Kevin Röbert
51f7cf9464 Update messages.json (POEditor.com) 2020-01-29 08:31:40 +00:00
Kevin Röbert
ac9fc780f7 Update messages.json (POEditor.com) 2020-01-29 08:31:38 +00:00
Kevin Röbert
c37cae510f Update messages.json (POEditor.com) 2020-01-29 08:31:36 +00:00
Kevin Röbert
58b692ed39 Update messages.json (POEditor.com) 2020-01-29 08:31:34 +00:00
Kevin Röbert
ab948eab11 Update README.md 2020-01-29 08:17:38 +00:00
Röbert
9b29d5e907 Added rules
#366
2020-01-29 08:43:28 +01:00
Kevin Röbert
755af24b3e Changed rule/Added rules
#305
#360
#358
2020-01-17 10:19:32 +01:00
Kevin Röbert
cb9b2dbdea Merge branch 'master' into 'master'
Re-did Spanish localizacion

See merge request KevinRoebert/ClearUrls!55
2020-01-15 07:56:05 +00:00
Kevin Röbert
04a3f745b2 Added rules and exceptions
#350
#353
#357
2020-01-15 08:49:25 +01:00
Kevin Röbert
5930376eb5 Added exception
Added exception for Window 10 start menu bing search redirection
2020-01-12 20:46:59 +01:00
Kevin Röbert
f06609d3e1 Added exception
#351
2020-01-11 19:43:47 +01:00
Marcos Del Sol Vives
38ea5ed802 Re-did Spanish localizacion 2020-01-11 00:13:41 +01:00
Kevin Röbert
55cb9e8b39 Added rules
#348
2020-01-10 21:11:02 +01:00
Kevin Röbert
73954b2d82 Added exception
#347
2020-01-08 10:42:09 +01:00
Kevin Röbert
861cf554f5 Added exception handling on browser.tabs.get()
#346
2020-01-08 10:38:48 +01:00
Kevin Röbert
c3ddf2a8d4 Merge branch 'master' of https://gitlab.com/KevinRoebert/ClearUrls 2020-01-06 18:09:19 +01:00
Kevin Röbert
cf6fe59fbd Added new screenshots 2020-01-06 18:09:13 +01:00
Kevin Röbert
cbdc108358 Update README.md 2020-01-06 17:00:31 +00:00
Kevin Röbert
e4fdb6bca1 Merge branch 'master' of https://gitlab.com/KevinRoebert/ClearUrls 2020-01-06 17:36:05 +01:00
Kevin Röbert
44a4334843 Added exception
Fix #345
2020-01-06 17:35:49 +01:00
Kevin Röbert
b472913c67 Update README.md 2020-01-06 16:27:53 +00:00
Kevin Röbert
62fbf626ed Updates README 2020-01-06 17:26:58 +01:00
Kevin Röbert
ccdca3b595 Some beautifications 2020-01-06 17:15:58 +01:00
Kevin Röbert
0417469a26 Added yandex link fixer + renewed copyright notice
#305
2020-01-06 17:14:34 +01:00
Kevin Röbert
50542fa6a3 Version 1.11.0
#336
#340
#342
#339
#334
2020-01-06 16:22:37 +01:00
Kevin Röbert
08fe25dc0d Update CHANGELOG.md 2020-01-04 01:29:31 +01:00
Kevin Röbert
ae32bcf21e Merge branch 'upgrade-libs' into 'master'
Upgrade libs

Closes #307, #332, #333, and #338

See merge request KevinRoebert/ClearUrls!54
2020-01-04 00:14:03 +00:00
Kevin Röbert
b2ffb3293f Version 1.10.0
- Updated to Bootstrap 4.3.1
- Updated to jQuery 3.4.1
- Updated to DataTables 1.10.20
- Deleted unnecessary Bootstrap Dialog lib
- Replaced [pick-a-color](https://github.com/lauren/pick-a-color) with [bootstrap-colorpicker 3.2.0](https://github.com/itsjavi/bootstrap-colorpicker)
- Added [popper.js 1.16.0](https://github.com/popperjs/popper.js/tree/v1.16.0)
- Fixed [#333](https://gitlab.com/KevinRoebert/ClearUrls/issues/333)
- Fixed [#332](https://gitlab.com/KevinRoebert/ClearUrls/issues/332)
- Fixed [#307](https://gitlab.com/KevinRoebert/ClearUrls/issues/307)
- Maybe [#315](https://gitlab.com/KevinRoebert/ClearUrls/issues/315) fixed
2020-01-04 00:14:03 +00:00
Kevin Röbert
d41ab7ff9d Correction 2020-01-03 21:02:41 +01:00
Kevin Röbert
969385bc21 Merge branch 'master' into 'master'
Added Swedish translation

See merge request KevinRoebert/ClearUrls!53
2020-01-03 19:55:19 +00:00
Sopor
b8a1b4dadd Added Swedish translation 2020-01-03 19:55:19 +00:00
Kevin Röbert
5cfe99b753 Merge branch 'patch-1' into 'master'
minor corrections

See merge request KevinRoebert/ClearUrls!52
2020-01-02 15:35:50 +00:00
Sopor
392f3bc70a minor corrections 2019-12-28 12:17:03 +00:00
Kevin Röbert
d10e041125 New rules/redirections + fix for subdomains pattern 2019-12-26 14:16:08 +01:00
Kevin Röbert
6eb8636149 Added exception
#329
2019-12-22 20:15:13 +01:00
Kevin Röbert
fcb9f16b7a Added new rule
Fixed #314
2019-12-18 17:12:14 +01:00
Kevin Röbert
22426dfc24 Added exception for td.com
#325
2019-12-18 16:58:06 +01:00
Kevin Röbert
f8fb9bf5ef Version 1.9.5
+ Added Turkish translation by Ulaş Çakmak
+ Updated some strings of French translation by lucifer
+ Fixed problem with default RegExp
2019-12-17 20:35:05 +01:00
Kevin Röbert
c5e00dc5ef Updated french translation
A special thanks to lucifer
2019-12-17 20:28:10 +01:00
Röbert
e5d226e374 Added new rule
#321 - prevent Twitter AMP ping tracking
2019-12-16 14:18:15 +01:00
Kevin Röbert
3395a17c60 quick fix 2019-12-11 23:53:04 +01:00
Kevin Röbert
f7ed9fa1d8 Update data.min.json
#320
#317
#319
#318
2019-12-11 23:46:47 +01:00
Kevin Röbert
66d6672178 Added exception
#313
2019-12-07 19:23:17 +01:00
Kevin Röbert
80c29e7004 Added rules/exceptions
#310
#312
#313
2019-12-07 19:16:25 +01:00
Kevin Röbert
74aad21218 Update messages.json (POEditor.com) 2019-11-28 17:53:16 +00:00
Kevin Röbert
8115655a30 Merge branch 'KevinRoebert-master-patch-06543' into 'master'
Update _locales/tr/messages.json

See merge request KevinRoebert/ClearUrls!51
2019-11-28 17:51:02 +00:00
Kevin Röbert
073b55ad74 Update _locales/tr/messages.json 2019-11-28 17:51:02 +00:00
Kevin Röbert
51fe1bcac3 Added new rules + regex fixes
#303
2019-11-27 23:16:08 +01:00
Kevin Röbert
7c5f4c31d5 missing 2019-11-24 18:06:03 +01:00
Kevin Röbert
84c069331f Version 1.9.4 2019-11-24 18:05:42 +01:00
Kevin Röbert
deb7648d61 Exception amazon
#298
2019-11-21 22:46:19 +01:00
Kevin Röbert
46cd3f21d0 Added exceptions for gitlab instances and amazon support chat
#298
2019-11-21 22:40:53 +01:00
Kevin Röbert
26a5b0648f Added exception for gitlab instances
Works only for gitlab instances with git subdomain
2019-11-19 16:40:58 +01:00
Kevin Röbert
120239aa0d downward compatible 2019-11-15 22:56:26 +01:00
Kevin Röbert
a96684b93a Merge branch 'load-balancing-for-static-contents' into 'master'
Load balancing for static contents

See merge request KevinRoebert/ClearUrls!50
2019-11-15 20:28:04 +00:00
Kevin Röbert
ecd5f82b77 Version 1.9.3.1
+ Changed data and hash URL to GitLab Pages, to prevent hitting the GitLab infrastructure directly [#295](https://gitlab.com/KevinRoebert/ClearUrls/issues/295#note_245456134).
2019-11-15 21:26:57 +01:00
Kevin Röbert
a645b52db0 .
.
2019-11-15 21:45:43 +01:00
Kevin Röbert
b016226750 Make static data accessible via GitLab pages 2019-11-15 21:43:58 +01:00
Kevin Röbert
80ebc5bffa Version 1.9.3
Fixed wrong initial rules URL
2019-11-15 03:06:32 +01:00
Kevin Röbert
468c2ac4ea Revert "Corrected line endings, so SRI hash are equals to the online versions"
This reverts commit 82ce2d4d4f.
2019-11-12 18:30:49 +01:00
Kevin Röbert
82ce2d4d4f Corrected line endings, so SRI hash are equals to the online versions 2019-11-12 18:25:30 +01:00
Kevin Röbert
f752e8aaff Merge branch 'patch-2' into 'master'
b@spiegel.de

See merge request KevinRoebert/ClearUrls!49
2019-11-12 01:52:22 +00:00
rusty-snake
bb4d543fc2 b@spiegel.de 2019-11-11 16:23:02 +01:00
Kevin Röbert
6eaf8726ee Updated promo pic 2019-11-09 13:47:44 +01:00
Kevin Röbert
0668562306 CI
I'm tired.
2019-11-09 01:46:38 +01:00
Kevin Röbert
722df04af0 CI location fix 2019-11-09 01:44:58 +01:00
Kevin Röbert
aa728302a8 CI fix 2 2019-11-09 01:43:24 +01:00
Kevin Röbert
4a77447992 CI fix 2019-11-09 01:41:42 +01:00
Kevin Röbert
61712e77a2 Version 1.9.2
#290
2019-11-09 01:40:17 +01:00
Kevin Röbert
61b911921e Remove doubleclick from complete blocking
As it turned out, doubleclick is needed for a lot of things, including playing videos.

If you want to block advertisements or domains, you can use advertising blockers like UBlock or Pihole.

ClearURL's task is to remove tracking fields and not to block pages.
2019-10-31 16:44:00 +01:00
Kevin Röbert
13c1bd774c Merge branch 'master' of https://gitlab.com/KevinRoebert/ClearUrls 2019-10-31 16:18:07 +01:00
Kevin Röbert
0384a1a6cc Added exception
#289
2019-10-31 16:17:53 +01:00
Kevin Röbert
cd6d7f2d09 Update messages.json (POEditor.com) 2019-10-30 23:57:07 +00:00
Kevin Röbert
b241428752 Added new redirection
- Added new redirection for smartredirect.de
2019-10-30 22:33:55 +01:00
Kevin Röbert
7b457e7e5e Merge branch 'master' of https://gitlab.com/KevinRoebert/ClearUrls 2019-10-30 21:34:58 +01:00
Kevin Röbert
927f2d8d69 Added redirection and exception
- Added new redirection for ebay
- Added exception #288
2019-10-30 21:34:56 +01:00
Kevin Röbert
0c1fc0646e Merge branch 'patch-1' into 'master'
Remove `redirect_source` parameter on mozilla.org

See merge request KevinRoebert/ClearUrls!48
2019-10-27 15:02:57 +00:00
rusty-snake
ef1b7fbd0e Update data.min.json 2019-10-26 15:47:47 +00:00
Kevin Röbert
8342851d4e Update CHANGELOG.md 2019-10-24 20:22:32 +02:00
Kevin Röbert
d52d8d75e2 Update messages.json (POEditor.com) 2019-10-24 18:18:02 +00:00
Kevin Röbert
dee6c21ad2 Dummy it translation file 2019-10-24 20:18:13 +02:00
Kevin Röbert
92d582b8d2 Version 1.9.1
- Fixed badged in quiet mode
2019-10-24 20:13:38 +02:00
Kevin Röbert
902605f8ee Update Bug.md 2019-10-22 23:55:02 +00:00
Kevin Röbert
4d9b86178e Update README.md 2019-10-22 23:21:01 +00:00
Kevin Röbert
d064537c07 Version 1.9.0
- Added #284
- Added #56
- Fixed #241
- Possible fix & workaround for #203
- Fixed bug in "history tracking injection protection". This option was not disabled, when the global filter switch are on off
- Added an option to im-/export the log (requires the `downloads` permission)
- Added an option to im-/export the settings (requires the `downloads` permission)
- Added information page for blocked sites, when they are called in the `main_frame`
- Added "multiple times URL encodes" recognition
- Refactoring
- Changed background script loading sequence to prevent that required functions are not yet loaded.
2019-10-23 01:16:12 +02:00
Kevin Röbert
9df322a49a Update README.md 2019-10-22 16:26:39 +02:00
Kevin Röbert
99b86e7735 Update Bug.md 2019-10-22 13:17:40 +00:00
Kevin Röbert
145e11deac Updated ui screenshot 2019-10-20 19:41:38 +02:00
Kevin Röbert
4b5ad86c50 Added rules & exception
#282
#283
2019-10-20 19:13:04 +02:00
Kevin Röbert
d7b0094052 Added rules and redirection
#281
2019-10-18 13:21:25 +02:00
Kevin Röbert
ba7541c22e Removed amazon rule
#168
#280
2019-10-14 21:29:42 +02:00
Kevin Röbert
d689a7ce35 Added rules
#279
2019-10-13 19:00:38 +02:00
Kevin Röbert
fd561a1490 Added LinkedIn rules
#278
2019-10-09 16:49:09 +02:00
Kevin Röbert
8cffd42108 Added exceptions
#274
2019-10-08 15:26:00 +02:00
Kevin Röbert
94bb289bfa Add exception
#276
2019-10-08 14:42:41 +02:00
Kevin Röbert
a1b8f8eaaf rule improvement
#276
2019-10-08 14:30:38 +02:00
Kevin Röbert
600a4767d9 Added rules
#272
2019-10-04 15:23:54 +02:00
Kevin Röbert
191fcfce23 Version 1.8.5
#264
#262
#267
2019-09-29 17:10:26 +02:00
Kevin Röbert
1367284767 Added exception
#260
2019-09-26 21:15:38 +02:00
Kevin Röbert
89f6e7ea2d Update i253.html 2019-09-26 19:03:50 +00:00
Kevin Röbert
ad3ab8df07 Version 1.8.4
- Force redirects only on main frames
- Added google link fix script, to avoid the sub frame permission for force redirection on google
2019-09-26 20:50:39 +02:00
Kevin Röbert
7ccd78ad39 Added rule
#258
2019-09-25 00:34:53 +02:00
Kevin Röbert
1d061c4353 Deleted iframe border 2019-09-24 19:47:44 +02:00
Kevin Röbert
0b79d469ed Pages fix 2019-09-24 18:35:33 +02:00
Kevin Röbert
abd61783d2 Update .gitlab-ci.yml 2019-09-24 16:24:22 +00:00
Kevin Röbert
2b14d4f321 Merge branch 'master' of https://gitlab.com/KevinRoebert/ClearUrls 2019-09-24 18:24:07 +02:00
Kevin Röbert
8f1bdbfc7a Fix 2019-09-24 18:23:06 +02:00
Kevin Röbert
bfa5cb1f2f Update .gitlab-ci.yml 2019-09-24 16:19:19 +00:00
Kevin Röbert
f6b5627eaf Add test page to gitlab.io 2019-09-24 18:16:54 +02:00
Kevin Röbert
62d53b6f85 Changed rule 2019-09-24 18:02:51 +02:00
Kevin Röbert
c4612b099b Update README.md 2019-09-23 23:24:16 +00:00
Kevin Röbert
d5d6f58482 Version 1.8.3
+ Fixed OR case
2019-09-23 23:36:24 +02:00
Kevin Röbert
b26b6f9aec Version 1.8.2
+ Fixed #253
+ Fixed #254
2019-09-23 16:20:51 +02:00
Kevin Röbert
fe82c9ee1b Added exception for Tinkoff bank
#255
2019-09-23 14:05:07 +02:00
Kevin Röbert
7db112687e Added exception for googleusercontent proxys
#254
2019-09-23 14:03:24 +02:00
Kevin Röbert
5341f27a16 Added exception
#177
2019-09-15 17:07:24 +02:00
Kevin Röbert
589153f210 Removed rule
#246
2019-09-13 12:58:28 +02:00
Kevin Röbert
e159041600 Version 1.8.1
!47
#206
2019-09-12 22:17:13 +02:00
Kevin Röbert
7e78bed8cb Merge branch 'master' into 'master'
Save to storage only on changes

See merge request KevinRoebert/ClearUrls!47
2019-09-12 19:54:23 +00:00
tartpvule
a4a62b0d1e Add console logging in saveOnDisk 2019-09-12 19:52:10 +00:00
Kevin Röbert
c2577c834f Update README.md 2019-09-12 18:59:55 +00:00
Kevin Röbert
e0122600c3 Update README.md 2019-09-12 18:42:09 +00:00
tartpvule
b951cf1172 Missed a storeHashStatus call point 2019-09-12 16:53:33 +00:00
tartpvule
b0f1c85cd8 Save on storage change and deferred save, part 3
Insert calls to saveOnDisk and deferSaveOnDisk
2019-09-12 16:45:56 +00:00
tartpvule
891723b7b9 Save on storage change and deferred save, part 2
Insert calls to deferSaveOnDisk
2019-09-12 16:44:14 +00:00
tartpvule
6cdcfd099f Save on storage change and deferred save, part 1
Implement saveOnDisk (previously dead code), deferSaveOnDisk
Remove setInterval(saveOnExit, 60000)
2019-09-12 16:42:44 +00:00
Kevin Röbert
afc7aa8740 Added exception
#252
2019-09-12 16:45:43 +02:00
Kevin Röbert
e6cc434757 Added exceptions for #251
#251
2019-09-11 20:01:48 +02:00
Kevin Röbert
d7b2878428 Quick fix 2019-09-11 19:55:06 +02:00
Kevin Röbert
fad7010f10 Added exceptions for blizzard
#248
2019-09-11 19:51:02 +02:00
Kevin Röbert
6ed708b94d Update README.md 2019-09-11 16:26:09 +00:00
Kevin Röbert
d2ec7ce49e Version 1.8.0 2019-09-11 18:08:41 +02:00
Kevin Röbert
9029781974 Added rules
#250
#249
#247
#246
2019-09-11 01:52:53 +02:00
Kevin Röbert
5af81a7d49 Added rules 2019-09-08 19:26:06 +02:00
Kevin Röbert
5ae149509e Version 1.7.4
- Added Hungarian translations by @ztoldy2
2019-09-06 13:13:19 +02:00
Kevin Röbert
9543d0f56f Added exception
#240
2019-09-06 13:05:37 +02:00
Kevin Röbert
deaceaed24 Added rules
#245
#244
#241
#240
2019-09-06 13:00:25 +02:00
Kevin Röbert
246a916fb7 Exception for fairphone bug tracker
#239
2019-09-03 22:02:32 +02:00
Kevin Röbert
5622861cf3 Revert "Chrome double tab fix"
This reverts commit cb7ccae737
2019-08-31 09:18:52 +00:00
Kevin Röbert
cb7ccae737 Chrome double tab fix
I hope this works and does not break anything else ^^"
2019-08-31 01:56:40 +02:00
Kevin Röbert
2e9e6ac21f Added rules
#236
#237
2019-08-31 01:13:09 +02:00
Kevin Röbert
c2a092367a Fixed global ref rule
#235
2019-08-29 01:29:51 +02:00
Kevin Röbert
05f1442d96 Added rule for woot.com
#231
2019-08-23 23:20:53 +02:00
Kevin Röbert
4c43cf8149 Updated rules
#230
2019-08-23 21:07:51 +00:00
Kevin Röbert
962d484712 Update rules
#229
#230
2019-08-22 21:57:05 +02:00
Kevin Röbert
9289e6a276 Added rules
#224
2019-08-16 02:02:53 +02:00
Kevin Röbert
8f64e8310c Added rules
#223
2019-08-16 02:02:00 +02:00
Kevin Röbert
35ed991651 Version 1.7.3
+ Updated Brazilian Portuguese translation by Ramon S.
2019-08-07 22:27:02 +02:00
Kevin Röbert
5d08bbbbad Version 1.7.2
+ Update japanese translation by @Shitennouji
2019-08-07 14:39:08 +02:00
Kevin Röbert
bea5543997 Update messages.json (POEditor.com) 2019-08-07 12:31:50 +00:00
Kevin Röbert
9537b181b8 Update messages.json (POEditor.com) 2019-08-06 12:32:17 +00:00
Kevin Röbert
291118d185 Update messages.json (POEditor.com) 2019-08-06 12:25:53 +00:00
Kevin Röbert
b75235f306 Version 1.7.1
#217
#218
#220
#221
2019-08-04 19:48:26 +02:00
Kevin Röbert
f4ad457047 Update CHANGELOG.md 2019-07-30 18:34:28 +00:00
Kevin Röbert
0f1ade94a2 Version 1.7.0
+ Added support for raw rules to cleaning also parts from URL-path
2019-07-30 20:29:41 +02:00
Kevin Röbert
cd988ed24e Translation corrected
Shame on me. Had made mistakes in my native language :(
2019-07-30 19:27:11 +02:00
Kevin Röbert
5da65aed98 Added rule and deleted unnecessary "or"
#209
2019-07-29 17:40:54 +02:00
Kevin Röbert
15daf50c71 Version 1.6.9
#207
#208

+ Fixed error in fields RegExp
2019-07-29 01:26:45 +02:00
Kevin Röbert
dbe7c603f9 Improvements and Bugfix - Version 1.6.8
#206
#205
2019-07-28 20:27:13 +02:00
Kevin Röbert
53de1eae53 Version 1.6.7
#175
#196
#204
2019-07-25 23:55:01 +02:00
Kevin Röbert
a3d3818766 Added new rule for 9gag.com
Fixed #204
2019-07-22 18:30:52 +02:00
Kevin Röbert
6c113d4ebd Update data.min.json
#201
2019-07-11 16:04:09 +00:00
Kevin Röbert
830cc055db Merge branch 'patch-1' into 'master'
remove sourcemap ref from browser-polyfill.js

Closes #175

See merge request KevinRoebert/ClearUrls!45
2019-07-08 15:50:44 +00:00
Yukulélé
ccd40c7df3 remove sourcemap ref from browser-polyfill.js 2019-07-05 12:16:29 +00:00
Kevin Röbert
1a057e8494 Exception #197 2019-06-25 20:05:25 +02:00
Kevin Röbert
2506dc6ebc Fixed typo #196 2019-06-24 14:22:17 +00:00
Kevin Röbert
44b0c043f8 Version 1.6.6
#171
#195
2019-06-14 01:24:46 +02:00
Kevin Röbert
f9289d9216 Version 1.6.5 2019-06-12 20:17:49 +02:00
Kevin Röbert
4d9e066781 Amazon ref fix? 2019-05-29 00:38:19 +02:00
Kevin Röbert
fe8de86c73 Add site3 rule 2019-05-29 00:36:21 +02:00
Kevin Röbert
89963b0d6d Added rules from #188 2019-05-29 00:29:23 +02:00
Kevin Röbert
e3191eecb1 Add redirection from #182 and maybe fix the reddit redirection 2019-05-21 19:24:40 +00:00
Kevin Röbert
5c3b1f4880 Add rules from #186 2019-05-21 18:52:45 +00:00
Kevin Röbert
a78256e52d Version 1.6.4 2019-05-07 16:18:41 +00:00
Kevin Röbert
bb516b81d8 Merge branch 'master' into 'master'
Master

See merge request KevinRoebert/ClearUrls!44
2019-05-07 16:13:38 +00:00
alekksander
a35ef95d66 Delete .gitkeep 2019-05-07 13:40:58 +00:00
alekksander
836cfc74da Delete pl 2019-05-07 13:40:29 +00:00
alekksander
4eddd4e594 Polish 2019-05-07 13:38:10 +00:00
alekksander
4670cacc7d Add new file 2019-05-07 13:37:09 +00:00
alekksander
484b52319c first Polish translation 2019-05-07 13:36:21 +00:00
alekksander
ad404ae6f7 Delete .gitkeep 2019-05-07 13:35:32 +00:00
alekksander
531ade1b05 initial Polish translation 2019-05-07 13:35:12 +00:00
Kevin Röbert
f53ea156c0 Version 1.63
+ Add redirection from #181
+ Correct links in chinese translations
+ Add edit of french translation
2019-05-06 21:07:47 +02:00
Kevin Röbert
3e2e75d38b Merge branch 'master' into 'master'
i18n: revamped French translation

See merge request KevinRoebert/ClearUrls!42
2019-05-06 18:51:53 +00:00
Hg
c9f2deab11 i18n: revamped French translation
Many translations were not accurate, did not respect punctuation, used
inappropriate words, or were complete reintepretations of the original
messages.
2019-05-05 14:41:15 +02:00
Kevin Röbert
8ca852476d Version 1.6.2
Added:
+ Added rules from #172
+ Added rules from #176
+ Added rules from #178

Fixed:
+ #170
+ #162
+ #163
2019-04-26 23:41:44 +02:00
Kevin Röbert
1d6d36eb8c Update CHANGELOG.md 2019-04-14 12:15:58 +00:00
Kevin Röbert
a8a5f7e311 Version 1.6.1 2019-04-14 12:12:58 +00:00
Kevin Röbert
929aa53aa1 Correction 2019-04-14 12:10:21 +00:00
Kevin Röbert
aa2344b4cc Update README.md 2019-04-13 16:41:55 +00:00
Kevin Röbert
7999077671 Update french translation 2019-04-13 16:37:01 +00:00
Kevin Röbert
75275bad7e Update data.min.json 2019-04-13 16:33:14 +00:00
Kevin Röbert
54d72e7865 Merge branch 'master' into 'master'
Update Chinese translations

See merge request KevinRoebert/ClearUrls!41
2019-04-12 10:22:40 +00:00
Yi-Ping Huang
61d285be99 Update Chinese translations 2019-04-12 17:29:10 +08:00
Kevin Röbert
217393ded8 Merge branch 'master' of https://gitlab.com/KevinRoebert/ClearUrls 2019-04-11 16:40:56 +02:00
Kevin Röbert
91d46a7b70 ClearURLs v.1.6
- Added listener to the browser history to prevent tracking with the [history.pushState method](https://developer.mozilla.org/en-US/docs/Web/API/History_API)
- Added webNavigation and tabs permissions, for the new feature
- Added switches in settings to enable and disable the context menu entry and the history listener
- Added tool to clean URLs, that was pasted into a textbox
- Added icon for new tool to clean URLs

- Fixed [#40](https://gitlab.com/KevinRoebert/ClearUrls/issues/40), see also https://curl.kevinroebert.de
- Fixed [#103](https://gitlab.com/KevinRoebert/ClearUrls/issues/103), see also https://curl.kevinroebert.de

- Changed clipboard-helper.js path to be absolute to prevent problems
- Changed rewrite of old GitHub links to the new data.min.json and rules.min.hash
- Config icon is now bigger and above the config label
- Update Traditional Chinese Translation by [@yipinghuang](https://gitlab.com/yipinghuang)

#161 #162 #157 #40 #103 #158
2019-04-11 16:40:48 +02:00
Kevin Röbert
ae139af5ea Merge branch 'master' into 'master'
Update Traditional Chinese Translation

See merge request KevinRoebert/ClearUrls!40
2019-04-11 14:35:42 +00:00
Yi-Ping Huang
a41deb20d8 Update Traditional Chinese Translation 2019-04-11 14:35:42 +00:00
Kevin Röbert
a76ecb17b3 Add changelog up to version 1.3.4.0 2019-04-10 21:27:21 +02:00
Kevin Röbert
dfebef07ac Add CHANGELOG 2019-04-10 18:29:32 +00:00
Kevin Röbert
1b6cc37bdd Change to old clipboard copy technique, to support chrome and older firefox versions 2019-04-10 19:08:07 +02:00
Kevin Röbert
cfd3bf5f43 It seems like, chrome doesn't like icons. 2019-04-10 18:37:55 +02:00
Kevin Röbert
a91b79aa18 Have overlooked this little hyphen :/ 2019-04-10 18:33:21 +02:00
Kevin Röbert
4fc4018859 Chrome ASCII message fix 2019-04-10 18:20:43 +02:00
Kevin Röbert
e87aa9d027 Add function to clean copied links
#157
2019-04-10 18:08:10 +02:00
Kevin Röbert
9b7dd7f9cb Update rules.hash 2019-04-08 18:07:04 +00:00
Kevin Röbert
8b8ac33ed2 New rules
#156 and #157
2019-04-08 19:00:04 +02:00
Kevin Röbert
a67abc6bc6 Revert "New rules"
This reverts commit c53a36999c
2019-04-08 16:58:44 +00:00
Kevin Röbert
c53a36999c New rules
#156 #157
2019-04-08 18:57:22 +02:00
Kevin Röbert
1caeeb29ab Update README.md 2019-04-08 07:59:05 +00:00
Kevin Röbert
0a948968b3 Add png icons to support googles webextension api 2019-04-08 09:52:23 +02:00
Kevin Röbert
304cbe2e6b remove tab permission
The tab permission is not required for all methods on the tabs api
2019-04-03 20:21:31 +02:00
Kevin Röbert
ed61dbdbaf Update README.md 2019-04-03 11:29:09 +00:00
Kevin Röbert
2d1d81810e New rules new hash 2019-04-03 13:27:54 +02:00
Kevin Röbert
c9f3b3610d Add rule from @walterl to data.json 2019-04-03 13:26:36 +02:00
Kevin Röbert
932511fbf8 Merge branch 'redirect-amo-outgoing' into 'master'
Add redirect for addons.mozilla.org outgoing links

See merge request KevinRoebert/ClearUrls!39
2019-04-03 11:22:40 +00:00
Walter Leibbrandt
28af5a8630 Add redirect for addons.mozilla.org outgoing links 2019-04-02 23:07:01 +02:00
Kevin Röbert
36300bf1c9 CI generates the chrome version 2019-04-02 00:16:32 +02:00
Kevin Röbert
4f86852312 Update ci for chrome support 2019-04-01 23:53:49 +02:00
Kevin Röbert
03e0580b20 Chrome support 2019-04-01 23:53:28 +02:00
Kevin Röbert
869cd63e64 Fix #153
Implementing the flat function by my own, also a function that removes empty fields from arrays.
2019-03-27 18:31:37 +01:00
Kevin Röbert
f69ae79adb Update README.md 2019-03-21 17:16:43 +00:00
Kevin Röbert
cd6bb5d6f5 new rules new hash 2019-03-21 17:58:57 +01:00
Kevin Röbert
f02d36c6a7 #119
I hope the redirection works
2019-03-21 17:50:16 +01:00
Kevin Röbert
f46daa7205 New rules new hash 2019-03-19 16:21:03 +01:00
Kevin Röbert
cc358744f2 #151 without id 2019-03-19 16:13:24 +01:00
Kevin Röbert
df4e461102 Merge branch 'master' of https://gitlab.com/KevinRoebert/ClearUrls 2019-03-19 15:56:06 +01:00
Kevin Röbert
9a6adad225 Disqus redirection #151 2019-03-19 15:55:54 +01:00
Kevin Röbert
1e15c8a265 Update README.md 2019-03-18 21:09:58 +00:00
Kevin Röbert
d87d88250d Fix #31
+ Bugfix for Android devices
2019-03-18 17:39:47 +01:00
Kevin Röbert
1175d0ff9d New rules new hash 2019-03-16 13:30:30 +01:00
Kevin Röbert
bfabe4ca98 Add facebook redirection #150 2019-03-16 13:29:23 +01:00
Kevin Röbert
80af6f6fea Better performance + "unlimitedStorage" permission
+ Changed the regex interpretation for better performance.
+ Also asked for "unlimitedStorage" permission to have enough space for user generated rules.
2019-03-14 17:59:16 +01:00
Kevin Röbert
43a510efe7 Merge branch 'master' of https://gitlab.com/KevinRoebert/ClearUrls 2019-03-13 13:21:05 +01:00
Kevin Röbert
2a158f6dd7 Update license 2019-03-13 12:20:35 +00:00
Kevin Röbert
8f70a49bb2 Merge branch 'master' of https://gitlab.com/KevinRoebert/ClearUrls 2019-03-13 13:20:28 +01:00
Kevin Röbert
6b2e79669c Add license header 2019-03-13 13:20:24 +01:00
Kevin Röbert
8231ade8a3 Change of LICENSE to GNU LGPLv3. This change is granted by the old license (QaPL v0.2 sec. [4]) without the permission of the contributors.
The reason for the change are some requests about using code from ClearURLs in other project, e.g. an iOS App and an application to route URLs to configured browsers. The old license is not so friendly to use ClearURLs in other projects. Also I think ClearURLs should be a real free software.

All new versions are licensed under the GNU LGPLv3. For all old versions: As the Original Copyright Holder I hereby grant a dual-licensed, under QaPL v0.2 and GNU LGPLv3, for all version of ClearURLs older or equal to version 1.5a.
2019-03-13 11:58:04 +00:00
Kevin Röbert
239ee17697 Deleted LICENSE.md 2019-03-13 11:32:24 +00:00
Kevin Röbert
805ef75f7f Merge branch 'storage-improvement' into 'master'
Storage improvement

See merge request KevinRoebert/ClearUrls!38
2019-03-12 17:50:32 +00:00
Kevin Röbert
4367f13f03 New version
Please test the new version :D
2019-03-12 18:48:14 +01:00
Kevin Röbert
b9931f0d63 tld
Another try. The brackets were missing.
2019-03-12 18:27:19 +01:00
Kevin Röbert
b87eaa4eea hash fix ^^" 2019-03-12 18:25:22 +01:00
Kevin Röbert
9c638c52f9 Preparations for costume rules
+ Preparations for costume rules
- Feature "Report URLs"
+ Auto hash rules
+ Minimize rules length
+ Add start and end delimiters to rules
2019-03-12 18:13:23 +01:00
Kevin Röbert
3480dd71c5 New rules new hash 2019-02-25 22:31:03 +01:00
Kevin Röbert
110fd19a07 #137 add steam rule 2019-02-25 22:30:01 +01:00
Kevin Röbert
3cc2d6d1a8 New rules new hash 2019-02-25 13:45:17 +01:00
Kevin Röbert
18cc61de0b #135 Google reCAPTCHA 2019-02-25 13:41:59 +01:00
Kevin Röbert
6395335428 New rules new hash 2019-02-23 17:13:37 +01:00
Kevin Röbert
f2034a9b7e Exception for tv2.no #125 2019-02-23 17:12:36 +01:00
Kevin Röbert
15ad222706 New rules new hash 2019-02-20 17:34:52 +01:00
Kevin Röbert
688026c408 Merge branch 'patch-1' into 'master'
Update TechCrunch rules due acquisition by Oath.com

See merge request KevinRoebert/ClearUrls!37
2019-02-20 16:32:09 +00:00
Katrin Leinweber
8884674e36 Update TechCrunch rules due acquisition by Oath.com 2019-02-19 20:46:47 +00:00
Kevin Röbert
81bc71de5e storage improvement
The command pattern has been implemented so that ClearURLs also works in private mode.
See also: https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/sendMessage
2019-02-13 18:02:08 +01:00
Kevin Röbert
03cdcbb38a Update README.md 2019-02-13 00:09:23 +00:00
Kevin Röbert
078b51de98 Update README.md 2019-02-13 00:02:03 +00:00
Kevin Röbert
c39ead0a6d Update .gitlab-ci.yml 2019-02-12 23:56:48 +00:00
Kevin Röbert
a57591cd0b Update .gitlab-ci.yml 2019-02-12 23:52:52 +00:00
Kevin Röbert
8bee5b99f1 Update .gitlab-ci.yml 2019-02-12 23:48:11 +00:00
Kevin Röbert
4321771762 Update .gitlab-ci.yml 2019-02-12 23:46:14 +00:00
Kevin Röbert
32b525363a Update .gitlab-ci.yml 2019-02-12 23:38:39 +00:00
Kevin Röbert
c6f66ec646 Update .gitlab-ci.yml 2019-02-12 23:33:40 +00:00
Kevin Röbert
f139e628ab Test auto build: .gitlab-ci.yml 2019-02-12 23:30:36 +00:00
Kevin Röbert
23e7fa4064 Merge branch 'patch-1' into 'master'
Update Ukrainian messages.json

See merge request KevinRoebert/ClearUrls!36
2019-02-01 16:56:36 +00:00
Artem Polivanchuk
99ba98f909 Update Ukrainian messages.json 2019-02-01 09:26:54 +00:00
Kevin Röbert
126dc02e07 New rules new hash 2018-12-04 10:39:09 +01:00
Kevin Röbert
a8334e60fa #123 Google Drive exception 2018-12-04 10:37:36 +01:00
Kevin Röbert
0b3b1f7498 Update README.md 2018-11-24 00:15:10 +00:00
Kevin Röbert
3fae440364 New screenshot 2018-11-24 01:13:05 +01:00
Kevin Röbert
6b9f9a5ca1 New rules new hash 2018-11-24 00:49:13 +01:00
Kevin Röbert
2266cbb434 Merge branch 'patch-1' into 'master'
Add new Facebook's fbclid

See merge request KevinRoebert/ClearUrls!35
2018-11-23 23:47:17 +00:00
K3A
11abcf9783 add new fbclid https://www.reddit.com/r/analytics/comments/9o52yw/parameter_called_fbclid_appearing_in_referrals/ 2018-11-22 15:12:33 +00:00
Kevin Röbert
d2d4b25f0b New rules new hash 2018-10-20 16:19:29 +02:00
Kevin Röbert
57de51eb53 Bugfix for #115
I hope this fix the bug :D
2018-10-20 16:18:38 +02:00
Kevin Röbert
ca6d0e037d New rules new hash 2018-10-08 17:10:35 +02:00
Kevin Röbert
f3c86db0b9 New rules 2018-10-08 17:09:18 +02:00
106 changed files with 19149 additions and 3916 deletions

20
.gitignore vendored Normal file
View File

@@ -0,0 +1,20 @@
# See https://help.github.com/ignore-files/ for more about ignoring files.
# dependencies
/node_modules
# testing
/coverage
# production
/build
# misc
.DS_Store
.env
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# WebStorm
.idea/

66
.gitlab-ci.yml Normal file
View File

@@ -0,0 +1,66 @@
image: debian:latest
before_script:
- export DEBIAN_FRONTEND= noninteractive
- apt-get update -y
- apt-get install -y zip unzip jq nodejs
stages:
- build
- deploy
hash rules:
stage: build
script:
- sha256sum data/data.min.json | awk '{print $1}' > rules.min.hash
- node build_tools/minifyDataJSON.js "data/data.min.json" "data.minify.json"
- sha256sum data.minify.json | awk '{print $1}' > rules.minify.hash
artifacts:
paths:
- rules.min.hash
- data.minify.json
- rules.minify.hash
only:
- master
build firefox:
stage: build
script:
- zip ClearUrls_firefox -r -FS clearurls.js browser-polyfill.js manifest.json img/* external_js/* html/* core_js/* css/* fonts/* _locales/*
only:
- master
artifacts:
paths:
- ClearUrls_firefox.zip
build chrome:
stage: build
script:
- jq 'del(.applications) | .description=""' manifest.json > manifest.json.tmp && mv manifest.json.tmp manifest.json
- zip ClearUrls_chrome -r -FS clearurls.js browser-polyfill.js manifest.json img/* external_js/* html/* core_js/* css/* fonts/* _locales/*
only:
- master
artifacts:
paths:
- ClearUrls_chrome.zip
pages:
stage: deploy
script:
- mkdir public
- mkdir public/data
- mv GitLabPages/* public/
- cp img/clearurls.svg public/clearurls.svg
- cp data/data.min.json public/data/data.min.json
- sha256sum public/data/data.min.json | awk '{print $1}' > public/data/rules.min.hash
- node build_tools/minifyDataJSON.js "public/data/data.min.json" "public/data/data.minify.json"
- sha256sum public/data/data.minify.json | awk '{print $1}' > public/data/rules.minify.hash
artifacts:
paths:
- public
only:
- master

View File

@@ -39,18 +39,5 @@ You do not have to reinstall Firefox or disable all addons. You can just create
* **Country**: [The country from which you called the page. You can found your country here: http://ip-api.com/json/?fields=country]
### Log
<!-- Please enable the log functionality of ClearURLs and copy your log into this table. -->
<!-- Or if the log is to long, save the html file (press ctrl+s) and attach to this issue the `Log from ClearURLs.html` file -->
| Before processing | After processing | Rule | Time |
|-------------------|------------------|------|------|
| | | | |
<!-- If you attach the html file, please copy into the ``` area -->
```
```
<!-- Please enable the log functionality of ClearURLs and attach the exported log to this bug report. -->
<!-- Here you can find a step by step tutorial "How to enable logging in ClearURLs": https://www.youtube-nocookie.com/embed/Rm1YkwXQDSM -->

497
CHANGELOG.md Normal file
View File

@@ -0,0 +1,497 @@
# Changelog
All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [1.13.0] - 2020-02-01
### Compatibility note
- Require Firefox >= 55
- Require Chrome >= 22
### Changed
- Updated some strings of French translation by lucifer
## [1.12.0] - 2020-01-29
### Compatibility note
- Require Firefox >= 55
- Require Chrome >= 22
### Changed
- Updated Russian translation by elfriob
- Updated Spanish translation by [@socram](https://gitlab.com/socram)
## [1.11.0] - 2020-01-06
### Compatibility note
- Require Firefox >= 55
- Require Chrome >= 22
### Added
- Added hyperlink auditing blocking [#184](https://gitlab.com/KevinRoebert/ClearUrls/issues/184)
- Added yandex link fix script, to avoid URL tracking [#305](https://gitlab.com/KevinRoebert/ClearUrls/issues/305)
## [1.10.0] - 2020-01-03
### Compatibility note
- Require Firefox >= 55
- Require Chrome >= 22
### Changed
- Updated to Bootstrap 4.3.1
- Updated to jQuery 3.4.1
- Updated to DataTables 1.10.20
- Deleted unnecessary Bootstrap Dialog lib
- Replaced [pick-a-color](https://github.com/lauren/pick-a-color) with [bootstrap-colorpicker 3.2.0](https://github.com/itsjavi/bootstrap-colorpicker)
- Minor corrections on english translation by [@Sopor](https://gitlab.com/Sopor)
- Replaced glyphicons with [fontawesome 5.12.0](https://github.com/FortAwesome/Font-Awesome/tree/5.12.0)
### Added
- Added [popper.js 1.16.0](https://github.com/popperjs/popper.js/tree/v1.16.0)
- Added Swedish translation by [@Sopor](https://gitlab.com/Sopor)
### Fixed
- Fixed [#338](https://gitlab.com/KevinRoebert/ClearUrls/issues/338)
- Fixed [#333](https://gitlab.com/KevinRoebert/ClearUrls/issues/333)
- Fixed [#332](https://gitlab.com/KevinRoebert/ClearUrls/issues/332)
- Fixed [#307](https://gitlab.com/KevinRoebert/ClearUrls/issues/307)
- Maybe [#315](https://gitlab.com/KevinRoebert/ClearUrls/issues/315) fixed
## [1.9.5] - 2019-12-17
### Compatibility note
- Require Firefox >= 55
- Require Chrome >= 22
### Added
- Added Turkish translation by Ulaş Çakmak
### Changed
- Updated some strings of French translation by lucifer
### Fixed
- Fixed problem with default RegExp
## [1.9.4] - 2019-11-24
### Compatibility note
- Require Firefox >= 55
- Require Chrome >= 22
### Fixed
- Fixed toolbar icon on startup [#102](https://gitlab.com/KevinRoebert/ClearUrls/issues/102)
### Added
- Added option to disable/allow domain blocking [#294](https://gitlab.com/KevinRoebert/ClearUrls/issues/294)
### Changed
- Some refactoring
## [1.9.3.1] - 2019-11-15
### Compatibility note
- Require Firefox >= 55
- Require Chrome >= 22
### Changed
- Changed data and hash URL to GitLab Pages, to prevent hitting the GitLab infrastructure directly [#295](https://gitlab.com/KevinRoebert/ClearUrls/issues/295#note_245456134).
## [1.9.3] - 2019-11-15
### Compatibility note
- Require Firefox >= 55
- Require Chrome >= 22
### Fixed
- Fixed wrong initial rules URL
## [1.9.2] - 2019-11-09
### Compatibility note
- Require Firefox >= 55
- Require Chrome >= 22
### Fixed
- Fixed [#290](https://gitlab.com/KevinRoebert/ClearUrls/issues/290)
### Changed
- Updated some strings of Italian translation by [@gioxx](https://gitlab.com/gioxx)
### Added
- Added a minimal version of the data.min.json file where all line breaks and spaces, as well as default values and empty lists are removed.
## [1.9.1] - 2019-10-24
### Compatibility note
- Require Firefox >= 55
- Require Chrome >= 22
### Fixed
- Fixed badged in quiet mode
### Added
- Added Italian translation by [@gioxx](https://gitlab.com/gioxx)
## [1.9.0] - 2019-10-22
### Compatibility note
- Require Firefox >= 55
- Require Chrome >= 22
### Fixed
- Fixed bug in "history tracking injection protection". This option was not disabled, when the global filter switch are on off
- Fixed [#241](https://gitlab.com/KevinRoebert/ClearUrls/issues/241)
- Possible fix for [#203](https://gitlab.com/KevinRoebert/ClearUrls/issues/203)
### Changed
- Refactoring
- Changed background script loading sequence to prevent that required functions are not yet loaded.
### Added
- Added an option to im-/export the log (requires the `downloads` permission)
- Added an option to im-/export the settings (requires the `downloads` permission)
- Added information page for blocked sites, when they are called in the `main_frame`
- Added option to allow referral marketing ([#284](https://gitlab.com/KevinRoebert/ClearUrls/issues/284))
- Added "multiple times URL encodes" recognition
- Added an option to limit the log entries ([#56](https://gitlab.com/KevinRoebert/ClearUrls/issues/56))
## [1.8.5] - 2019-09-29
### Compatibility note
- Require Firefox >= 55
- Require Chrome >= 22
### Fixed
- Fixed [#264](https://gitlab.com/KevinRoebert/ClearUrls/issues/264)
- Fixed [#262](https://gitlab.com/KevinRoebert/ClearUrls/issues/262)
- Fixed [#267](https://gitlab.com/KevinRoebert/ClearUrls/issues/267)
## [1.8.4] - 2019-09-26
### Compatibility note
- Require Firefox >= 55
- Require Chrome >= 22
### Changed
- Force redirects only on main frames
- Added google link fix script, to avoid the sub frame permission for force redirection on google
## [1.8.3] - 2019-09-23
### Compatibility note
- Require Firefox >= 55
- Require Chrome >= 22
### Fixed
- Fixed OR case
## [1.8.2] - 2019-09-23
### Compatibility note
- Require Firefox >= 55
- Require Chrome >= 22
### Changed
- Only redirects, if request is of type main or sub frame to prevent security issues on automatically loaded ressource like images
### Fixed
- Fixed [#253](https://gitlab.com/KevinRoebert/ClearUrls/issues/253)
- Fixed [#254](https://gitlab.com/KevinRoebert/ClearUrls/issues/254)
## [1.8.1] - 2019-09-12
### Compatibility note
- Require Firefox >= 55
- Require Chrome >= 22
### Changed
- Improvements on check for android systems ([#206](https://gitlab.com/KevinRoebert/ClearUrls/issues/206))
- Improvements on storage. Away with periodic save of in-memory data to storage. Instead save when there are actual changes by [@tartpvule](https://gitlab.com/tartpvule) in ([!47](https://gitlab.com/KevinRoebert/ClearUrls/merge_requests/47))
## [1.8.0] - 2019-09-11
### Compatibility note
- Require Firefox >= 55
- Require Chrome >= 22
### Added
- Added default option to skip URLs with a host in a local range
### Fixed
- Fixed [#238](https://gitlab.com/KevinRoebert/ClearUrls/issues/238)
- Fixed wrong count on cleaning tool (forgot to count also the total amount of elements at cleaning tool)
### Changed
- Improvements on check for android systems ([#206](https://gitlab.com/KevinRoebert/ClearUrls/issues/206))
## [1.7.4] - 2019-09-06
### Compatibility note
- Require Firefox >= 55
- Require Chrome >= 22
### Added
- Added Hungarian translations by [@ztoldy2](https://gitlab.com/ztoldy2)
## [1.7.3] - 2019-08-07
### Compatibility note
- Require Firefox >= 55
- Require Chrome >= 22
### Changed
- Updated Brazilian Portuguese translation by Ramon S.
## [1.7.2] - 2019-08-07
### Compatibility note
- Require Firefox >= 55
- Require Chrome >= 22
### Changed
- Updated japanese translation by [@Shitennouji](https://gitlab.com/Shitennouji)
## [1.7.1] - 2019-08-04
### Compatibility note
- Require Firefox >= 55
- Require Chrome >= 22
### Added
- Added new setting to data.min.json to set if redirects should be enforced via a "tabs.update" ([#221](https://gitlab.com/KevinRoebert/ClearUrls/issues/221))
- Added [#220](https://gitlab.com/KevinRoebert/ClearUrls/issues/220)
- Added [#218](https://gitlab.com/KevinRoebert/ClearUrls/issues/218)
### Fixed
- Fixed YouTube ad redirection bug ([#221](https://gitlab.com/KevinRoebert/ClearUrls/issues/221))
- Fixed [#217](https://gitlab.com/KevinRoebert/ClearUrls/issues/217)
## [1.7.0] - 2019-07-30
### Compatibility note
- Require Firefox >= 55
- Require Chrome >= 22
### Added
- Added support for raw rules to cleaning also parts from URL-path
### Fixed
- Fixed misspelling in german translation
## [1.6.9] - 2019-07-29
### Compatibility note
- Require Firefox >= 55
- Require Chrome >= 22
### Fixed
- Fixed error in fields RegExp
## [1.6.8] - 2019-07-28
### Compatibility note
- Require Firefox >= 55
- Require Chrome >= 22
### Changed
- Improvements on check for android systems ([#206](https://gitlab.com/KevinRoebert/ClearUrls/issues/206))
### Fixed
- [#205](https://gitlab.com/KevinRoebert/ClearUrls/issues/205)
## [1.6.7] - 2019-07-25
### Compatibility note
- Require Firefox >= 55
- Require Chrome >= 22
### Fixed
- [#175](https://gitlab.com/KevinRoebert/ClearUrls/issues/175) by [@yukulele](https://gitlab.com/yukulele)
- [#196](https://gitlab.com/KevinRoebert/ClearUrls/issues/196)
- [#204](https://gitlab.com/KevinRoebert/ClearUrls/issues/204)
## [1.6.6] - 2019-06-14
### Compatibility note
- Require Firefox >= 55
- Require Chrome >= 22
### Fixed
- [#171](https://gitlab.com/KevinRoebert/ClearUrls/issues/171)
- [#195](https://gitlab.com/KevinRoebert/ClearUrls/issues/195)
## [1.6.5] - 2019-06-12
### Compatibility note
- Require Firefox >= 55
- Require Chrome >= 22
### Added
- Added support for fragment cleaning
### Fixed
- [#171](https://gitlab.com/KevinRoebert/ClearUrls/issues/171)
- [#191](https://gitlab.com/KevinRoebert/ClearUrls/issues/191)
- [#192](https://gitlab.com/KevinRoebert/ClearUrls/issues/192)
- [#193](https://gitlab.com/KevinRoebert/ClearUrls/issues/193)
- [#194](https://gitlab.com/KevinRoebert/ClearUrls/issues/194)
## [1.6.4] - 2019-05-07
### Compatibility note
- Require Firefox >= 55
- Require Chrome >= 22
### Added
- Added Polish translation by [@alekksander](https://gitlab.com/alekksander)
## [1.6.3] - 2019-05-06
### Compatibility note
- Require Firefox >= 55
- Require Chrome >= 22
### Added
- Added redirection from [#181](https://gitlab.com/KevinRoebert/ClearUrls/issues/181)
### Changed
- Update french translation by [@hydrargyrum](https://gitlab.com/hydrargyrum)
- Update chinese translation
## [1.6.2] - 2019-04-26
### Compatibility note
- Require Firefox >= 55
- Require Chrome >= 22
### Added
- Added rules from [#172](https://gitlab.com/KevinRoebert/ClearUrls/issues/172)
- Added rules from [#176](https://gitlab.com/KevinRoebert/ClearUrls/issues/176)
- Added rules from [#178](https://gitlab.com/KevinRoebert/ClearUrls/issues/178)
### Fixed
- [#170](https://gitlab.com/KevinRoebert/ClearUrls/issues/170)
- [#162](https://gitlab.com/KevinRoebert/ClearUrls/issues/162)
- [#163](https://gitlab.com/KevinRoebert/ClearUrls/issues/163)
## [[1.6.1] - 2019-04-14](https://gitlab.com/KevinRoebert/ClearUrls/commit/a8a5f7e311300ae7f186d4b581e805bdf3f9f5d9)
### Compatibility note
- Require Firefox >= 55
- Require Chrome >= 22
### Changed
- Chinese translations by [@yipinghuang](https://gitlab.com/yipinghuang)
- French translations
## [1.6] - 2019-04-11
### Compatibility note
- Require Firefox >= 55
- Require Chrome >= 28
### Added
- Added listener to the browser history to prevent tracking with the [history.pushState method](https://developer.mozilla.org/en-US/docs/Web/API/History_API)
- Added webNavigation and tabs permissions, for the new feature
- Added switches in settings to enable and disable the context menu entry and the history listener
- Added tool to clean URLs, that was pasted into a textbox
- Added icon for new tool to clean URLs
### Fixed
- [#40](https://gitlab.com/KevinRoebert/ClearUrls/issues/40), see also https://curl.kevinroebert.de
- [#103](https://gitlab.com/KevinRoebert/ClearUrls/issues/103), see also https://curl.kevinroebert.de
### Changed
- Changed clipboard-helper.js path to be absolute to prevent problems
- Changed rewrite of old GitHub links to the new data.min.json and rules.min.hash
- Config icon is now bigger and above the config label
- Update Traditional Chinese Translation by [@yipinghuang](https://gitlab.com/yipinghuang)
## [[1.5.8] - 2019-04-10](https://gitlab.com/KevinRoebert/ClearUrls/commit/1b6cc37bdd23011d006bf7ef6824463e7c96067a)
### Compatibility note
- Require Firefox >= 55
- Require Chrome >= 28
### Added
- Added context menu entry, to clean and copy links into clipboard
## [[1.5.4] - 2019-04-08](https://gitlab.com/KevinRoebert/ClearUrls/commit/0a948968b309f418ec4175dd23fedb0b88c97086)
### Fixed
- Changed icon format from svg into png to support Chrome
## [[1.5.3] - 2019-04-03](https://gitlab.com/KevinRoebert/ClearUrls/commit/304cbe2e6bf3756f4bcb675ec4b8b7403158ea5c)
### Removed
- Removed the *tab permission*, because it is not required for all used methods on the tabs api
## [[1.5.2] - 2019-04-01](https://gitlab.com/KevinRoebert/ClearUrls/commit/03e0580b202fc0a77f442f284dd5470cddbbd5c0)
### Added
- Added new screenshots of the ClearURLs popup
### Changed
- Replaced *webextension-polyfill* v.0.3.1 with the new version v0.4.0
- Updated the Chrome version of ClearURLs to the newest version
- Changed ClearURLs to support both Firefox and Chrome, without generating every time to different source codes
- Changed the GitLab-CI to build the Chrome version automatically from the Firefox version
- Replaced the old screenshots in the README with new ones
### Removed
- Removed the old ClearURLs Chrome version
## [[1.5.1.6a] - 2019-03-27](https://gitlab.com/KevinRoebert/ClearUrls/commit/869cd63e645e2cacaf26017366fa4eaa3fb97411)
### Fixed
- Added own flat function and a function that removes empty fields from arrays to support Waterfox
## [[1.5.1.5a] - 2019-03-18](https://gitlab.com/KevinRoebert/ClearUrls/commit/d87d88250dccd07570c10b37f41054ed44a0ee97)
### Fixed
- Bugfix to support Android devices again
## [[1.5.1a] - 2019-03-14](https://gitlab.com/KevinRoebert/ClearUrls/commit/80af6f6feac086490f841adad5fe769d71be86f8)
### Added
- Added *unlimitedStorage* permissions to prevent storage restrictions (which will come in future versions of firefox) and to have enough space for user generated rules
### Changed
- Changed the regex interpretation for better performance
## [[1.5a] - 2019-03-14](https://gitlab.com/KevinRoebert/ClearUrls/commit/80af6f6feac086490f841adad5fe769d71be86f8)
### Added
- New rules file *data.min.json* that is a minimized version of the old one
- New technique to get data from the local storage
- The command pattern has been implemented so that ClearURLs also works in private mode
- Automatically generating hash for *data.min.json* file with GitLab-CI
- Add start and end delimiters to rules
- Preparations for costume rules
### Changed
- Storage improvements, better performance
- Splitted core file into multiple pieces for better overview
- Minimize rules length
### Fixed
- [#124](https://gitlab.com/KevinRoebert/ClearUrls/issues/124)
### Removed
- Warning in private mode (no longer necessary)
- Removed *Report URL* function
## [[1.3.4.2] - 2019-02-01](https://gitlab.com/KevinRoebert/ClearUrls/commit/23e7fa406436c40c561c1e0108c5e9c8c7e9e0d8)
### Changed
- Updated Ukrainian translation from [@a-polivanchuk](https://gitlab.com/a-polivanchuk)
## [[1.3.4.0] - 2018-10-08](https://gitlab.com/KevinRoebert/ClearUrls/commit/06b84d749084997e3d759ebd916772b446adfe9c)
## Added
- Added more request types, as proposed in [#106](https://gitlab.com/KevinRoebert/ClearUrls/issues/106)
## Updated
- Updated french translation

View File

@@ -1,892 +0,0 @@
/*
* ##################################################################
* # Fetch Rules & Exception from URL #
* ##################################################################
*/
var providers = [];
var prvKeys = [];
var badges = [];
var tabid = 0;
var siteBlockedAlert = 'javascript:void(0)';
var dataHash;
var localDataHash;
var os;
var currentURL;
var storage = [];
getDataFromDisk();
function start(items)
{
initStorage(items);
/**
* Save OS Version
*/
chrome.runtime.getPlatformInfo(function(info) {
os = info.os;
/**
* Initialize the JSON provider object keys.
*
* @param {JSON Object} obj
*/
function getKeys(obj){
for(var key in obj){
prvKeys.push(key);
}
}
/**
* Initialize the providers form the JSON object.
*
*/
function createProviders()
{
data = storage.ClearURLsData;
for(var p = 0; p < prvKeys.length; p++)
{
//Create new provider
providers.push(new Provider(prvKeys[p],data.providers[prvKeys[p]].completeProvider));
//Add URL Pattern
providers[p].setURLPattern(data.providers[prvKeys[p]].urlPattern);
//Add rules to provider
for(var r = 0; r < data.providers[prvKeys[p]].rules.length; r++)
{
providers[p].addRule(data.providers[prvKeys[p]].rules[r]);
}
//Add exceptions to provider
for(var e = 0; e < data.providers[prvKeys[p]].exceptions.length; e++)
{
providers[p].addException(data.providers[prvKeys[p]].exceptions[e]);
}
//Add redirections to provider
for(var re = 0; re < data.providers[prvKeys[p]].redirections.length; re++)
{
providers[p].addRedirection(data.providers[prvKeys[p]].redirections[re]);
}
}
}
/**
* Convert the external data to Objects and
* call the create provider function.
*
* @param {String} retrievedText - pure data form github
*/
function toObject(retrievedText) {
getKeys(storage.ClearURLsData.providers);
createProviders();
}
/**
* Load local saved data, if the browser is offline or
* some other network trouble.
*/
function loadOldDataFromStore()
{
localDataHash = storage.dataHash;
}
/**
* Save the hash status to the local storage.
* The status can have the following values:
* 1 "up to date"
* 2 "updated"
* 3 "update available"
* @param status_code the number for the status
*/
function storeHashStatus(status_code)
{
switch(status_code)
{
case 1: status_code = "hash_status_code_1";
break;
case 2: status_code = "hash_status_code_2";
break;
case 3: status_code = "hash_status_code_3";
break;
default: status_code = "hash_status_code_4";
}
storage.hashStatus = status_code;
}
/**
* Get the hash for the rule file on github.
* Check the hash with the hash form the local file.
* If the hash has changed, then download the new rule file.
* Else do nothing.
*/
function getHash()
{
//Get the target hash from github
fetch(storage.hashURL)
.then(function(response){
var responseTextHash = response.clone().text().then(function(responseTextHash){
if(response.ok)
{
dataHash = responseTextHash;
if($.trim(dataHash) !== $.trim(localDataHash))
{
fetchFromURL();
}
else {
toObject(storage.ClearURLsData);
storeHashStatus(1);
}
}
else {
dataHash = false;
}
});
});
}
/**
* Fetch the Rules & Exception from github.
*/
function fetchFromURL()
{
fetch(storage.ruleURL)
.then(checkResponse);
function checkResponse(response)
{
var responseText = response.clone().text().then(function(responseText){
if(response.ok)
{
var downloadedFileHash = $.sha256(responseText);
if($.trim(downloadedFileHash) === $.trim(dataHash))
{
storage.ClearURLsData = responseText;
storage.dataHash = downloadedFileHash;
storeHashStatus(2);
}
else {
storeHashStatus(3);
}
storage.ClearURLsData = JSON.parse(storage.ClearURLsData);
toObject(storage.ClearURLsData);
}
});
}
}
// ##################################################################
/*
* ##################################################################
* # Supertyp Provider #
* ##################################################################
*/
/**
* Declare constructor
*
* @param {String} _name Provider name
* @param {boolean} completeProvider Set URL Pattern as rule
*/
function Provider(_name,_completeProvider = false){
var name = _name;
var urlPattern;
var rules = [];
var exceptions = [];
var canceling = _completeProvider;
var redirections = [];
if(_completeProvider){
rules.push(".*");
}
/**
* Returns the provider name.
* @return {String}
*/
this.getName = function() {
return name;
};
/**
* Add URL pattern.
*
* @require urlPatterns as RegExp
*/
this.setURLPattern = function(urlPatterns) {
urlPattern = new RegExp(urlPatterns, "i");
};
/**
* Return if the Provider Request is canceled
* @return {Boolean} isCanceled
*/
this.isCaneling = function() {
return canceling;
};
/**
* Check the url is matching the ProviderURL.
*
* @return {boolean} ProviderURL as RegExp
*/
this.matchURL = function(url) {
return !(this.matchException(url)) && urlPattern.test(url);
};
/**
* Add a rule to the rule array.
*
* @param String rule RegExp as string
*/
this.addRule = function(rule) {
rules.push(rule);
};
/**
* Return all rules as an array.
*
* @return Array RegExp strings
*/
this.getRules = function() {
return rules;
};
/**
* Add a exception to the exceptions array.
*
* @param String exception RegExp as string
*/
this.addException = function(exception) {
exceptions.push(exception);
};
/**
* Private helper method to check if the url
* an exception.
*
* @param {String} url RegExp as string
* @return {boolean} if matching? true: false
*/
this.matchException = function(url) {
var result = false;
//Add the site blocked alert to every exception
if(url == siteBlockedAlert) return true;
for (var i = 0; i < exceptions.length; i++) {
if(result) { break; }
exception_regex = new RegExp(exceptions[i], "i");
result = exception_regex.test(url);
}
return result;
};
/**
* Add a redirection to the redirections array.
*
* @param String redirection RegExp as string
*/
this.addRedirection = function(redirection) {
redirections.push(redirection);
};
/**
* Return all redirection.
*
* @return url
*/
this.getRedirection = function(url) {
var re = null;
for(var i = 0; i < redirections.length; i++)
{
result = (url.match(new RegExp(redirections[i], "i")));
if (result && result.length > 0)
{
re = (new RegExp(redirections[i], "i")).exec(url)[1];
break;
}
}
return re;
};
}
// ##################################################################
/**
* Helper function which remove the tracking fields
* for each provider given as parameter.
*
* @param {Provider} provider Provider-Object
* @param {webRequest} request webRequest-Object
* @return {Array} Array with changes and url fields
*/
function removeFieldsFormURL(provider, request)
{
var url = request.url;
var domain = url.replace(new RegExp("\\?.*", "i"), "");
var fields = "";
var rules = provider.getRules();
var changes = false;
var cancel = false;
/*
* Expand the url by provider redirections. So no tracking on
* url redirections form sites to sites.
*/
var re = provider.getRedirection(url);
if(re !== null)
{
url = decodeURIComponent(re);
//Log the action
pushToLog(request.url, re, translate('log_redirect'));
return {
"redirect": true,
"url": url
};
}
/**
* Only test for matches, if there are fields that can be cleaned.
*/
if(existsFields(url))
{
/**
* It must be non-greedy, because by default .* will match
* all ? chars. So the replace function delete everything
* before the last ?. With adding a ? on the quantifier *,
* we fixed this problem.
*/
fields = url.replace(new RegExp(".*?\\?", "i"), "");
for (var i = 0; i < rules.length; i++) {
var beforReplace = fields;
fields = fields.replace(new RegExp(rules[i], "i"), "");
if(beforReplace != fields)
{
//Log the action
pushToLog(domain+"?"+beforReplace, domain+"?"+fields, rules[i]);
if(badges[tabid] == null)
{
badges[tabid] = 0;
}
increaseURLCounter();
if(!checkOSAndroid())
{
if(storage.badgedStatus) {
browser.browserAction.setBadgeText({text: (++badges[tabid]).toString(), tabId: tabid});
}
else
{
browser.browserAction.setBadgeText({text: "", tabId: tabid});
}
}
changes = true;
}
}
url = domain+"?"+fields;
}
else {
if(domain != url)
{
url = domain;
changes = true;
}
}
if(provider.isCaneling()){
pushToLog(request.url, request.url, translate('log_domain_blocked'));
if(badges[tabid] == null)
{
badges[tabid] = 0;
}
increaseURLCounter();
if(!checkOSAndroid())
{
if(storage.badgedStatus) {
browser.browserAction.setBadgeText({text: (++badges[tabid]).toString(), tabId: tabid});
}
else
{
browser.browserAction.setBadgeText({text: "", tabId: tabid});
}
}
cancel = true;
}
return {
"changes": changes,
"url": url,
"cancel": cancel
};
}
/**
* Return the number of parameters query strings.
* @param {String} url URL as String
* @return {int} Number of Parameters
*/
function countFields(url)
{
var matches = (url.match(/[^\/|\?|&]+=[^\/|\?|&]+/gi) || []);
var count = matches.length;
return count;
}
/**
* Returns true if fields exists.
* @param {String} url URL as String
* @return {boolean}
*/
function existsFields(url)
{
var matches = (url.match(/\?.+/i) || []);
var count = matches.length;
return (count > 0);
}
/**
* Function which called from the webRequest to
* remove the tracking fields from the url.
*
* @param {webRequest} request webRequest-Object
* @return {Array} redirectUrl or none
*/
function clearUrl(request)
{
var URLbeforeReplaceCount = countFields(request.url);
//Add Fields form Request to global url counter
increaseGlobalURLCounter(URLbeforeReplaceCount);
if(storage.globalStatus){
var result = {
"changes": false,
"url": "",
"redirect": false,
"cancel": false
};
/*
* Call for every provider the removeFieldsFormURL method.
*/
for (var i = 0; i < providers.length; i++) {
if(providers[i].matchURL(request.url))
{
result = removeFieldsFormURL(providers[i], request);
}
/*
* Expand urls and bypass tracking.
* Cancel the active request.
*/
if(result.redirect)
{
browser.tabs.update(request.tabId, {url: result.url});
return {cancel: true};
}
/*
* Cancel the Request and redirect to the site blocked alert page,
* to inform the user about the full url blocking.
*/
if(result.cancel){
return {
redirectUrl: siteBlockedAlert
};
}
/*
* Ensure that the function go not into
* a loop.
*/
if(result.changes){
return {
redirectUrl: result.url
};
}
}
}
// Default case
return {};
}
/**
* Function to log all activities from ClearUrls.
* Only logging when activated.
* The log is only temporary saved in the cache and will
* permanently saved with the saveLogOnClose function.
*
* @param beforeProcessing the url before the clear process
* @param afterProcessing the url after the clear process
* @param rule the rule that triggered the process
*/
function pushToLog(beforeProcessing, afterProcessing, rule)
{
if(storage.loggingStatus)
{
storage.log.log.push(
{
"before": beforeProcessing,
"after": afterProcessing,
"rule": rule,
"timestamp": Date.now()
}
);
}
}
/**
* Call loadOldDataFromStore, getHash, counter, status and log functions
*/
loadOldDataFromStore();
getHash();
setBadgedStatus();
/**
* Call by each tab is updated.
* And if url has changed.
*/
function handleUpdated(tabId, changeInfo, tabInfo) {
if(changeInfo.url)
{
delete badges[tabId];
}
currentURL = tabInfo.url;
}
/**
* Call by each tab is updated.
*/
browser.tabs.onUpdated.addListener(handleUpdated);
/**
* Call by each tab change to set the actual tab id
*/
function handleActivated(activeInfo) {
tabid = activeInfo.tabId;
browser.tabs.get(tabid).then(function (tab) {
currentURL = tab.url;
});
}
/**
* Call by each tab change.
*/
browser.tabs.onActivated.addListener(handleActivated);
/**
* Check the request.
*/
function promise(requestDetails)
{
if(isDataURL(requestDetails))
{
return {};
}
else {
var ret = clearUrl(requestDetails);
return ret;
}
}
/**
* To prevent long loading on data urls
* we will check here for data urls.
*
* @type {requestDetails}
* @return {boolean}
*/
function isDataURL(requestDetails) {
var s = requestDetails.url;
return s.substring(0,4) == "data";
}
/**
* Call by each Request and checking the url.
*
* @type {Array}
*/
browser.webRequest.onBeforeRequest.addListener(
promise,
{urls: ["<all_urls>"], types: getData("types")},
["blocking"]
);
});
}
/**
* Save every minute the temporary data to the disk.
*/
setInterval(saveOnExit, 60000);
/**
* Get the badged status from the browser storage and put the value
* into a local variable.
*
*/
function setBadgedStatus()
{
if(!checkOSAndroid() && storage.badgedStatus){
browser.browserAction.setBadgeBackgroundColor({
'color': '#'+storage.badged_color
});
}
}
/**
* Change the icon.
*/
function changeIcon()
{
if(storage.globalStatus){
browser.browserAction.setIcon({path: "img/clearurls.svg"});
} else{
browser.browserAction.setIcon({path: "img/clearurls_gray.svg"});
}
}
/**
* Check if it is an android device.
* @return bool
*/
function checkOSAndroid()
{
if(os == "android")
{
return true;
}
else{
return false;
}
}
/**
* Increase by {number} the GlobalURLCounter
* @param {int} number
*/
function increaseGlobalURLCounter(number)
{
if(storage.statisticsStatus)
{
storage.globalurlcounter += number;
}
}
/**
* Increase by one the URLCounter
*/
function increaseURLCounter()
{
if(storage.statisticsStatus)
{
storage.globalCounter++;
}
}
/**
* Writes the storage variable to the disk.
*/
function saveOnExit()
{
var json = {};
Object.entries(storage).forEach(([key, value]) => {
switch (key) {
case "ClearURLsData":
case "log":
json[key] = JSON.stringify(value);
break;
case "types":
json[key] = value.toString();
break;
default:
json[key] = value;
}
});
console.log(translate('core_save_on_disk'));
browser.storage.local.set(json);
}
/**
* Save the value under the key on the disk.
* @param {String} key
* @param {Object} value
*/
function saveOnDisk(key, value)
{
browser.storage.local.set({key: value});
}
/**
* Retrieve everything and save on the RAM.
*/
function getDataFromDisk()
{
browser.storage.local.get().then(start, error);
}
/**
* Get the value under the key.
* @param {String} key
* @return {Object}
*/
function getData(key)
{
return storage[key];
}
/**
* Save the value under the key on the RAM.
* @param {String} key
* @param {Object} value
*/
function setData(key, value)
{
switch (key) {
case "ClearURLsData":
case "log":
storage[key] = JSON.parse(value);
break;
case "hashURL":
case "ruleURL":
storage[key] = replaceOldGithubURLs(value);
break;
case "types":
storage[key] = value.split(',');
break;
default:
storage[key] = value;
}
}
/**
* Translate a string with the i18n API.
*
* @param {string} string Name of the attribute used for localization
*/
function translate(string)
{
return browser.i18n.getMessage(string);
}
/**
* Write error on console.
*/
function error()
{
console.log(translate('core_error'));
}
/**
* Set default values, if the storage is empty.
* @param {Object} items
*/
function initStorage(items)
{
initSettings();
if(!isEmpty(items)) {
Object.entries(items).forEach(([key, value]) => {
setData(key, value);
});
}
}
/**
* Set default values for the settings.
*/
function initSettings()
{
storage.ClearURLsData = [];
storage.dataHash = "";
storage.badgedStatus = true;
storage.globalStatus = true;
storage.globalurlcounter = 0;
storage.globalCounter = 0;
storage.hashStatus = "error";
storage.loggingStatus = false;
storage.log = {"log": []};
storage.statisticsStatus = true;
storage.badged_color = "ffa500";
storage.hashURL = "https://gitlab.com/KevinRoebert/ClearUrls/raw/master/data/rules.hash";
storage.ruleURL = "https://gitlab.com/KevinRoebert/ClearUrls/raw/master/data/data.json";
storage.types = ["main_frame", "sub_frame", "xmlhttprequest"];
storage.reportServer = "https://clearurls.xn--rb-fka.it";
}
/**
* Reloads the extension.
*/
function reload()
{
browser.runtime.reload();
}
/**
* Replace the old GitHub URLs with the
* new GitLab URLs.
*/
function replaceOldGithubURLs(url)
{
switch (url) {
case "https://raw.githubusercontent.com/KevinRoebert/ClearUrls/master/data/rules.hash?flush_cache=true":
return "https://gitlab.com/KevinRoebert/ClearUrls/raw/master/data/rules.hash";
case "https://raw.githubusercontent.com/KevinRoebert/ClearUrls/master/data/data.json?flush_cache=true":
return "https://gitlab.com/KevinRoebert/ClearUrls/raw/master/data/data.json";
default:
return url;
}
}
/**
* Check if an object is empty.
* @param {Object} obj
* @return {Boolean}
*/
function isEmpty(obj)
{
return (Object.getOwnPropertyNames(obj).length === 0);
}
/**
* Returns the current URL.
* @return {String} [description]
*/
function getCurrentURL()
{
return currentURL;
}

View File

@@ -1,20 +0,0 @@
body {
font-size: 13px;
}
.small-version {
font-size: 10px;
}
.navbar-header {
margin-top: 0;
margin-bottom: 8px;
}
.col-sm-1 {
margin-top: -10px;
}
#body-popup {
width: 200px;
}

View File

@@ -1,69 +0,0 @@
{
"manifest_version": 2,
"name": "ClearURLs",
"version": "1.3.3.14",
"author": "Kevin R.",
"description": "Remove tracking elements form URLs.",
"homepage_url": "https://gitlab.com/KevinRoebert/ClearUrls",
"default_locale": "en",
"icons": {
"16": "img/clearurls.png",
"19": "img/clearurls.png",
"20": "img/clearurls.png",
"24": "img/clearurls.png",
"30": "img/clearurls.png",
"32": "img/clearurls.png",
"38": "img/clearurls.png",
"48": "img/clearurls.png",
"64": "img/clearurls.png",
"96": "img/clearurls.png",
"128": "img/clearurls.png"
},
"browser_action": {
"browser_style": true,
"default_icon": {
"16": "img/clearurls.png",
"19": "img/clearurls.png",
"20": "img/clearurls.png",
"24": "img/clearurls.png",
"30": "img/clearurls.png",
"32": "img/clearurls.png",
"38": "img/clearurls.png",
"48": "img/clearurls.png",
"64": "img/clearurls.png",
"96": "img/clearurls.png",
"128": "img/clearurls.png"
},
"default_title": "ClearURLs Add-on",
"default_popup": "html/popup.html"
},
"permissions": [
"*://*/*",
"<all_urls>",
"webRequest",
"webRequestBlocking",
"storage",
"tabs"
],
"background": {
"scripts": [
"browser-polyfill.js",
"external_js/jquery-3.2.1.min.js",
"external_js/sha256.jquery.js",
"clearurls.js"
]
},
"content_scripts": [
{
"matches": ["<all_urls>"],
"js": [
"browser-polyfill.js"
]
}
],
"options_ui": {
"page": "html/settings.html"
}
}

View File

@@ -0,0 +1,16 @@
body {
background-color: #FFFFFF;
}
.ui.menu .item img.logo {
margin-right: 1.5em;
}
.main.container {
margin-top: 7em;
}
.wireframe {
margin-top: 2em;
}
.ui.footer.segment {
margin: 5em 0em 0em;
padding: 5em 0em;
}

42
GitLabPages/i253.html Normal file
View File

@@ -0,0 +1,42 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>ClearURLs - Issue 253</title>
<meta name="description" content="ClearURLs test page">
<meta name="author" content="Kevin Röbert">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.4.1/semantic.min.css">
<link rel="stylesheet" href="css/styles.css">
</head>
<body>
<div class="ui inverted menu">
<div class="ui container">
<a href="#" class="header item">
<img class="logo" src="clearurls.svg">
ClearURLs
</a>
</div>
</div>
<div class="ui main text container">
<h1 class="ui header">ClearURLs - Issue 253</h1>
<div class="ui negative icon message">
<i class="huge warning sign icon"></i>
<div class="content">
<p>
Your ClearURLs version is vulnerable to the problem from issue 253.
Please update your ClearURLs installation to at least version <b>1.8.4 or higher</b>.
</p>
</div>
</div>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.4.1/semantic.min.js"></script>
</body>
</html>

58
GitLabPages/index.html Normal file
View File

@@ -0,0 +1,58 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>ClearURLs test page</title>
<meta name="description" content="ClearURLs test page">
<meta name="author" content="Kevin Röbert">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.4.1/semantic.min.css">
<link rel="stylesheet" href="css/styles.css">
</head>
<body>
<div class="ui inverted menu">
<div class="ui container">
<a href="#" class="header item">
<img class="logo" src="clearurls.svg">
ClearURLs
</a>
</div>
</div>
<div class="ui main text container">
<h1 class="ui header">ClearURLs test page</h1>
<p>
On this page you can automatically check whether ClearURLs works correctly.
If you are using an obsolete ClearURLs version that is affected by a potential security vulnerability,
you will also be notified on this page.
</p>
<br />
<div class="ui icon message" id="rules_filter_test"></div>
<div class="ui icon message" id="redirection_filter_test"></div>
<div class="ui icon message" id="block_filter_test"></div>
<div class="ui icon message" id="issue_253_test"></div>
<iframe src="https://kevinroebert.gitlab.io/ClearUrls/void/index.html?ref=gitlab"
height="1" width="1" id="void_roebert_eu_iframe" style="border:0; border:none;"></iframe>
<iframe src="https://youtube.com/redirect?q=https%3A%2F%2Fkevinroebert.gitlab.io%2FClearUrls%2Fvoid%2Findex.html%3Fref%3Dgitlab"
height="1" width="1" id="redirect_roebert_eu_iframe" style="border:0; border:none;"></iframe>
<iframe src="https://www.google.com/url?rct=j&url=https%3A%2F%2Fkevinroebert.gitlab.io%2FClearUrls%2Fi253.html"
height="1" width="1" id="i253_roebert_eu_iframe" style="border:0; border:none;"></iframe>
<img id="i253_roebert_eu_img" height="1" width="1"/>
<img id="block_roebert_eu_img" height="1" width="1"/>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.4.1/semantic.min.js"></script>
<script src="js/scripts.js"></script>
</body>
</html>

113
GitLabPages/js/scripts.js Normal file
View File

@@ -0,0 +1,113 @@
/*
* ClearURLs
* Copyright (c) 2017-2020 Kevin Röbert
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/*jshint esversion: 6 */
function checkRule() {
let resURL;
try {
resURL = document.getElementById("void_roebert_eu_iframe").contentWindow.location.href;
} catch(e) {
resURL = "error";
}
let segment = $('#rules_filter_test');
if(resURL === 'https://kevinroebert.gitlab.io/ClearUrls/void/index.html') {
segment.addClass('positive');
segment.append('<i class="large smile outline icon"></i>');
segment.append('<div class="content"><p>The tracking filter function of ClearURLs works correctly.</p></div>');
} else {
segment.addClass('warning');
segment.append('<i class="large frown outline icon"></i>');
segment.append('<div class="content"><p>The tracking filter function of ClearURLs does <b>not</b> work properly. ' +
'Maybe the addon is disabled or the rules could not be downloaded.</p></div>');
}
}
function checkRedirection() {
let resURL;
try {
resURL = document.getElementById("redirect_roebert_eu_iframe").contentWindow.location.href;
} catch(e) {
resURL = "error";
}
let segment = $('#redirection_filter_test');
if(resURL === 'https://kevinroebert.gitlab.io/ClearUrls/void/index.html') {
segment.addClass('positive');
segment.append('<i class="large smile outline icon"></i>');
segment.append('<div class="content"><p>The redirection function of ClearURLs works correctly.</p></div>');
} else {
segment.addClass('warning');
segment.append('<i class="large frown outline icon"></i>');
segment.append('<div class="content"><p>The redirection function of ClearURLs does <b>not</b> work properly. ' +
'Maybe the addon is disabled or the rules could not be downloaded.</p></div>');
}
}
function checkBlock() {
let segment = $('#block_filter_test');
$('#block_roebert_eu_img')
.on('load', function() {
segment.addClass('warning');
segment.append('<i class="large frown outline icon"></i>');
segment.append('<div class="content"><p>The block function of ClearURLs does <b>not</b> work properly. ' +
'Maybe the addon is disabled or the rules could not be downloaded.</p></div>');
})
.on('error', function() {
segment.addClass('positive');
segment.append('<i class="large smile outline icon"></i>');
segment.append('<div class="content"><p>The block function of ClearURLs works correctly.</p></div>');
})
.attr("src", 'https://www.contentpass.de/img/logo.svg');
}
function checkIssue253() {
let segment = $('#issue_253_test');
$('#i253_roebert_eu_img')
.on('load', function() {
segment.addClass('negative');
segment.append('<i class="large frown outline icon"></i>');
segment.append('<div class="content"><p>Your ClearURLs version is vulnerable to the problem from issue 253. ' +
'Please update your ClearURLs installation to at least version <b>1.8.3 or higher</b>.</p></div>');
})
.on('error', function() {
segment.addClass('positive');
segment.append('<i class="large smile outline icon"></i>');
segment.append('<div class="content"><p>Your ClearURLs version is not vulnerable to the problem from Issue 253.</p></div>');
})
.attr("src", 'https://www.google.com/url?rct=j&url=https%3A%2F%2Fkevinroebert.gitlab.io%2FClearUrls%2Fi253.html');
}
$(window).on('load', function () {
try {
checkRule();
} catch(e) {}
try {
checkRedirection();
} catch(e) {}
try {
checkBlock();
} catch(e) {}
try {
checkIssue253();
} catch(e) {}
});

View File

165
LICENSE Normal file
View File

@@ -0,0 +1,165 @@
GNU LESSER GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
This version of the GNU Lesser General Public License incorporates
the terms and conditions of version 3 of the GNU General Public
License, supplemented by the additional permissions listed below.
0. Additional Definitions.
As used herein, "this License" refers to version 3 of the GNU Lesser
General Public License, and the "GNU GPL" refers to version 3 of the GNU
General Public License.
"The Library" refers to a covered work governed by this License,
other than an Application or a Combined Work as defined below.
An "Application" is any work that makes use of an interface provided
by the Library, but which is not otherwise based on the Library.
Defining a subclass of a class defined by the Library is deemed a mode
of using an interface provided by the Library.
A "Combined Work" is a work produced by combining or linking an
Application with the Library. The particular version of the Library
with which the Combined Work was made is also called the "Linked
Version".
The "Minimal Corresponding Source" for a Combined Work means the
Corresponding Source for the Combined Work, excluding any source code
for portions of the Combined Work that, considered in isolation, are
based on the Application, and not on the Linked Version.
The "Corresponding Application Code" for a Combined Work means the
object code and/or source code for the Application, including any data
and utility programs needed for reproducing the Combined Work from the
Application, but excluding the System Libraries of the Combined Work.
1. Exception to Section 3 of the GNU GPL.
You may convey a covered work under sections 3 and 4 of this License
without being bound by section 3 of the GNU GPL.
2. Conveying Modified Versions.
If you modify a copy of the Library, and, in your modifications, a
facility refers to a function or data to be supplied by an Application
that uses the facility (other than as an argument passed when the
facility is invoked), then you may convey a copy of the modified
version:
a) under this License, provided that you make a good faith effort to
ensure that, in the event an Application does not supply the
function or data, the facility still operates, and performs
whatever part of its purpose remains meaningful, or
b) under the GNU GPL, with none of the additional permissions of
this License applicable to that copy.
3. Object Code Incorporating Material from Library Header Files.
The object code form of an Application may incorporate material from
a header file that is part of the Library. You may convey such object
code under terms of your choice, provided that, if the incorporated
material is not limited to numerical parameters, data structure
layouts and accessors, or small macros, inline functions and templates
(ten or fewer lines in length), you do both of the following:
a) Give prominent notice with each copy of the object code that the
Library is used in it and that the Library and its use are
covered by this License.
b) Accompany the object code with a copy of the GNU GPL and this license
document.
4. Combined Works.
You may convey a Combined Work under terms of your choice that,
taken together, effectively do not restrict modification of the
portions of the Library contained in the Combined Work and reverse
engineering for debugging such modifications, if you also do each of
the following:
a) Give prominent notice with each copy of the Combined Work that
the Library is used in it and that the Library and its use are
covered by this License.
b) Accompany the Combined Work with a copy of the GNU GPL and this license
document.
c) For a Combined Work that displays copyright notices during
execution, include the copyright notice for the Library among
these notices, as well as a reference directing the user to the
copies of the GNU GPL and this license document.
d) Do one of the following:
0) Convey the Minimal Corresponding Source under the terms of this
License, and the Corresponding Application Code in a form
suitable for, and under terms that permit, the user to
recombine or relink the Application with a modified version of
the Linked Version to produce a modified Combined Work, in the
manner specified by section 6 of the GNU GPL for conveying
Corresponding Source.
1) Use a suitable shared library mechanism for linking with the
Library. A suitable mechanism is one that (a) uses at run time
a copy of the Library already present on the user's computer
system, and (b) will operate properly with a modified version
of the Library that is interface-compatible with the Linked
Version.
e) Provide Installation Information, but only if you would otherwise
be required to provide such information under section 6 of the
GNU GPL, and only to the extent that such information is
necessary to install and execute a modified version of the
Combined Work produced by recombining or relinking the
Application with a modified version of the Linked Version. (If
you use option 4d0, the Installation Information must accompany
the Minimal Corresponding Source and Corresponding Application
Code. If you use option 4d1, you must provide the Installation
Information in the manner specified by section 6 of the GNU GPL
for conveying Corresponding Source.)
5. Combined Libraries.
You may place library facilities that are a work based on the
Library side by side in a single library together with other library
facilities that are not Applications and are not covered by this
License, and convey such a combined library under terms of your
choice, if you do both of the following:
a) Accompany the combined library with a copy of the same work based
on the Library, uncombined with any other library facilities,
conveyed under the terms of this License.
b) Give prominent notice with the combined library that part of it
is a work based on the Library, and explaining where to find the
accompanying uncombined form of the same work.
6. Revised Versions of the GNU Lesser General Public License.
The Free Software Foundation may publish revised and/or new versions
of the GNU Lesser General Public License from time to time. Such new
versions will be similar in spirit to the present version, but may
differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the
Library as you received it specifies that a certain numbered version
of the GNU Lesser General Public License "or any later version"
applies to it, you have the option of following the terms and
conditions either of that published version or of any later version
published by the Free Software Foundation. If the Library as you
received it does not specify a version number of the GNU Lesser
General Public License, you may choose any version of the GNU Lesser
General Public License ever published by the Free Software Foundation.
If the Library as you received it specifies that a proxy can decide
whether future versions of the GNU Lesser General Public License shall
apply, that proxy's public statement of acceptance of any version is
permanent authorization for you to choose that version for the
Library.

View File

@@ -1,118 +0,0 @@
Qabel Public License Version 0.2 (QaPL v0.2) (c) Qabel GmbH, Hannover
=====================================================================
You may copy and distribute verbatim copies of this license agreement. You may also use content from it for your own license agreement. Unless not expressly stated, you may not use the name Qabel Public License ("QaPL") in connection with any license agreement that is not a verbatim copy of This License.
PREAMBLE
--------
Today Software is the undisputed centerpiece of the information society and access to software and information society services became a public commodity. Yet traditional software is made available in object code only, where the software user is not entitled to study or even modify the source code. We believe that this is a salient shortcoming in particular when it comes to software which is designed to help the user protect his privacy in a virtual world. A proprietary software developer who refuses to unveil the source code of its security software, requires users to place a great deal of faith into the computer program and its ability to protect personal data. Not only because trust in conventional software security was all too often disappointed, we have decided to replace "trust" with "transparency" and everybody is welcome to study, modify and improve the source code of this software. Furthermore, and although we believe in the idea of free software, we have decided to make two important exceptions, to wit, QaPL-licensed software should neither be used commercially without our consent, nor for military, intelligence or related purposes. By that we hope to make it a powerful, self sustaining and constantly evolving tool that helps to reinforce data security and the protection of personal data. However, it shall be up to the user to decide whether he finds this software fit for the purpose.
[0] Definitions
---------------
[a] "Application" means any software that may be, directly or indirectly, linked to the Library by using its interface.
[b] "Commercial use" means utilizing the Library or other software licensed under the QaPL or parts thereof to, directly or indirectly, establish a source of income, including but not limited to, embedding the Library or other software licensed under the QaPL or parts thereof into Proprietary Software, executable software, or consulting services utilizing the Library or other software licensed under the QaPL or parts thereof. It is not considered Commercial Use if the Licensee, including a commercial enterprise, uses the Library or other software licensed under the QaPL or parts thereof for academic, study and/or research purposes, or if a software project is solely based on donations.
[c] "Original Copyright Holder" means Kevin Röbert.
[d] "Contributor" means any person or entity that creates or contributes to the creation of modifications to the Library or other software licensed under the QaPL.
[e] "Library" means a collection of software functions, subroutines and/or data prepared so as to be conveniently linked with Applications (which use some of those functions and data) to form executables including associated documentation.
[f] "Licensee" means any individual or legal entity exercising rights under the QaPL.
[g] "Make Publicly Available" refers to the public distribution of the Library or other software licensed under the QaPL in an immaterial form, including but not limited to, making it available for download in data networks and Software as a Service (SaaS).
[h] "Modification" means any change to the Library or other software licensed under the QaPL in a way that would, under the applicable law, require the copyright holder's permission, including but not limited to the extension, deletion, alteration, translation into other programming languages or combination with other software.
[i] "Modification of the Library" means the Library or its derivatives containing the Library as a whole or in parts and Applications or any other software that are linked to the Library.
[j] "Object Code" means any machine-readable form of the Library or other software licensed under the QaPL, excluding the Source Code.
[k] "Proprietary Software" means software that is not licensed under an open source license as defined by the open source definition (Version 1.9).
[l] "Source Code" means the preferred form of the Library or other software licensed under the QaPL for making Modifications to it.
[m] "This License" means the Qabel Public License regardless of its version.
[1] Scope of Application
-------------------------------
The QaPL applies to any software library or other software that contains a notice placed by the copyright holder or another authorised party stating that the Library or other software is governed by the
terms of the QaPL. This license shall also apply to remote network interaction.
[2] License Grant and Conditions
------------------------------------------
[a] As far as This License is not restricted according to sec. [3], Licensee may free of charge and in any medium modify, reproduce, distribute, and Make Publicly Available the Library or other software licensed under the QaPL.
[b] Licensee may distribute, and Make Publicly Available unmodified versions, of the Library or other software licensed under the QaPL provided that the following condition is met: A conspicuous reference to the text of This License
that allows any recipient to easily access the text of This License must be provided.
[c] Licensee may distribute, and Make Publicly Available modified versions, of the Library or other software licensed under the QaPL provided that, in addition to the conditions stated in sec. [2][b], the following conditions are met: The files modified must bear notices which state that the files were changed, the date of change and the author of the Modification. The Library or other software licensed under the QaPL must in its entirety be licensed free of charge to all third parties under the terms of This License.
[d] If you wish to distribute or Make the Library or other software licensed under the QaPL, modified or unmodified, Publicly Available in Object Code form only, you must in addition to the forgoing make the complete Source Code publicly available or ensure that the Original Copyright Holder does so and make a conspicuous reference to the internet address from which the Source Code may be downloaded.
[3] Restrictions
--------------------
[a] No license is granted by the Original Copyright Holder for the Commercial Use of the Library or other software licensed under the QaPL. In particular, no license is granted for linking Applications to the Library which shall be used commercially. If you would like to use the Library or other software licensed under the QaPL for commercial purposes or link to an Application that shall be used commercially, including selling an Application that shall be linked to the Library or other software licensed under the QaPL, please inquire with the Original Copyright Holder.
[b] No license is granted by the Original Copyright Holder for military, intelligence or related purposes, including but not limited to intelligence and military research.
[4] Contributor's License Grant
----------------------------------------
[a] A Contributor, who distributes or makes publicly available a Modification, hereby grants the Original Copyright Holder a perpetual, irrevocable, worldwide, free of charge, royalty-free, non-exclusive, unrestricted license that may be subject to third party property claims, to use, reproduce, modify, display, perform, sublicense, distribute, Make Publicly Available, commercially exploit and exercise all ownership rights in the Contributors contribution. Contributor hereby agrees that he will not assert any moral rights in his contribution against the Original Copyright Holder.
[b] A contributor, who distributes or makes publicly available a Modification, hereby grants to the Original Copyright Holder a perpetual, worldwide, non-exclusive, free-of-charge, royalty-free patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Library or other software licensed under the QaPL. Where such license applies it shall only apply to those patent claims licensable by the Contributor that are necessarily infringed by their contributions alone or by combination of their contributions with the Library or other software licensed under the QaPL with which such contribution was combined.
[c] Contributor represents and warrants that his contribution is his own original creation and to the best of his knowledge he can legally grant the rights in his contribution set out in This License and, where applicable, is authorised by his employer and that the Original Copyright Holder exercising the rights granted under this license does, to the best of the Contributors knowledge, not infringe any third party rights. Contributor further represents that he is not aware of any claims, suits or court actions in relation to his contribution. Contributor agrees that he will immediately notify the Original Copyright Holder if he becomes aware of any third party claims and, if the Contributor after having submitted or otherwise distributed his contribution, becomes aware of a third party claim in relation to his contribution, shall promptly take all reasonable measures to mitigate damages resulting from the infringement of third party claims, including but not limited to informing those who may have received software containing the contribution.
[5] Conclusion of Contract
----------------------------------
[a] This License constitutes the offer to conclude a contract to use the Library or other software licensed under the QaPL in compliance with the conditions of This License. Acceptance may be declared by exercising the right granted under sec. [2] of This License.
[b] All Licensees obtain the rights granted by This License directly from the Original Copyright Holder. Without having to accept This License the Library or other software may still be used in accordance with the applicable statutory provisions.
[6] Termination
--------------------
The rights granted under This License will terminate
automatically if the Licensee fails to comply with its terms.
[7] Warranty and Liability
---------------------------------
[a] The copyright holders are not liable for contradictory third-party rights, unless they were aware of such rights without informing the Licensee.
[b] Liability for damages arising out of the use or inability to use the Library or other software licensed under the QaPL, including but not limited to software failure, data loss, data being rendered inaccurate, a failure of the software to operate with any other program and any other defects in the Library or other software licensed under the QaPL, shall be governed by separate agreements, or, if no such agreement exists, by the applicable statutory provisions.
[8] License Updates
-------------------------
Qabel GmbH or its legal successors may, from time to time, revise and update the QaPL in order to address new developments and concerns. These revisions and updates will reflect the spirit of the current license version and will not impose on any Licensee or copyright holder additional obligations. QaPL license updates shall replace all older license versions in existing agreements. This does not apply to original copyright holders other than Qabel GmbH, who have chosen to submit their program to the QaPL, unless they have designated their program as licensed under "QaPL 0.2 or any later version".
[9] Miscellaneous
----------------------
[a] This License shall be governed by German Law. The application of the UN Convention on the International Sale of Goods (CISG) and the principles of conflict of laws shall be excluded.
[b] If you wish to incorporate parts of the Library or other software licensed under the QaPL into other software whose license terms contradict with the provisions of this license, you may inquire with either the Original Copyright Holder or the copyright holder of the other software on possible exceptions.
[c] If, under the applicable law, any provision of This License is or becomes invalid or unenforceable, it shall not affect the validity or enforceability of the remainder of the terms of This License, and without further action by the parties to This License, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable.

102
README.md
View File

@@ -1,48 +1,104 @@
# ClearURLs [![Mozilla Add-on](https://img.shields.io/amo/v/clearurls.svg)](https://addons.mozilla.org/en-US/firefox/addon/clearurls/versions/)
[![Donate](https://img.shields.io/badge/donate-PayPal-blue.svg)](https://www.paypal.me/KevinRoebert)
<a href="https://www.buymeacoffee.com/KevinRoebert" target="_blank"><img src="https://cdn.buymeacoffee.com/buttons/default-orange.png" alt="Buy Me A Coffee" height="51" width="217"></a>
[![Mozilla Add-on](https://img.shields.io/amo/stars/clearurls.svg)](https://addons.mozilla.org/en-US/firefox/addon/clearurls/reviews/)
[<img src="https://addons.cdn.mozilla.net/static/img/addons-buttons/AMO-button_1.png" alt="for Firefox">](https://addons.mozilla.org/en-US/firefox/addon/clearurls/) [<img src="https://developer.chrome.com/webstore/images/ChromeWebStore_BadgeWBorder_v2_206x58.png" alt="for Chrome">](https://chrome.google.com/webstore/detail/clearurls/lckanjgmijmafbedllaakclkaicjfmnk)
[![Mozilla Add-on](https://img.shields.io/amo/users/clearurls.svg)](https://addons.mozilla.org/en-US/firefox/addon/clearurls/statistics/?last=30)
# <sub><img src="https://gitlab.com/KevinRoebert/ClearUrls/raw/master/img/clearurls.svg" width="64px" height="64px"></sub> ClearURLs
**ClearURLs** is an add-on based on the new WebExtensions technology and is optimized for *Firefox* and now also available for *Chrome* based browsers.
**ClearURLs** is an add-on based on the new WebExtensions technology and is optimized for *Firefox* and *Chrome* based browsers.
This add-on will remove the tracking fields from all URLs which are visited by the browser and use a rule file, namely `data.json`.
This add-on protects your privacy and block the request from advertising services like *doubleclick.net*.
This extension will automatically remove tracking elements from URLs to help protect your privacy when browse through the Internet,
which is regularly updated by us and can be found [here](https://gitlab.com/KevinRoebert/ClearUrls/raw/master/data/data.min.json).
## Application
Large (and small) webpages use elements in the URL, e.g.: https://example.com?source=thisIstheSiteIvisitedBefore to track your online activities. In this example, the source field tells the provider which page you visited before. The add-on will remove these tracking fields from the URL.
Many websites use tracking elements in the URL (e.g. `https://example.com?utm_source=newsletter1&utm_medium=email&utm_campaign=sale`) to mark your online activity.
All that tracking code is not necessary for a website to be displayed or work correctly and can therefore be removed—that is exactly what ClearURLs does.
## Installation
Mozilla Add-on: [![Mozilla Add-on](https://img.shields.io/amo/d/clearurls.svg)](https://addons.mozilla.org/en-US/firefox/addon/clearurls/)
Another common example are Amazon URLs. If you search for a product on Amazon you will see a very long URL, such as:
```
https://www.amazon.com/dp/exampleProduct/ref=sxin_0_pb?__mk_de_DE=ÅMÅŽÕÑ&keywords=tea&pd_rd_i=exampleProduct&pd_rd_r=8d39e4cd-1e4f-43db-b6e7-72e969a84aa5&pd_rd_w=1pcKM&pd_rd_wg=hYrNl&pf_rd_p=50bbfd25-5ef7-41a2-68d6-74d854b30e30&pf_rd_r=0GMWD0YYKA7XFGX55ADP&qid=1517757263&rnid=2914120011
```
[Chrome Add-on](https://gitlab.com/KevinRoebert/ClearUrls/tags?utf8=%E2%9C%93&search=_cv)
Indeed most of the above URL is tracking code. Once ClearURLs has cleaned the address, it will look like this:
`https://www.amazon.com/dp/exampleProduct`
## Features
* Removes tracking from URLs automatically in the background
* Blocks some common ad domains (optional)
* Has a built-in tool to clean up multiple URLs at once
* Supports redirection to the destination, without tracking services as middleman
* Adds an entry to the context menu so that links can be copied quickly and cleanly
* Blocks hyperlink auditing, also known as *ping tracking* (see also [this article](https://html.spec.whatwg.org/multipage/links.html#hyperlink-auditing))
* Prevents tracking injection over history API (see also: [The replaceState() method](https://developer.mozilla.org/en-US/docs/Web/API/History_API#The_replaceState()_method))
* Prevents Google from rewriting the search results (to include tracking elements)
* Prevents Yandex from rewriting the search results (to include tracking elements)
## Permissons
Reasoning for needed permissions can be found under [here](https://gitlab.com/KevinRoebert/ClearUrls/issues/159).
## Screenshot
![Interface (version 1.11.0)](https://gitlab.com/KevinRoebert/ClearUrls/raw/master/promotion/screens/Popup_v_1.11.0.png)
## CI/CD Artifacts Download (for Firefox- and Chrome-Dev only)
Here you can download the packed files for the Firefox- and Chrome-Dev:
[Firefox](https://gitlab.com/KevinRoebert/ClearUrls/-/jobs/artifacts/master/raw/ClearUrls_firefox.zip?job=build%20firefox)
[Chrome](https://gitlab.com/KevinRoebert/ClearUrls/-/jobs/artifacts/master/raw/ClearUrls_chrome.zip?job=build%20chrome)
## Test
If you want to test whether ClearURLs works correctly on your system, you can go to this test page: [https://clearurls.roebert.eu/](https://clearurls.roebert.eu/)
## Contribute
If you have any suggestions or complaints, please [create an issue.](https://gitlab.com/KevinRoebert/ClearUrls/issues/new)
## Screenshot
![Interface (version 1.2.2.x)](https://gitlab.com/KevinRoebert/ClearUrls/raw/48b8b9e994eb2535b11106dcd766097d55b493dd/promotion/screens/Popup_v_1.2.2.8.png)
### Translate ClearURLs
You want to help translating ClearURLs into many languages? Nice
You can choose between two options to contribute. You can create a merge request, or you can use the POEditor to translate ClearURLs.
*Hint: The description field in the translation files are only an information for what the translation is used.
It is not necessary to translate the description field; in the most cases it is empty.*
#### Merge request
If you want to create a merge request, you must open the path [`_locales/en/messages.json`](https://github.com/KevinRoebert/ClearUrls/blob/master/_locales/en/messages.json) in the ClearURLs repo
and translate the english terms into terms of your language. Once you have translated all the terms, you make a pull request of your translation.
Please push your translation into the folder `_locales/{country code}/messages.json`.
#### POEditor
[<img src="https://poeditor.com/public/images/logo/logo.svg" alt="https://poeditor.com/join/project/vKTpQWWvk2" width="150">](https://poeditor.com/join/project/vKTpQWWvk2)
## Projects that use parts of ClearURLs
* [Uroute](https://github.com/walterl/uroute) used ClearURLs to filter/clean URL before launching browser
## Recommended by...
* [ghacks-user.js](https://github.com/ghacksuserjs/ghacks-user.js/wiki/4.1-Extensions)
* [Awesome Humane Tech List](https://github.com/humanetech-community/awesome-humane-tech#tracking)
* ClearURLs is part of Mozilla's recommended extensions program
## Permissions
Reasoning for needed permissions you can find under [this discussion](https://gitlab.com/KevinRoebert/ClearUrls/issues/159).
## Copyright
We use some third-party scripts in our add-on. The authors and licenses are listed below.
- [WebExtension browser API Polyfill](https://github.com/mozilla/webextension-polyfill) |
Copyright by Mozilla |
[MPL-2.0](https://github.com/mozilla/webextension-polyfill/blob/master/LICENSE)
- [Bootstrap v3.3.7 ](http://getbootstrap.com) |
- [Bootstrap v4.3.1](https://github.com/twbs/bootstrap/tree/v4.3.1) |
Copyright 2011-2016 Twitter, Inc. |
[MIT](https://github.com/twbs/bootstrap/blob/master/LICENSE)
- [jQuery v3.2.1](https://jquery.com/) |
Copyright 2017 The jQuery Foundation |
- [jQuery v3.4.1](https://github.com/jquery/jquery/tree/3.4.1) |
Copyright JS Foundation and other contributors |
[MIT](https://jquery.org/license/)
- [sha256.jquery.plugin](https://github.com/orsozed/sha256.jquery.plugin) |
Copyright 2003, Christoph Bichlmeier |
[MIT](https://raw.github.com/orsozed/JQuery-Plugins/master/license/MIT-LICENSE.txt) |
[GPLv2](https://raw.github.com/orsozed/JQuery-Plugins/master/license/GPL-LICENSE.txt)
- [DataTables](https://datatables.net/) | Copyright 2011-2015 SpryMedia Ltd | [MIT](https://datatables.net/license/)
- [Pick-a-Color v1.2.3](https://github.com/lauren/pick-a-color) | Copyright (c) 2013 Lauren Sperber and Broadstreet Ads |
[MIT](https://github.com/lauren/pick-a-color/blob/master/LICENSE)
## Licence
[![License: QaPL v0.2](https://img.shields.io/badge/License-QaPL%20v0.2-brightgreen.svg)](https://gitlab.com/KevinRoebert/ClearUrls/blob/master/LICENSE.md)
- [DataTables v1.10.20](https://github.com/DataTables/DataTables/tree/master) | Copyright (c) 2008-2015 SpryMedia Limited | [MIT](https://datatables.net/license/)
- [Popper.js v1.16.0](https://github.com/popperjs/popper.js/tree/v1.16.0) | Copyright (c) 2016 Federico Zivolo and contributors |
[MIT](https://github.com/popperjs/popper.js/blob/master/LICENSE.md)
- [Bootstrap Colorpicker v3.2.0](https://github.com/itsjavi/bootstrap-colorpicker/tree/3.2.0) | Copyright (c) 2017 Javi Aguilar |
[MIT](https://github.com/itsjavi/bootstrap-colorpicker/blob/master/LICENSE)
- [Font Awesome v5.12.0](https://github.com/FortAwesome/Font-Awesome/tree/5.12.0) | Copyright (c) @fontawesome |
[Font Awesome Free License](https://github.com/FortAwesome/Font-Awesome/blob/master/LICENSE.txt)

View File

@@ -1,251 +1,328 @@
{
"hash_status_code_1": {
"message": "Aktuell",
"description": ""
"description": "Dieser Statuscode besagt, dass kein Update für die ClearURLs-Regeln verfügbar ist und alles auf dem neuesten Stand ist."
},
"hash_status_code_2": {
"message": "Aktuallisiert",
"description": ""
"message": "Aktualisiert",
"description": "Dieser Statuscode besagt, dass die ClearURLs-Regeln erfolgreich aktualisiert wurden."
},
"hash_status_code_3": {
"message": "Aktuallisierung verfügbar",
"description": ""
"message": "Aktualisierung verfügbar",
"description": "Dieser Statuscode besagt, dass ein Update für die ClearURLs-Regeln verfügbar ist."
},
"hash_status_code_4": {
"message": "Fehler",
"description": ""
"description": "Dieser Statuscode besagt, dass ClearURLs nicht korrekt gestartet werden konnten."
},
"hash_status_code_5": {
"message": "Da ist etwas schiefgelaufen!",
"description": ""
"description": "Dieser Statuscode besagt, dass beim Aktualisieren der ClearURLs-Regeln ein Fehler aufgetreten ist."
},
"log_redirect": {
"message": "Diese Url wurde weiter geleitet",
"description": ""
"description": "Diese Zeichenfolge wird für Umleitungen im ClearURL-Protokoll verwendet."
},
"log_domain_blocked": {
"message": "Diese Domain wurde blockiert",
"description": ""
"description": "Diese Zeichenfolge wird für blockierte Domäns im ClearURL-Protokoll verwendet."
},
"check_os_log": {
"message": "[ClearURLs]: Protokoll-Listener wurde hinzugefügt.",
"description": ""
"description": "Diese Zeichenfolge wird beim Start des ClearURL-Protokolls verwendet."
},
"log_html_page_title": {
"message": "Protokoll von ClearURLs",
"description": ""
"description": "Diese Zeichenfolge wird als Überschrift auf der Protokollseite verwendet."
},
"log_html_table_head_1": {
"message": "Vor der Verarbeitung",
"description": ""
"description": "Diese Zeichenfolge wird als Tabellentitel auf der Protokollseite verwendet."
},
"log_html_table_head_2": {
"message": "Nach der Verarbeitung",
"description": ""
"description": "Diese Zeichenfolge wird als Tabellentitel auf der Protokollseite verwendet."
},
"log_html_table_head_3": {
"message": "Regel",
"description": ""
"description": "Diese Zeichenfolge wird als Tabellentitel auf der Protokollseite verwendet."
},
"log_html_table_head_4": {
"message": "Zeit",
"description": ""
"description": "Diese Zeichenfolge wird als Tabellentitel auf der Protokollseite verwendet."
},
"log_html_reset_button": {
"message": "Zurücksetzen",
"description": ""
"description": "Diese Zeichenfolge wird für die Schaltfläche zum Zurücksetzen auf der Protokollseite verwendet."
},
"log_html_reset_button_title": {
"message": "Setzt das globale Protokoll zurück",
"description": ""
"description": "Diese Zeichenfolge wird als Titel für die Schaltfläche zum Zurücksetzen auf der Protokollseite verwendet."
},
"popup_html_configs_head": {
"message": "Einstellungen",
"description": ""
"description": "Diese Zeichenfolge wird als Titel für die Konfigurationen auf der Popup-Seite verwendet."
},
"popup_html_configs_switch_filter": {
"message": "Filter",
"description": ""
"description": "Diese Zeichenfolge wird als Name für die Filterschaltfläche auf der Popup-Seite verwendet."
},
"popup_html_configs_switch_filter_title": {
"message": "Der Filter-Schalter aktiviert die Reinigungsfunktion von ClearURLs, wenn sie die Funktion ausschalten, dann deaktivieren sie das gesamte Addon",
"description": ""
"description": "Diese Zeichenfolge wird als Titel für die Filterschaltfläche auf der Popup-Seite verwendet."
},
"popup_html_configs_switch_log": {
"message": "Protokoll",
"description": ""
"description": "Diese Zeichenfolge wird als Name für die Schaltfläche zum Umschalten der Protokollierung auf der Popup-Seite verwendet."
},
"popup_html_configs_switch_log_title": {
"message": "Das Protokoll wird nur lokal gespeichert. Wir empfehlen diese Funktion deaktiviert zulassen, wenn Sie sie nicht benötigen",
"description": ""
"description": "Diese Zeichenfolge wird als Titel für die Schaltfläche zum Umschalten der Protokollierung auf der Popup-Seite verwendet."
},
"popup_html_configs_switch_badges": {
"message": "Zähler",
"description": ""
"description": "Diese Zeichenfolge wird als Name für die Schaltfläche zum Wechseln der Abzeichen auf der Popup-Seite verwendet."
},
"popup_html_configs_switch_badges_title": {
"message": "Zeigt die Anzahl der gereinigten URLs an",
"description": ""
"description": "Diese Zeichenfolge wird als Titel für die Schaltfläche zum Wechseln der Abzeichen auf der Popup-Seite verwendet."
},
"popup_html_statistics_head": {
"message": "Statistik",
"description": ""
"description": "Diese Zeichenfolge wird als Titel für die Statistiken auf der Popup-Seite verwendet."
},
"popup_html_statistics_elements": {
"message": "Elemente",
"description": ""
"description": "Diese Zeichenfolge wird als Name für die Elemente auf der Popup-Seite verwendet."
},
"popup_html_statistics_blocked": {
"message": "Blockiert",
"description": ""
"description": "Diese Zeichenfolge wird als Name für die blockierten Elemente auf der Popup-Seite verwendet."
},
"popup_html_statistics_percentage": {
"message": "Anteil",
"description": ""
"description": "Diese Zeichenfolge wird als Name für den Prozentsatz der blockierten Elemente auf der Popup-Seite verwendet."
},
"popup_html_statistics_reset_button": {
"message": "Zurücksetzen",
"description": ""
"description": "Diese Zeichenfolge wird als Name für die Schaltfläche zum Zurücksetzen der Statistik auf der Popup-Seite verwendet."
},
"popup_html_statistics_reset_button_title": {
"message": "Setzt die globale Statistik zurück",
"description": ""
"description": "Diese Zeichenfolge wird als Titel für die Schaltfläche zum Zurücksetzen der Statistik auf der Popup-Seite verwendet."
},
"popup_html_rules_status_head": {
"message": "Regel Status",
"description": ""
"description": "Diese Zeichenfolge wird als Titel für den Abschnitt \"Regelstatus\" auf der Popup-Seite verwendet."
},
"popup_html_log_head": {
"message": "Protokoll",
"description": ""
"description": "Diese Zeichenfolge wird als Name für die Protokollschaltfläche auf der Popup-Seite verwendet."
},
"popup_html_log_head_title": {
"message": "Öffnet das Protokoll",
"description": ""
"description": "Diese Zeichenfolge wird als Titel für die Protokollschaltfläche auf der Popup-Seite verwendet."
},
"popup_html_report_button": {
"message": "Aktuelle URL melden",
"description": ""
"description": "Hinweis: Wird derzeit nicht verwendet."
},
"popup_html_report_button_title": {
"message": "Meldet die aktuelle URL aus diesem Tab.",
"description": ""
"description": "Wird derzeit nicht verwendet."
},
"core_save_on_disk": {
"message": "[ClearURLs]: Auf Festplatte gespeichert.",
"description": ""
"description": "Diese Zeichenfolge teilt dem Benutzer mit, dass ClearURLs die Einstellungen auf der Festplatte gespeichert hat."
},
"core_error": {
"message": "[ClearURLs]: Das Addon konnte nicht gestartet werden.",
"description": ""
"description": "Diese Zeichenfolge teilt dem Benutzer mit, dass ClearURLs nicht gestartet werden konnten."
},
"configs_switch_statistics": {
"message": "Statistiken",
"description": ""
"description": "Diese Zeichenfolge wird als Name für die Statistikschaltfläche auf der Popup-Seite verwendet."
},
"configs_switch_statistics_title": {
"message": "Aktiviert oder deaktiviert die Statistikfunktion",
"description": ""
"description": "Diese Zeichenfolge wird als Titel für die Statistikschaltfläche auf der Popup-Seite verwendet."
},
"settings_html_page_title": {
"message": "Einstellungen von ClearURLs",
"description": ""
"description": "Diese Zeichenfolge wird als Titel auf der Einstellungsseite verwendet."
},
"badged_color_label": {
"message": "Zählerfarbe",
"description": ""
"description": "Diese Zeichenfolge wird als Name für das Etikett mit den abgebildeten Farben verwendet."
},
"setting_html_reset_button": {
"message": "Zurücksetzen",
"description": ""
"description": "Diese Zeichenfolge wird als Name für die Schaltfläche zum Zurücksetzen auf der Einstellungsseite verwendet."
},
"setting_html_reset_button_title": {
"message": "Setzt alle Einstellungen zurück",
"description": ""
"description": "Diese Zeichenfolge wird als Titel für die Schaltfläche zum Zurücksetzen auf der Einstellungsseite verwendet."
},
"setting_rule_url_label": {
"message": "Die Url zu der data.json Datei (Regeln)",
"description": ""
"description": "Diese Zeichenfolge wird als Name für die Regel-URL-Bezeichnung verwendet."
},
"settings_html_save_button": {
"message": "Speichern & Addon neustarten",
"description": ""
"description": "Diese Zeichenfolge wird als Name für die Schaltfläche zum Speichern und erneuten Laden auf der Einstellungsseite verwendet."
},
"settings_html_save_button_title": {
"message": "Speichert die Einstellungen",
"description": ""
"description": "Diese Zeichenfolge wird als Titel für die Schaltfläche zum Speichern und erneuten Laden auf der Einstellungsseite verwendet."
},
"setting_hash_url_label": {
"message": "Die Url zu der rules.hash Datei (Hash)",
"description": ""
"description": "Diese Zeichenfolge wird als Name für die rule.hash URL verwendet."
},
"setting_types_label": {
"message": "<a href='https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/webRequest/ResourceType' target='_blank'>Request types</a> (Expertenniveau)",
"description": ""
"description": "Diese Zeichenfolge wird als Name für die Typenbezeichnung verwendet."
},
"setting_report_server_label": {
"message": "Meldungsserver für URLs",
"description": ""
"description": "Hinweis: Wird derzeit nicht verwendet."
},
"success_report_url": {
"message": "Die URL wurde erfolgreich gemeldet. Wir werden sie in Kürze prüfen.",
"description": ""
"description": "Hinweis: Wird derzeit nicht verwendet."
},
"error_report_url": {
"message": "Es schaut so aus, als ob diese URL schon gemeldet wurde.",
"description": ""
"description": "Hinweis: Wird derzeit nicht verwendet."
},
"donate_button": {
"message": "Eine Spende (Schenkung) für den ClearURLs Urheber.",
"description": ""
"description": "Diese Zeichenfolge wird verwendet, um auf eine Spendenseite zu verweisen."
},
"clipboard_copy_link": {
"message": "Gesäuberte Link-Adresse kopieren",
"description": "Diese Zeichenfolge wird im Kontextmenü zum Kopieren sauberer Links verwendet."
},
"context_menu_enabled": {
"message": "Kontextmenü-Eintrag anzeigen",
"description": "Mit dieser Zeichenfolge wird der Kontextmenüeintrag ein- und ausgeschaltet, um saubere Links zu kopieren."
},
"history_listener_enabled": {
"message": "Verhindere Tracking über die History-API (Siehe auch: <a href='https://developer.mozilla.org/en-US/docs/Web/API/History_API#The_replaceState()_method' target='_blank'>The replaceState() method</a>)",
"description": "Diese Zeichenfolge wird als Name für das History-API-Listener-Label verwendet."
},
"cleaning_tool_page_title": {
"message": "Säuberungswerkzeug von ClearURLs",
"description": "Diese Zeichenfolge wird als Titel auf der Reinigungswerkzeugseite verwendet."
},
"cleaning_tool_description": {
"message": "Mit diesem Werkzeug können Sie URLs in die Textbox einfügen. Nach einem klick auf den grünen Button reinigt ClearURLs die Links. Sie können mehrer URLs auf einmal einfügen, jede URL muss aber in einer eigenen Zeile stehen.",
"description": "Diese Zeichenfolge wird als Beschreibung des Reinigungswerkzeugs verwendet."
},
"cleaning_tool_btn": {
"message": "URLs säubern",
"description": "Diese Zeichenfolge wird als Name für die Schaltfläche \"URLs säubern\" verwendet."
},
"cleaning_tool_dirty_urls_label": {
"message": "Hier können Sie die ungesäuberten URLs einfügen:",
"description": "Diese Zeichenfolge wird als Titel auf der Seite des Bereinigungstools für die fehlerhaften URLs verwendet."
},
"cleaning_tool_clean_urls_label": {
"message": "Hier finden Sie die gesäuberten URLs:",
"description": "Diese Zeichenfolge wird als Titel auf der Bereinigungswerkzeugseite für die bereinigten URLs verwendet."
},
"local_hosts_skipping": {
"message": "Auslassen von lokalen URLs (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, 100.64.0.0/10, 169.254.0.0/16, 127.0.0.1, localhost)",
"description": "Diese Zeichenkette wird als Beschreibung für das Auslassen von lokalen URLs verwendet."
},
"local_hosts_skipping_title": {
"message": "Auslassen von lokalen URLs",
"description": "Diese Zeichenkette wird als Titel für das Auslassen von lokalen URLs verwendet."
},
"log_html_export_button": {
"message": "Exportieren",
"description": "Diese Zeichenfolge wird für die Schaltfläche zum Exportieren auf der Protokollseite verwendet."
},
"log_html_export_button_title": {
"message": "Exportieren des globalen Protokolls",
"description": "Diese Zeichenfolge wird als Titel für die Schaltfläche zum Exportieren auf der Protokollseite verwendet."
},
"log_html_import_button": {
"message": "Importieren",
"description": "Diese Zeichenfolge wird für die Schaltfläche zum Importieren auf der Protokollseite verwendet."
},
"log_html_import_button_title": {
"message": "Importieren des globalen Protokolls",
"description": "Diese Zeichenfolge wird als Titel für die Schaltfläche zum Importieren auf der Protokollseite verwendet."
},
"setting_html_export_button": {
"message": "Exportieren",
"description": "Diese Zeichenfolge wird als Name für die Schaltfläche zum Exportieren auf der Einstellungsseite verwendet."
},
"setting_html_export_button_title": {
"message": "Exportiert alle Einstellungen",
"description": "Diese Zeichenfolge wird als Titel für die Schaltfläche zum Exportieren auf der Einstellungsseite verwendet."
},
"setting_html_import_button": {
"message": "Importieren",
"description": "Diese Zeichenfolge wird als Name für die Schaltfläche zum Importieren auf der Einstellungsseite verwendet."
},
"setting_html_import_button_title": {
"message": "Importiert alle Einstellungen inkl. Regeln und Protokoll",
"description": "Diese Zeichenfolge wird als Titel für die Schaltfläche zum Importieren auf der Einstellungsseite verwendet."
},
"setting_log_limit_label": {
"message": "Limitiert das Protokoll auf $LIMIT$ Einträge. (-1 := ∞)",
"description": "Diese Zeichenfolge wird als Name für das Protokolllimit verwendet.",
"placeholders": {
"limit": {
"content": "$1",
"example": "100"
}
}
},
"blocked_html_title": {
"message": "Diese Seite wurde von <b>ClearURLs</b> blockiert.",
"description": "Diese Zeichenfolge wird als Titel auf der Hinweisseite für blockierte Seiten verwendet."
},
"blocked_html_body": {
"message": "Diese Seite wurde vom <b>ClearURLs</b> Add-On blockiert, weil wir sie als Werbe- bzw. Trackingservice identifiziert haben. Um diese Seite zu besuchen, müssen Sie das Add-On temporär deaktivieren oder in den Einstellungen von ClearURLs das Domain-Blocking deaktivieren. Dann können Sie auf den untenstehenden Button klicken, um die Seite aufzurufen.",
"description": "Diese Zeichenfolge wird als Mengentext auf der Hinweisseite für blockierte Seiten verwendet."
},
"blocked_html_button": {
"message": "Seite besuchen",
"description": "Diese Zeichenfolge wird als Buttontext auf der Hinweisseite für blockierte Seiten verwendet."
},
"referral_marketing_enabled": {
"message": "Erlaube Referral-Marketing",
"description": "Diese Zeichenkette wird als Beschreibung für das Referral-Marketing verwendet."
},
"referral_marketing_enabled_title": {
"message": "Erlaubt Referral-Marketing",
"description": "Diese Zeichenkette wird als Titel für das Referral-Marketing verwendet."
},
"watchdog": {
"message": "[ClearURLs]: Der Watchdog hat ein Problem festgestellt. ClearURLs wird neugestartet.",
"description": "Diese Zeichenkette wird als Text für den Watchdog verwendet."
},
"domain_blocking_enabled": {
"message": "Erlaube Domain-Blocking (Kann zu Problemen auf Seiten führen, die AdBlocker nicht erlauben)",
"description": "Diese Zeichenkette wird als Beschreibung für das Domain-Blocking verwendet."
},
"domain_blocking_enabled_title": {
"message": "Erlaube Domain-Blocking (Kann zu Problemen auf Seiten führen, die AdBlocker nicht erlauben)",
"description": "Diese Zeichenkette wird als Titel für das Domain-Blocking verwendet."
},
"log_ping_blocked": {
"message": "Diese Hyperlink Auditing Anfrage wurde blockiert",
"description": "Diese Zeichenfolge wird für blockierte Hyperlink Auditing Anfragen im ClearURL-Protokoll verwendet."
},
"ping_blocking_enabled": {
"message": "Blockiere Hyperlink Auditing Anfragen (Siehe auch <a href='https://html.spec.whatwg.org/multipage/links.html#hyperlink-auditing' target='_blank'>diese Spezifikation</a>)",
"description": "Diese Zeichenkette wird als Beschreibung für das Hyperlink Auditing-Blocking verwendet."
},
"ping_blocking_enabled_title": {
"message": "Blockiere Hyperlink Auditing Anfragen",
"description": "Diese Zeichenkette wird als Titel für das Hyperlink Auditing-Blocking verwendet."
}
}
}

View File

@@ -1,251 +1,328 @@
{
"hash_status_code_1": {
"message": "up to date",
"description": ""
"description": "This status code says, that no update is available for the ClearURLs rules and everything is up to date."
},
"hash_status_code_2": {
"message": "updated",
"description": ""
"description": "This status code says, that the ClearURLs rules are successfully updated."
},
"hash_status_code_3": {
"message": "update available",
"description": ""
"description": "This status code says, that an update is available for the ClearURLs rules."
},
"hash_status_code_4": {
"message": "error",
"description": ""
"description": "This status code says, that the ClearURLs could not be started correctly."
},
"hash_status_code_5": {
"message": "Oops something went wrong!",
"description": ""
"description": "This status code says, that an error occurred while updating the ClearURLs rules."
},
"log_redirect": {
"message": "This url is redirected",
"description": ""
"description": "This string is used on redirections in the ClearURLs log."
},
"log_domain_blocked": {
"message": "This domain is blocked",
"description": ""
"description": "This string is used on blocked domains in the ClearURLs log."
},
"check_os_log": {
"message": "[ClearURLs]: Log listener is added.",
"description": ""
"description": "This string is used on ClearURLs log startup."
},
"log_html_page_title": {
"message": "Log from ClearURLs",
"description": ""
"description": "This string is used as header on the log page."
},
"log_html_table_head_1": {
"message": "Before processing",
"description": ""
"description": "This string is used as table title on the log page."
},
"log_html_table_head_2": {
"message": "After processing",
"description": ""
"description": "This string is used as table title on the log page."
},
"log_html_table_head_3": {
"message": "Rule",
"description": ""
"description": "This string is used as table title on the log page."
},
"log_html_table_head_4": {
"message": "Time",
"description": ""
"description": "This string is used as table title on the log page."
},
"log_html_reset_button": {
"message": "Reset",
"description": ""
"description": "This string is used for the reset button on the log page."
},
"log_html_reset_button_title": {
"message": "Reset the global log",
"description": ""
"message": "Resets the global log",
"description": "This string is used as title for the reset button on the log page."
},
"popup_html_configs_head": {
"message": "Configs",
"description": ""
"description": "This string is used as title for the configs on the popup page."
},
"popup_html_configs_switch_filter": {
"message": "Filter",
"description": ""
"description": "This string is used as name for the filter switch button on the popup page."
},
"popup_html_configs_switch_filter_title": {
"message": "The filters switch activates the cleaning functionality of ClearURLs. If you disable this option, the whole addon is disabled",
"description": ""
"description": "This string is used as title for the filter switch button on the popup page."
},
"popup_html_configs_switch_log": {
"message": "Logging",
"description": ""
"description": "This string is used as name for the logging switch button on the popup page."
},
"popup_html_configs_switch_log_title": {
"message": "The log is saved only locally. We advise against this feature if you do not need it",
"description": ""
"description": "This string is used as title for the logging switch button on the popup page."
},
"popup_html_configs_switch_badges": {
"message": "Badges",
"description": ""
"description": "This string is used as name for the badges switch button on the popup page."
},
"popup_html_configs_switch_badges_title": {
"message": "Show number of cleaned urls",
"description": ""
"message": "Show numbers of cleaned urls",
"description": "This string is used as title for the badges switch button on the popup page."
},
"popup_html_statistics_head": {
"message": "Statistics",
"description": ""
"description": "This string is used as title for the statistics on the popup page."
},
"popup_html_statistics_elements": {
"message": "Elements",
"description": ""
"description": "This string is used as name for the elements on the popup page."
},
"popup_html_statistics_blocked": {
"message": "Blocked",
"description": ""
"description": "This string is used as name for the blocked elements on the popup page."
},
"popup_html_statistics_percentage": {
"message": "Percentage",
"description": ""
"description": "This string is used as name for the percentage of blocked elements on the popup page."
},
"popup_html_statistics_reset_button": {
"message": "Reset",
"description": ""
"description": "This string is used as name for the statistics reset button on the popup page."
},
"popup_html_statistics_reset_button_title": {
"message": "Reset the global statistics",
"description": ""
"description": "This string is used as title for the statistics reset button on the popup page."
},
"popup_html_rules_status_head": {
"message": "Rules-Status",
"description": ""
"description": "This string is used as title for the rules-status section on the popup page."
},
"popup_html_log_head": {
"message": "Log",
"description": ""
"description": "This string is used as name for the log button on the popup page."
},
"popup_html_log_head_title": {
"message": "Open the log",
"description": ""
"description": "This string is used as title for the log button on the popup page."
},
"popup_html_report_button": {
"message": "Report current URL",
"description": ""
"description": "Note: Currently not used."
},
"popup_html_report_button_title": {
"message": "Report the current URL from this tab.",
"description": ""
"description": "Currently not used."
},
"core_save_on_disk": {
"message": "[ClearURLs]: Save on disk.",
"description": ""
"description": "This string is used to tell the user, that ClearURLs saved the settings on disk."
},
"core_error": {
"message": "[ClearURLs]: The addon could not started.",
"description": ""
"message": "[ClearURLs]: The addon could not start.",
"description": "This string is used to tell the user, that ClearURLs could not be started."
},
"configs_switch_statistics": {
"message": "Statistics",
"description": ""
"description": "This string is used as name for the statistics switch button on the popup page."
},
"configs_switch_statistics_title": {
"message": "Activate or deactivate the statistics function",
"description": ""
"description": "This string is used as title for the statistics switch button on the popup page."
},
"settings_html_page_title": {
"message": "Settings from ClearURLs",
"description": ""
"message": "ClearURLs settings",
"description": "This string is used as title on the settings page."
},
"badged_color_label": {
"message": "Badged color",
"description": ""
"message": "Badge color",
"description": "This string is used as name for the badged color label."
},
"setting_html_reset_button": {
"message": "Reset",
"description": ""
"description": "This string is used as name for the reset button on the settings page."
},
"setting_html_reset_button_title": {
"message": "Reset everything",
"description": ""
"message": "Resets everything",
"description": "This string is used as title for the reset button on the settings page."
},
"setting_rule_url_label": {
"message": "The url to the data.json file (rules)",
"description": ""
"description": "This string is used as name for the rule url label."
},
"settings_html_save_button": {
"message": "Save & reload addon",
"description": ""
"description": "This string is used as name for the save&reload button on the settings page."
},
"settings_html_save_button_title": {
"message": "Saves the settings",
"description": ""
"description": "This string is used as title for the save&reload button on the settings page."
},
"setting_hash_url_label": {
"message": "The url to the rules.hash file (hash)",
"description": ""
"description": "This string is used as name for the rule.hash url label."
},
"setting_types_label": {
"message": "<a href='https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/webRequest/ResourceType' target='_blank'>Request types</a> (expert level)",
"description": ""
"description": "This string is used as name for the types label."
},
"setting_report_server_label": {
"message": "Report server for URLs",
"description": ""
"description": "Note: Currently not used."
},
"success_report_url": {
"message": "The URL was successfully reported. We will check this URL soon.",
"description": ""
"description": "Note: Currently not used."
},
"error_report_url": {
"message": "It seems like this URL has already been reported.",
"description": ""
"description": "Note: Currently not used."
},
"donate_button": {
"message": "A donation for the ClearURLs creator.",
"description": ""
"description": "This string is used to refer to a donation page."
},
"clipboard_copy_link": {
"message": "Copy Clean Link Location",
"description": "This string is used in the context menu to copy clean links."
},
"context_menu_enabled": {
"message": "Display context menu entry",
"description": "This string is used toggle the context menu entry to copy clean links."
},
"history_listener_enabled": {
"message": "Prevent tracking injection over history API (See also: <a href='https://developer.mozilla.org/en-US/docs/Web/API/History_API#The_replaceState()_method' target='_blank'>The replaceState() method</a>)",
"description": "This string is used as name for the history API listener label."
},
"cleaning_tool_page_title": {
"message": "ClearURLs cleaning tool",
"description": "This string is used as title on the cleaning tool page."
},
"cleaning_tool_description": {
"message": "With this tool you can paste in URLs and ClearURLs will clean the URLs after a click on the green button. You can paste in multiple URLs at once, but every URL must be on a separate line.",
"description": "This string is used as description of the cleaning tool."
},
"cleaning_tool_btn": {
"message": "Clean URLs",
"description": "This string is used as name for the clean url button."
},
"cleaning_tool_dirty_urls_label": {
"message": "Here you can paste in the dirty URLs:",
"description": "This string is used as title on the cleaning tool page for the dirty URLs."
},
"cleaning_tool_clean_urls_label": {
"message": "Here you can find the cleaned URLs:",
"description": "This string is used as title on the cleaning tool page for the clean URLs."
},
"local_hosts_skipping": {
"message": "Skip URLs on local hosts (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, 100.64.0.0/10, 169.254.0.0/16, 127.0.0.1, localhost)",
"description": "This string is used as label for the local host skipping switch"
},
"local_hosts_skipping_title": {
"message": "Skips URLs on local hosts",
"description": "This string is used as title for the local host skipping switch"
},
"log_html_export_button": {
"message": "Export",
"description": "This string is used for the export button on the log page."
},
"log_html_export_button_title": {
"message": "Exports the global log",
"description": "This string is used as title for the export button on the log page."
},
"log_html_import_button": {
"message": "Import",
"description": "This string is used for the import button on the log page."
},
"log_html_import_button_title": {
"message": "Import the global log",
"description": "This string is used as title for the import button on the log page."
},
"setting_html_export_button": {
"message": "Export",
"description": "This string is used as name for the export button on the settings page."
},
"setting_html_export_button_title": {
"message": "Exports everything",
"description": "This string is used as title for the export button on the settings page."
},
"setting_html_import_button": {
"message": "Import",
"description": "This string is used as name for the reset button on the settings page."
},
"setting_html_import_button_title": {
"message": "Imports everything",
"description": "This string is used as title for the import button on the settings page."
},
"setting_log_limit_label": {
"message": "Limit the log to $LIMIT$ entries. (-1 := ∞)",
"description": "This string is used as name for the log limit label.",
"placeholders": {
"limit": {
"content": "$1",
"example": "100"
}
}
},
"blocked_html_title": {
"message": "This site was blocked by <b>ClearURLs</b>",
"description": "This string is used as title on the blocked site page."
},
"blocked_html_body": {
"message": "This site was blocked by the <b>ClearURLs</b> Add-on, because we identify this site as an advertising and/or tracking service. To visit this site, you must temporarily deactivate the Add-on or disable domain blocking in the ClearURLs settings. After this you can click on the button below to load the page.",
"description": "This string is used as body on the blocked site page."
},
"blocked_html_button": {
"message": "Visit page",
"description": "This string is used as button on the blocked site page."
},
"referral_marketing_enabled": {
"message": "Allow referral marketing",
"description": "This string is used as label for the referral marketing switch"
},
"referral_marketing_enabled_title": {
"message": "Allows referral marketing",
"description": "This string is used as title for the referral marketing switch"
},
"watchdog": {
"message": "[ClearURLs]: The watchdog has detected a problem. ClearURLs is restarting.",
"description": "This string is used as text for the watchdog"
},
"domain_blocking_enabled": {
"message": "Allow domain blocking (Can lead to problems on pages that do not allow AdBlockers)",
"description": "This string is used as label for the domain blocking switch"
},
"domain_blocking_enabled_title": {
"message": "Allow domain blocking (Can lead to problems on pages that do not allow AdBlockers)",
"description": "This string is used as title for the domain blocking switch"
},
"log_ping_blocked": {
"message": "This hyperlink auditing was blocked",
"description": "This string is used on hyperlink auditing in the ClearURLs log."
},
"ping_blocking_enabled": {
"message": "Block hyperlink auditing (See also <a href='https://html.spec.whatwg.org/multipage/links.html#hyperlink-auditing' target='_blank'>this article</a>)",
"description": "This string is used as label for the hyperlink auditing blocking switch"
},
"ping_blocking_enabled_title": {
"message": "Block hyperlink auditing",
"description": "This string is used as title for the hyperlink auditing blocking switch"
}
}
}

View File

@@ -1,216 +1,328 @@
{
"hash_status_code_1": {
"message": "atualizado",
"description": ""
"message": "actualizado",
"description": "This status code says, that no update is available for the ClearURLs rules and everything is up to date."
},
"hash_status_code_2": {
"message": "atualizado",
"description": ""
"message": "actualizado",
"description": "This status code says, that the ClearURLs rules are successfully updated."
},
"hash_status_code_3": {
"message": "atualização disponivel",
"description": ""
"message": "actualización disponible",
"description": "This status code says, that an update is available for the ClearURLs rules."
},
"hash_status_code_4": {
"message": "erro",
"description": ""
"message": "error",
"description": "This status code says, that the ClearURLs could not be started correctly."
},
"hash_status_code_5": {
"message": "Oops, algo deu errado!",
"description": ""
"message": "¡Vaya, algo ha ido mal!",
"description": "This status code says, that an error occurred while updating the ClearURLs rules."
},
"log_redirect": {
"message": "Esta url foi redirecionada",
"description": ""
"message": "Esta dirección ha sido redirigida",
"description": "This string is used on redirections in the ClearURLs log."
},
"log_domain_blocked": {
"message": "Este domínio foi bloqueado",
"description": ""
"message": "Este dominio está bloqueado",
"description": "This string is used on blocked domains in the ClearURLs log."
},
"check_os_log": {
"message": "[ClearURLs]: Examinador de registro foi adicionado",
"description": ""
"message": "[ClearURLs]: Registro activado.",
"description": "This string is used on ClearURLs log startup."
},
"log_html_page_title": {
"message": "Registro do ClearURLs",
"description": ""
"message": "Registro de ClearURLs",
"description": "This string is used as header on the log page."
},
"log_html_table_head_1": {
"message": "Antes de processar",
"description": ""
"message": "Antes de procesar",
"description": "This string is used as table title on the log page."
},
"log_html_table_head_2": {
"message": "Depois de processar",
"description": ""
"message": "Tras procesar",
"description": "This string is used as table title on the log page."
},
"log_html_table_head_3": {
"message": "Regra",
"description": ""
"message": "Regla",
"description": "This string is used as table title on the log page."
},
"log_html_table_head_4": {
"message": "Tempo",
"description": ""
"message": "Hora",
"description": "This string is used as table title on the log page."
},
"log_html_reset_button": {
"message": "Resetar",
"description": ""
"message": "Reiniciar",
"description": "This string is used for the reset button on the log page."
},
"log_html_reset_button_title": {
"message": "Resetar o registro global",
"description": ""
"message": "Reiniciar el registro general",
"description": "This string is used as title for the reset button on the log page."
},
"popup_html_configs_head": {
"message": "Configurações",
"description": ""
"message": "Configuraciones",
"description": "This string is used as title for the configs on the popup page."
},
"popup_html_configs_switch_filter": {
"message": "Filtrar",
"description": ""
"message": "Filtrado",
"description": "This string is used as name for the filter switch button on the popup page."
},
"popup_html_configs_switch_filter_title": {
"message": "O botão filtrar ativa a funcionalidade de limpeza do ClearURLs. Se você desativar essa opção toda a extensão é desativada",
"description": ""
"message": "Este interruptor activa la funcionalidad de filtrado de ClearURLs. Si se deshabilita, el complemento entero dejará de operar.",
"description": "This string is used as title for the filter switch button on the popup page."
},
"popup_html_configs_switch_log": {
"message": "Registro",
"description": ""
"description": "This string is used as name for the logging switch button on the popup page."
},
"popup_html_configs_switch_log_title": {
"message": "O registro é salvo localmente apenas. Aconselhamos contra este recurso se você não precisa dele",
"description": ""
"message": "El registro sólo se guarda localmente. No recomendamos activarlo a menos que la necesites.",
"description": "This string is used as title for the logging switch button on the popup page."
},
"popup_html_configs_switch_badges": {
"message": "Contador",
"description": ""
"description": "This string is used as name for the badges switch button on the popup page."
},
"popup_html_configs_switch_badges_title": {
"message": "Mostrar número de urls limpas",
"description": ""
"message": "Muestra el número de direcciones modificadas.",
"description": "This string is used as title for the badges switch button on the popup page."
},
"popup_html_statistics_head": {
"message": "Estatísticas",
"description": ""
"message": "Estadísticas",
"description": "This string is used as title for the statistics on the popup page."
},
"popup_html_statistics_elements": {
"message": "Elementos",
"description": ""
"description": "This string is used as name for the elements on the popup page."
},
"popup_html_statistics_blocked": {
"message": "Bloqueado",
"description": ""
"message": "Bloqueados",
"description": "This string is used as name for the blocked elements on the popup page."
},
"popup_html_statistics_percentage": {
"message": "Porcentagem",
"description": ""
"message": "Porcentaje",
"description": "This string is used as name for the percentage of blocked elements on the popup page."
},
"popup_html_statistics_reset_button": {
"message": "Resetar",
"description": ""
"message": "Reiniciar",
"description": "This string is used as name for the statistics reset button on the popup page."
},
"popup_html_statistics_reset_button_title": {
"message": "Resetar as estatísticas globais",
"description": ""
"message": "Reinicia las estadísticas generales",
"description": "This string is used as title for the statistics reset button on the popup page."
},
"popup_html_rules_status_head": {
"message": "Estado das regras",
"description": ""
"message": "Reglas",
"description": "This string is used as title for the rules-status section on the popup page."
},
"popup_html_log_head": {
"message": "Registro",
"description": ""
"description": "This string is used as name for the log button on the popup page."
},
"popup_html_log_head_title": {
"message": "Abrir o registro",
"description": ""
"message": "Abre el registro.",
"description": "This string is used as title for the log button on the popup page."
},
"popup_html_report_button": {
"message": "Notificar dirección actual",
"description": "Note: Currently not used."
},
"popup_html_report_button_title": {
"message": "Notifica sobre la dirección de la pestaña actual.",
"description": "Currently not used."
},
"core_save_on_disk": {
"message": "[ClearURLs]: Salvar no disco.",
"description": ""
"message": "[ClearURLs]: Guardar a disco.",
"description": "This string is used to tell the user, that ClearURLs saved the settings on disk."
},
"core_error": {
"message": "[ClearURLs]: A extensão não pode ser inicializada.",
"description": ""
"message": "[ClearURLs]: El complemento no ha podido arrancar.",
"description": "This string is used to tell the user, that ClearURLs could not be started."
},
"configs_switch_statistics": {
"message": "Estatísticas",
"description": ""
"message": "Estadísticas",
"description": "This string is used as name for the statistics switch button on the popup page."
},
"configs_switch_statistics_title": {
"message": "Ativar ou desativar função de estatísticas",
"description": ""
"message": "Habilita o deshabilita las estadísticas",
"description": "This string is used as title for the statistics switch button on the popup page."
},
"settings_html_page_title": {
"message": "Configurações do ClearURLs",
"description": ""
"message": "Ajustes de ClearURLs",
"description": "This string is used as title on the settings page."
},
"badged_color_label": {
"message": "Cor do contador",
"description": ""
"message": "Color del contador",
"description": "This string is used as name for the badged color label."
},
"setting_html_reset_button": {
"message": "Resetar",
"description": ""
"message": "Reiniciar",
"description": "This string is used as name for the reset button on the settings page."
},
"setting_html_reset_button_title": {
"message": "Resetar tudo",
"description": ""
"message": "Reinicia el complemento entero.",
"description": "This string is used as title for the reset button on the settings page."
},
"setting_rule_url_label": {
"message": "Url do arquivo data.json (regras)",
"description": ""
"message": "Dirección al fichero data.json de reglas",
"description": "This string is used as name for the rule url label."
},
"settings_html_save_button": {
"message": "Salvar e recarregar extensão",
"description": ""
"message": "Guardar y aplicar",
"description": "This string is used as name for the save&reload button on the settings page."
},
"settings_html_save_button_title": {
"message": "Salvar configurações",
"description": ""
"message": "Guarda los ajustes.",
"description": "This string is used as title for the save&reload button on the settings page."
},
"setting_hash_url_label": {
"message": "Url do arquivo rules.hash (hash)",
"description": ""
"message": "Dirección al fichero rules.hash (hash)",
"description": "This string is used as name for the rule.hash url label."
},
"setting_types_label": {
"message": "<a href='https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/webRequest/ResourceType' target='_blank'>Solicitar tipos</a> (nivel experto)",
"description": "This string is used as name for the types label."
},
"setting_report_server_label": {
"message": "Servidor de notificado de direcciones",
"description": "Note: Currently not used."
},
"success_report_url": {
"message": "La dirección ha sido enviada satisfactoriamente. La comprobaremos en breves.",
"description": "Note: Currently not used."
},
"error_report_url": {
"message": "Parece que esta dirección ya había sido notificada.",
"description": "Note: Currently not used."
},
"donate_button": {
"message": "Donar al creador de ClearURLs.",
"description": "This string is used to refer to a donation page."
},
"clipboard_copy_link": {
"message": "Copiar ubicación actual limpia",
"description": "This string is used in the context menu to copy clean links."
},
"context_menu_enabled": {
"message": "Mostrar en el menú contextual",
"description": "This string is used toggle the context menu entry to copy clean links."
},
"history_listener_enabled": {
"message": "Evitar inyección mediante la API del historial (información técnica en <a href='https://developer.mozilla.org/en-US/docs/Web/API/History_API#The_replaceState()_method' target='_blank'>el método replaceState()</a>)",
"description": "This string is used as name for the history API listener label."
},
"cleaning_tool_page_title": {
"message": "Herramienta de filtrado de ClearURLs",
"description": "This string is used as title on the cleaning tool page."
},
"cleaning_tool_description": {
"message": "Con esta herramienta puedes filtrar múltiples direcciones de un plumazo. Simplemente pégalas en la caja de abajo, con una dirección por línea, y pulsa sobre el botón verde.",
"description": "This string is used as description of the cleaning tool."
},
"cleaning_tool_btn": {
"message": "Filtrar direcciones",
"description": "This string is used as name for the clean url button."
},
"cleaning_tool_dirty_urls_label": {
"message": "Aquí puedes pegar las direcciones con metadatos:",
"description": "This string is used as title on the cleaning tool page for the dirty URLs."
},
"cleaning_tool_clean_urls_label": {
"message": "Aquí aparecerán las direcciones filtradas:",
"description": "This string is used as title on the cleaning tool page for the clean URLs."
},
"local_hosts_skipping": {
"message": "Omitir filtrado en redes locales (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, 100.64.0.0/10, 169.254.0.0/16, 127.0.0.1, localhost)",
"description": "This string is used as label for the local host skipping switch"
},
"local_hosts_skipping_title": {
"message": "Omitir filtrado en local",
"description": "This string is used as title for the local host skipping switch"
},
"log_html_export_button": {
"message": "Exportar",
"description": "This string is used for the export button on the log page."
},
"log_html_export_button_title": {
"message": "Exporta el registro general",
"description": "This string is used as title for the export button on the log page."
},
"log_html_import_button": {
"message": "Importar",
"description": "This string is used for the import button on the log page."
},
"log_html_import_button_title": {
"message": "Importar el registro general",
"description": "This string is used as title for the import button on the log page."
},
"setting_html_export_button": {
"message": "Exportar",
"description": "This string is used as name for the export button on the settings page."
},
"setting_html_export_button_title": {
"message": "Exporta todo.",
"description": "This string is used as title for the export button on the settings page."
},
"setting_html_import_button": {
"message": "Importar",
"description": "This string is used as name for the reset button on the settings page."
},
"setting_html_import_button_title": {
"message": "Importar todo.",
"description": "This string is used as title for the import button on the settings page."
},
"setting_log_limit_label": {
"message": "Limitar el tamaño del registro a $LIMIT$ eventos. (-1 := ∞)",
"description": "This string is used as name for the log limit label.",
"placeholders": {
"limit": {
"content": "$1",
"example": "100"
}
}
},
"blocked_html_title": {
"message": "Este sitio ha sido bloqueado por <b>ClearURLs</b>",
"description": "This string is used as title on the blocked site page."
},
"blocked_html_body": {
"message": "Este sitio ha sido bloqueado por el complemento <b>ClearURLs</b> porque hemos detectado que se trata de un sitio empleado para publicidad o seguimiento. Si deseas aun así visitarlo, tendrás que deshabilitar temporalmente el complemento o desabilitar el bloqueo de dominios en los ajustes, y después pulsar el botón de abajo.",
"description": "This string is used as body on the blocked site page."
},
"blocked_html_button": {
"message": "Visitar página",
"description": "This string is used as button on the blocked site page."
},
"referral_marketing_enabled": {
"message": "Permitir márketing de referidos",
"description": "This string is used as label for the referral marketing switch"
},
"referral_marketing_enabled_title": {
"message": "Permitir márketing de referidos",
"description": "This string is used as title for the referral marketing switch"
},
"watchdog": {
"message": "[ClearURLs]: El watchdog detectado un problema. ClearURLs será reiniciado.",
"description": "This string is used as text for the watchdog"
},
"domain_blocking_enabled": {
"message": "Permitir bloqueo de dominios (Puede provocar problemas con sitios que no permitan bloqueadores de anuncios)",
"description": "This string is used as label for the domain blocking switch"
},
"domain_blocking_enabled_title": {
"message": "Permitir bloqueo de dominios (Puede provocar problemas con sitios que no permitan bloqueadores de anuncios)",
"description": "This string is used as title for the domain blocking switch"
},
"log_ping_blocked": {
"message": "La auditoría de este hipervínculo ha sido bloqueada",
"description": "This string is used on hyperlink auditing in the ClearURLs log."
},
"ping_blocking_enabled": {
"message": "Bloquear auditoría de hipervínculos (más información en inglés en <a href='https://html.spec.whatwg.org/multipage/links.html#hyperlink-auditing' target='_blank'>este artículo</a>)",
"description": "This string is used as label for the hyperlink auditing blocking switch"
},
"ping_blocking_enabled_title": {
"message": "Bloquear auditoría de hipervínculos",
"description": "This string is used as title for the hyperlink auditing blocking switch"
}
}
}

View File

@@ -1,251 +1,328 @@
{
"hash_status_code_1": {
"message": "Mise à jour",
"description": ""
"message": "à jour",
"description": "Les règles ClearURLs sont parfaitement à jour."
},
"hash_status_code_2": {
"message": "Mis à jour",
"description": ""
"message": "mis à jour",
"description": "Cela indique la réussite des mises à jour des règles de ClearURLs."
},
"hash_status_code_3": {
"message": "Mise à jour disponible",
"description": ""
"message": "mise à jour disponible",
"description": "Une mis à jour pour les règles de ClearURLs sont disponibles."
},
"hash_status_code_4": {
"message": "erreur",
"description": ""
"description": "ClearURLs na pas pu démarrer adéquatement pour son bon fonctionnement."
},
"hash_status_code_5": {
"message": "Quelque chose a dysfonctionné, mais quoi ...",
"description": ""
"message": "Quelque chose a dysfonctionné",
"description": "Pendant la mis à jour des règles ClearURLs un dysfonctionnement est survenue."
},
"log_redirect": {
"message": "Ce lien Internet a été redirigé",
"description": ""
"message": "Cette URL a été redirigée",
"description": "Cette chaîne est utilisée pour les redirections dans le protocole ClearURL."
},
"log_domain_blocked": {
"message": "Ce domaine est bloqué",
"description": ""
"description": "Cette chaîne est utilisée sur les domaines bloqués dans le journal de ClearURLs."
},
"check_os_log": {
"message": "[ClearURLs]: Une base de données pour les URL a été ajoutée",
"description": ""
"description": "Cette chaîne est utilisée au démarrage du journal de ClearURL."
},
"log_html_page_title": {
"message": "Connexion à partir de ClearURLs",
"description": ""
"message": "Journaux de ClearURLs",
"description": "Cette chaîne est utilisée comme en-tête sur la page de journal."
},
"log_html_table_head_1": {
"message": "Avant le processus de traitement",
"description": ""
"message": "Avant traitement",
"description": "Cette chaîne est utilisée comme titre de tableau sur la page de journal."
},
"log_html_table_head_2": {
"message": "Après le processus de traitement. ",
"description": ""
"message": "Après traitement. ",
"description": "Cette chaîne est utilisée comme titre de tableau sur la page de journal."
},
"log_html_table_head_3": {
"message": "Règle",
"description": ""
"description": "Cette chaîne est utilisée comme titre de tableau sur la page de journal."
},
"log_html_table_head_4": {
"message": "Temps",
"description": ""
"description": "Cette chaîne est utilisée comme titre de tableau sur la page de journal."
},
"log_html_reset_button": {
"message": "Remise à létat initial",
"description": ""
"message": "Remise à zéro",
"description": "Cette chaîne est utilisée comme titre de tableau sur la page de journal."
},
"log_html_reset_button_title": {
"message": "Réinitialiser la base de données",
"description": ""
"message": "Réinitialiser les journaux globaux",
"description": "Cette chaîne est utilisée comme titre pour le bouton de réinitialisation sur la page de journal."
},
"popup_html_configs_head": {
"message": "Paramétrages",
"description": ""
"description": "Cette chaîne est utilisée comme titre pour les paramétrages sur la page qui affiche les options."
},
"popup_html_configs_switch_filter": {
"message": "Filtre",
"description": ""
"description": "Cette chaîne est utilisée comme nom pour le bouton de changement de filtre sur la page qui affiche les options."
},
"popup_html_configs_switch_filter_title": {
"message": "Le commutateur de l'extension active ou désactive la fonction de nettoyage de ClearURLs",
"description": ""
"description": "Cette chaîne est utilisée comme titre pour le bouton de changement de filtre sur la page qui affiche les options."
},
"popup_html_configs_switch_log": {
"message": "Historique",
"description": ""
"message": "Journalisation",
"description": "Cette chaîne est utilisée comme nom pour le bouton du commutateur de journalisation sur la page qui affiche les options."
},
"popup_html_configs_switch_log_title": {
"message": "L'historique est enregistré localement. Si vous navez pas besoin de le consulter, nous déconseillons de lactiver",
"description": ""
"message": "Les journaux sont enregistrés localement. Si vous navez pas besoin de les consulter, nous déconseillons de les activer",
"description": "Cette chaîne est utilisée comme titre pour le bouton du commutateur de journalisation sur la page qui affiche les options."
},
"popup_html_configs_switch_badges": {
"message": "Compteur",
"description": ""
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
},
"popup_html_configs_switch_badges_title": {
"message": "Nombre de liens Internet nettoyés",
"description": ""
"message": "Afficher le nombre d'URL nettoyées",
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
},
"popup_html_statistics_head": {
"message": "Statistiques",
"description": ""
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
},
"popup_html_statistics_elements": {
"message": "Liens Internet",
"description": ""
"message": "Éléments",
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
},
"popup_html_statistics_blocked": {
"message": "Nb. de bloqués",
"description": ""
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
},
"popup_html_statistics_percentage": {
"message": "Pourcentage",
"description": ""
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
},
"popup_html_statistics_reset_button": {
"message": "Remettre à zéro",
"description": ""
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
},
"popup_html_statistics_reset_button_title": {
"message": "Remettre à zéro le décompte, les statistiques",
"description": ""
"message": "Remettre à zéro les statistiques globales",
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
},
"popup_html_rules_status_head": {
"message": "Règles de la base de données",
"description": ""
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
},
"popup_html_log_head": {
"message": "Compte-rendu",
"description": ""
"message": "Journaux",
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
},
"popup_html_log_head_title": {
"message": "Ouvrir le compte-rendu",
"description": ""
"message": "Ouvrir les journaux",
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
},
"popup_html_report_button": {
"message": "Signaler cette URL",
"description": ""
"description": "Annotation : actuellement non utilisé."
},
"popup_html_report_button_title": {
"message": "Signaler le dysfonctionnement sur cette URL",
"description": ""
"message": "Signaler un dysfonctionnement sur cette URL",
"description": "actuellement non utilisé."
},
"core_save_on_disk": {
"message": "[ClearURLs]: Sauvegarder sur le disque",
"description": ""
"message": "[ClearURLs]: Sauvegarder sur le disque.",
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
},
"core_error": {
"message": "[ClearURLs]: Lextension na pu être démarrée",
"description": ""
"message": "[ClearURLs]: Lextension na pu être démarrée.",
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
},
"configs_switch_statistics": {
"message": "Statistiques",
"description": ""
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
},
"configs_switch_statistics_title": {
"message": "Activer ou désactiver les statistiques",
"description": ""
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
},
"settings_html_page_title": {
"message": "Paramétrages de ClearURLs",
"description": ""
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
},
"badged_color_label": {
"message": "Couleur du compteur",
"description": ""
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
},
"setting_html_reset_button": {
"message": "Remettre à létat initial",
"description": ""
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
},
"setting_html_reset_button_title": {
"message": "Réinitialisation de tous les paramètres",
"description": ""
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
},
"setting_rule_url_label": {
"message": "Lien Internet du fichier Data (basse de données)",
"description": ""
"message": "L'URL du fichier data.json (règles)",
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
},
"settings_html_save_button": {
"message": "Sauvegarder et redémarrer lextension",
"description": ""
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
},
"settings_html_save_button_title": {
"message": "Sauvegarder les paramétrages",
"description": ""
"message": "Sauvegarde les paramétrages",
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
},
"setting_hash_url_label": {
"message": "Lien Internet du fichier Hash (signature de contrôle)",
"description": ""
"message": "L'URL du fichier rules.hash (signature de contrôle)",
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
},
"setting_types_label": {
"message": "<a href='https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/webRequest/ResourceType' target='_blank'>Demande de données (webRequest)</a> (Uniquement si vous maitrisez la programmation)",
"description": ""
"message": "<a href='https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/webRequest/ResourceType' target='_blank'>Types de requête (webRequest)</a> (niveau expert)",
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
},
"setting_report_server_label": {
"message": "Serveur pour signaler des URLs",
"description": ""
"message": "Serveur pour signaler des URL",
"description": "Annotation : actuellement non utilisé."
},
"success_report_url": {
"message": "Nous avons reçu votre signalement. Nous allons vérifier cette URL",
"description": ""
"message": "Nous avons reçu votre signalement. Nous allons vérifier cette URL.",
"description": "Annotation : actuellement non utilisé."
},
"error_report_url": {
"message": "Il semble que cette URL a déjà été signalée",
"description": ""
"message": "Il semble que cette URL a déjà été signalée.",
"description": "Annotation : actuellement non utilisé."
},
"donate_button": {
"message": "Subventionner le développeur de ClearURLs",
"description": ""
"message": "Subventionner le créateur de ClearURLs.",
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
},
"clipboard_copy_link": {
"message": "Copier lURL sans le traqueur",
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
},
"context_menu_enabled": {
"message": "Activer ClearUrls dans le menu contextuel (le clic droit sur une page)",
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
},
"history_listener_enabled": {
"message": "Empêcher les sites daller fouiner dans l'historique. (<a href='https://developer.mozilla.org/fr/docs/Web/Guide/DOM/Manipuler_historique_du_navigateur' target='_blank'>La méthode utilisée est replaceState()</a>)",
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
},
"cleaning_tool_page_title": {
"message": "Outil de nettoyage pour ClearURLs",
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
},
"cleaning_tool_description": {
"message": "Ici, vous pouvez déposer des URL et ClearURLs les nettoiera par un clic sur le bouton vert. Vous pouvez mettre plusieurs URL mais chaque URL devra être mise sur une ligne séparée.",
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
},
"cleaning_tool_btn": {
"message": "Nettoyer les URL",
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
},
"cleaning_tool_dirty_urls_label": {
"message": "Coller ici les URL à nettoyer :",
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
},
"cleaning_tool_clean_urls_label": {
"message": "Vous trouverez ici les URL nettoyées :",
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
},
"local_hosts_skipping": {
"message": "Ignorer les IP sur les hôtes locaux, Box, routeur, serveur, etc. (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, 100.64.0.0/10, 169.254.0.0/16, 127.0.0.1, localhost)",
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
},
"local_hosts_skipping_title": {
"message": "Ignorer les IP ou URL sur les hôtes locaux, Box, routeur, serveur ...",
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
},
"log_html_export_button": {
"message": "Exporter",
"description": "Cette chaîne est utilisée pour le bouton d'exportation sur la page du journal."
},
"log_html_export_button_title": {
"message": "Exporter le journal",
"description": "Cette chaîne est utilisée comme titre pour le bouton d'exportation de la page du journal."
},
"log_html_import_button": {
"message": "Importer",
"description": "Cette chaîne est utilisée pour le bouton d'importation sur la page de journal."
},
"log_html_import_button_title": {
"message": "Importer le journal",
"description": "Cette chaîne est utilisée comme titre pour le bouton d'importation sur la page de journal."
},
"setting_html_export_button": {
"message": "Exporter",
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
},
"setting_html_export_button_title": {
"message": "Tout exporter",
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
},
"setting_html_import_button": {
"message": "Importer",
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
},
"setting_html_import_button_title": {
"message": "Tout importer",
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
},
"setting_log_limit_label": {
"message": "Nombre déléments à enregistrer dans le journal, $LIMIT$ de -1 à linfini (-1 := ∞)",
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options.",
"placeholders": {
"limit": {
"content": "$1",
"example": "100"
}
}
},
"blocked_html_title": {
"message": "Site Internet bloqué par <b>ClearURLs</b>",
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
},
"blocked_html_body": {
"message": "Ce site Internet a été bloqué par lextension <b>ClearURLs</b> ; il est identifié comme étant problématique, soit publicitaire, soit despionnage ; vous pouvez désactiver temporairement le blocage du site dans les paramétrages, soit lextension, afin de vous y connecter. Il vous faudra recharger la page, soit par le navigateur, soit avec le bouton ci-dessous.",
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
},
"blocked_html_button": {
"message": "Se connecter",
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
},
"referral_marketing_enabled": {
"message": "Permettre certaines actions commerciales",
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
},
"referral_marketing_enabled_title": {
"message": "Permettre certaines actions commerciales",
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
},
"watchdog": {
"message": "[ClearURLs]: Temps ou délais dexécution imparti dépassé. ClearURLs doit redémarrer.",
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
},
"domain_blocking_enabled": {
"message": "Bloquer les atteintes à la vie privée. Cependant, des sites décèlent la technique de protection et dysfonctionnent délibérément ou affichent des avertissements",
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
},
"domain_blocking_enabled_title": {
"message": "Autoriser le blocage de domaine (ex : example.com) ; peut poser des problèmes d'affichage sur des sites refusant les bloqueurs de contenu",
"description": "Cette chaîne est utilisée comme titre pour le commutateur de blocage de domaine"
},
"log_ping_blocked": {
"message": "Bloquer lespionnage des clics souris sur les liens hypertextes",
"description": "Cette chaîne est utilisée pour de l'audit (espionnage) des liens hypertextes dans le journal ClearURLs."
},
"ping_blocking_enabled": {
"message": "Bloquer lespionnage des clics souris sur les liens hypertextes (voyez <a href='https://html.spec.whatwg.org/multipage/links.html#hyperlink-auditing' target='_blank'>cet article en anglais</a>)",
"description": "Utilisé pour le bouton activer/désactiver l'audit (espionnages) des liens hypertextes"
},
"ping_blocking_enabled_title": {
"message": "Bloquer lespionnage des clics souris sur les liens hypertextes",
"description": "Utilisé pour le bouton activer/désactiver de l'audit (espionnages) des liens hypertextes"
}
}
}

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

@@ -0,0 +1,218 @@
{
"hash_status_code_1": {
"message": "naprakész",
"description": "This status code says, that no update is available for the ClearURLs rules and everything is up to date."
},
"hash_status_code_2": {
"message": "frissítve",
"description": "This status code says, that the ClearURLs rules are successfully updated."
},
"hash_status_code_3": {
"message": "frissítés érhető el",
"description": "This status code says, that an update is available for the ClearURLs rules."
},
"hash_status_code_4": {
"message": "hiba",
"description": "This status code says, that the ClearURLs could not be started correctly."
},
"hash_status_code_5": {
"message": "Hoppá, valami nincs rendben!",
"description": "This status code says, that an error occurred while updating the ClearURLs rules."
},
"log_redirect": {
"message": "Ez az url átirányítva",
"description": "This string is used on redirections in the ClearURLs log."
},
"log_domain_blocked": {
"message": "A domain blokkolva",
"description": "This string is used on blocked domains in the ClearURLs log."
},
"check_os_log": {
"message": "[ClearURLs]: naplózás elindult.",
"description": "This string is used on ClearURLs log startup."
},
"log_html_page_title": {
"message": "ClearURLs napló",
"description": "This string is used as header on the log page."
},
"log_html_table_head_1": {
"message": "Feldolgozás előtt",
"description": "This string is used as table title on the log page."
},
"log_html_table_head_2": {
"message": "Feldolgozást követően",
"description": "This string is used as table title on the log page."
},
"log_html_table_head_3": {
"message": "Szabály",
"description": "This string is used as table title on the log page."
},
"log_html_table_head_4": {
"message": "Idő",
"description": "This string is used as table title on the log page."
},
"log_html_reset_button": {
"message": "Nullázás",
"description": "This string is used for the reset button on the log page."
},
"log_html_reset_button_title": {
"message": "Teljes napló törlése",
"description": "This string is used as title for the reset button on the log page."
},
"popup_html_configs_head": {
"message": "Beállítások",
"description": "This string is used as title for the configs on the popup page."
},
"popup_html_configs_switch_filter": {
"message": "Szűrők",
"description": "This string is used as name for the filter switch button on the popup page."
},
"popup_html_configs_switch_filter_title": {
"message": "A Szűrők kapcsoló aktiválja a ClearURLs tisztítás funkcióját. Ha kikapcsolod, akkor az egész bővítmény működése leáll.",
"description": "This string is used as title for the filter switch button on the popup page."
},
"popup_html_configs_switch_log": {
"message": "Naplózás",
"description": "This string is used as name for the logging switch button on the popup page."
},
"popup_html_configs_switch_log_title": {
"message": "A napló helyileg lesz elmentve. Ha nincs rá szükséged inkább ne kapcsold be.",
"description": "This string is used as title for the logging switch button on the popup page."
},
"popup_html_configs_switch_badges": {
"message": "Jelvények",
"description": "This string is used as name for the badges switch button on the popup page."
},
"popup_html_configs_switch_badges_title": {
"message": "Mutassa a tisztított URL-ek számát",
"description": "This string is used as title for the badges switch button on the popup page."
},
"popup_html_statistics_head": {
"message": "Statisztika",
"description": "This string is used as title for the statistics on the popup page."
},
"popup_html_statistics_elements": {
"message": "Összes elem",
"description": "This string is used as name for the elements on the popup page."
},
"popup_html_statistics_blocked": {
"message": "Blokkolva",
"description": "This string is used as name for the blocked elements on the popup page."
},
"popup_html_statistics_percentage": {
"message": "Százalék",
"description": "This string is used as name for the percentage of blocked elements on the popup page."
},
"popup_html_statistics_reset_button": {
"message": "Nullázás",
"description": "This string is used as name for the statistics reset button on the popup page."
},
"popup_html_statistics_reset_button_title": {
"message": "Teljes statisztika törlése",
"description": "This string is used as title for the statistics reset button on the popup page."
},
"popup_html_rules_status_head": {
"message": "Szabályok állapota",
"description": "This string is used as title for the rules-status section on the popup page."
},
"popup_html_log_head": {
"message": "Napló",
"description": "This string is used as name for the log button on the popup page."
},
"popup_html_log_head_title": {
"message": "Napló megnyitása",
"description": "This string is used as title for the log button on the popup page."
},
"popup_html_report_button": {
"message": "Aktív URL jelentése",
"description": "Note: Currently not used."
},
"popup_html_report_button_title": {
"message": "Jelenlegi fül URL címének jelentése.",
"description": "Currently not used."
},
"core_save_on_disk": {
"message": "[ClearURLs]: elmentve a lemezre.",
"description": "This string is used to tell the user, that ClearURLs saved the settings on disk."
},
"core_error": {
"message": "[ClearURLs]: a bővítmény nem tudott elindulni.",
"description": "This string is used to tell the user, that ClearURLs could not be started."
},
"configs_switch_statistics": {
"message": "Statisztika",
"description": "This string is used as name for the statistics switch button on the popup page."
},
"configs_switch_statistics_title": {
"message": "Statisztika funkció aktiválása, letiltása",
"description": "This string is used as title for the statistics switch button on the popup page."
},
"settings_html_page_title": {
"message": "ClearURLs beállításai",
"description": "This string is used as title on the settings page."
},
"badged_color_label": {
"message": "Jelvény színe",
"description": "This string is used as name for the badged color label."
},
"setting_html_reset_button": {
"message": "Visszaállítás",
"description": "This string is used as name for the reset button on the settings page."
},
"setting_html_reset_button_title": {
"message": "Minden visszaállítása alapértékre",
"description": "This string is used as title for the reset button on the settings page."
},
"setting_rule_url_label": {
"message": "URL a data.json fájlhoz (szabályok)",
"description": "This string is used as name for the rule url label."
},
"settings_html_save_button": {
"message": "Mentés és bővítmény újraindítása",
"description": "This string is used as name for the save&reload button on the settings page."
},
"settings_html_save_button_title": {
"message": "Beállítások elmentése",
"description": "This string is used as title for the save&reload button on the settings page."
},
"setting_hash_url_label": {
"message": "URL a rules.hash fájlhoz (hash)",
"description": "This string is used as name for the rule.hash url label."
},
"setting_types_label": {
"message": "<a href='https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/webRequest/ResourceType' target='_blank'>Request types</a> (haladó szint)",
"description": "This string is used as name for the types label."
},
"donate_button": {
"message": "Adomány a ClearURLs készítőjének.",
"description": "This string is used to refer to a donation page."
},
"clipboard_copy_link": {
"message": "Tisztított link másolása",
"description": "This string is used in the context menu to copy clean links."
},
"context_menu_enabled": {
"message": "Környezeti menü elemei",
"description": "This string is used toggle the context menu entry to copy clean links."
},
"cleaning_tool_page_title": {
"message": "Tisztító eszköz a ClearURLs-től",
"description": "This string is used as title on the cleaning tool page."
},
"cleaning_tool_description": {
"message": "Az ide beillesztett URL-eket megtisztíthatod a ClearURLs segítségével, ha a zöld gombra nyomsz. Egyszerre több URL-t is megadhatsz, de a címeket soronként kell beírnod.",
"description": "This string is used as description of the cleaning tool."
},
"cleaning_tool_btn": {
"message": "URL tisztítás",
"description": "This string is used as name for the clean url button."
},
"cleaning_tool_dirty_urls_label": {
"message": "Itt adhatod meg az URL-eket:",
"description": "This string is used as title on the cleaning tool page for the dirty URLs."
},
"cleaning_tool_clean_urls_label": {
"message": "Itt láthatod a tisztított URL-eket:",
"description": "This string is used as title on the cleaning tool page for the clean URLs."
}
}

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

@@ -0,0 +1,308 @@
{
"hash_status_code_1": {
"message": "tutto aggiornato",
"description": "This status code says, that no update is available for the ClearURLs rules and everything is up to date."
},
"hash_status_code_2": {
"message": "aggiornate",
"description": "This status code says, that the ClearURLs rules are successfully updated."
},
"hash_status_code_3": {
"message": "aggiornamento disponibile",
"description": "This status code says, that an update is available for the ClearURLs rules."
},
"hash_status_code_4": {
"message": "errore",
"description": "This status code says, that the ClearURLs could not be started correctly."
},
"hash_status_code_5": {
"message": "Oops qualcosa è andato storto!",
"description": "This status code says, that an error occurred while updating the ClearURLs rules."
},
"log_redirect": {
"message": "Questo URL viene reindirizzato",
"description": "This string is used on redirections in the ClearURLs log."
},
"log_domain_blocked": {
"message": "Questo dominio è bloccato",
"description": "This string is used on blocked domains in the ClearURLs log."
},
"check_os_log": {
"message": "[ClearURLs]: Log listener è stato aggiunto.",
"description": "This string is used on ClearURLs log startup."
},
"log_html_page_title": {
"message": "Log di ClearURLs",
"description": "This string is used as header on the log page."
},
"log_html_table_head_1": {
"message": "Prima dell'elaborazione",
"description": "This string is used as table title on the log page."
},
"log_html_table_head_2": {
"message": "Dopo l'elaborazione",
"description": "This string is used as table title on the log page."
},
"log_html_table_head_3": {
"message": "Regola",
"description": "This string is used as table title on the log page."
},
"log_html_table_head_4": {
"message": "Data e ora",
"description": "This string is used as table title on the log page."
},
"log_html_reset_button": {
"message": "Ripristina",
"description": "This string is used for the reset button on the log page."
},
"log_html_reset_button_title": {
"message": "Azzera il log globale",
"description": "This string is used as title for the reset button on the log page."
},
"popup_html_configs_head": {
"message": "Configurazioni",
"description": "This string is used as title for the configs on the popup page."
},
"popup_html_configs_switch_filter": {
"message": "Filtra",
"description": "This string is used as name for the filter switch button on the popup page."
},
"popup_html_configs_switch_filter_title": {
"message": "L'interruttore dei filtri attiva la funzione di pulizia di ClearURLs. Se si disabilita questa opzione, l'intero componente aggiuntivo è disabilitato.",
"description": "This string is used as title for the filter switch button on the popup page."
},
"popup_html_configs_switch_log": {
"message": "Log",
"description": "This string is used as name for the logging switch button on the popup page."
},
"popup_html_configs_switch_log_title": {
"message": "Il registro viene salvato solo in locale. Si sconsiglia di utilizzare questa funzione se non ne hai bisogno.",
"description": "This string is used as title for the logging switch button on the popup page."
},
"popup_html_configs_switch_badges": {
"message": "Contatore",
"description": "This string is used as name for the badges switch button on the popup page."
},
"popup_html_configs_switch_badges_title": {
"message": "Mostra il numero di url puliti",
"description": "This string is used as title for the badges switch button on the popup page."
},
"popup_html_statistics_head": {
"message": "Statistiche",
"description": "This string is used as title for the statistics on the popup page."
},
"popup_html_statistics_elements": {
"message": "Elementi",
"description": "This string is used as name for the elements on the popup page."
},
"popup_html_statistics_blocked": {
"message": "Bloccati",
"description": "This string is used as name for the blocked elements on the popup page."
},
"popup_html_statistics_percentage": {
"message": "Percentuale",
"description": "This string is used as name for the percentage of blocked elements on the popup page."
},
"popup_html_statistics_reset_button": {
"message": "Ripristina",
"description": "This string is used as name for the statistics reset button on the popup page."
},
"popup_html_statistics_reset_button_title": {
"message": "Ripristina le statistiche globali",
"description": "This string is used as title for the statistics reset button on the popup page."
},
"popup_html_rules_status_head": {
"message": "Regole-Stato",
"description": "This string is used as title for the rules-status section on the popup page."
},
"popup_html_log_head": {
"message": "Log",
"description": "This string is used as name for the log button on the popup page."
},
"popup_html_log_head_title": {
"message": "Apri il file di log",
"description": "This string is used as title for the log button on the popup page."
},
"popup_html_report_button": {
"message": "Segnala l'url corrente",
"description": "Note: Currently not used."
},
"popup_html_report_button_title": {
"message": "Segnala l'URL corrente da questa scheda.",
"description": "Currently not used."
},
"core_save_on_disk": {
"message": "[ClearURLs]: Salva sul disco.",
"description": "This string is used to tell the user, that ClearURLs saved the settings on disk."
},
"core_error": {
"message": "[ClearURLs]: Il componente aggiuntivo non può essere avviato.",
"description": "This string is used to tell the user, that ClearURLs could not be started."
},
"configs_switch_statistics": {
"message": "Statistiche",
"description": "This string is used as name for the statistics switch button on the popup page."
},
"configs_switch_statistics_title": {
"message": "Attiva o disattiva le statistiche",
"description": "This string is used as title for the statistics switch button on the popup page."
},
"settings_html_page_title": {
"message": "Impostazioni da ClearURLs",
"description": "This string is used as title on the settings page."
},
"badged_color_label": {
"message": "Colore distintivo",
"description": "This string is used as name for the badged color label."
},
"setting_html_reset_button": {
"message": "Ripristina",
"description": "This string is used as name for the reset button on the settings page."
},
"setting_html_reset_button_title": {
"message": "Ripristina tutto",
"description": "This string is used as title for the reset button on the settings page."
},
"setting_rule_url_label": {
"message": "Indirizzo del file data.json (regole)",
"description": "This string is used as name for the rule url label."
},
"settings_html_save_button": {
"message": "Salva e ricarica il componente aggiuntivo",
"description": "This string is used as name for the save&reload button on the settings page."
},
"settings_html_save_button_title": {
"message": "Salva le impostazioni",
"description": "This string is used as title for the save&reload button on the settings page."
},
"setting_hash_url_label": {
"message": "Indirizzo del file rules.hash (hash)",
"description": "This string is used as name for the rule.hash url label."
},
"setting_types_label": {
"message": "<a href='https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/webRequest/ResourceType' target='_blank'>Request types</a> (livello esperto)\n",
"description": "This string is used as name for the types label."
},
"setting_report_server_label": {
"message": "Server di report per gli URL",
"description": "Note: Currently not used."
},
"success_report_url": {
"message": "L'URL è stato segnalato correttamente. Verificheremo l'URL quanto prima.",
"description": "Note: Currently not used."
},
"error_report_url": {
"message": "Sembra che questo URL sia già stato segnalato.",
"description": "Note: Currently not used."
},
"donate_button": {
"message": "Una donazione per l'autore di ClearURLs.",
"description": "This string is used to refer to a donation page."
},
"clipboard_copy_link": {
"message": "Copia i collegamenti puliti",
"description": "This string is used in the context menu to copy clean links."
},
"context_menu_enabled": {
"message": "Visualizza la voce del menu contestuale",
"description": "This string is used toggle the context menu entry to copy clean links."
},
"history_listener_enabled": {
"message": "Impedisci il tracciamento via cronologia API (vedi: <a href='https://developer.mozilla.org/en-US/docs/Web/API/History_API#The_replaceState()_method' target='_blank'>Il metodo replaceState()</a>)",
"description": "This string is used as name for the history API listener label."
},
"cleaning_tool_page_title": {
"message": "Strumento di pulizia di ClearURLs",
"description": "This string is used as title on the cleaning tool page."
},
"cleaning_tool_description": {
"message": "Con questo strumento è possibile incollare URL che ClearURLs pulirà facendo clic sul pulsante verde. È possibile incollare più URL contemporaneamente, indica un singolo URL per riga.",
"description": "This string is used as description of the cleaning tool."
},
"cleaning_tool_btn": {
"message": "Pulisci gli URL",
"description": "This string is used as name for the clean url button."
},
"cleaning_tool_dirty_urls_label": {
"message": "Qui puoi incollare gli URL sporchi:",
"description": "This string is used as title on the cleaning tool page for the dirty URLs."
},
"cleaning_tool_clean_urls_label": {
"message": "Qui di seguito puoi trovare gli URL puliti:",
"description": "This string is used as title on the cleaning tool page for the clean URLs."
},
"local_hosts_skipping": {
"message": "Escludi gli URL locali (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, 100.64.0.0/10, 169.254.0.0/16, 127.0.0.1, localhost)",
"description": "This string is used as label for the local host skipping switch"
},
"local_hosts_skipping_title": {
"message": "Escludi gli URL locali",
"description": "This string is used as title for the local host skipping switch"
},
"log_html_export_button": {
"message": "Esporta",
"description": "This string is used for the export button on the log page."
},
"log_html_export_button_title": {
"message": "Esporta il log globale",
"description": "This string is used as title for the export button on the log page."
},
"log_html_import_button": {
"message": "Importa",
"description": "This string is used for the import button on the log page."
},
"log_html_import_button_title": {
"message": "Importa il log globale",
"description": "This string is used as title for the import button on the log page."
},
"setting_html_export_button": {
"message": "Esporta",
"description": "This string is used as name for the export button on the settings page."
},
"setting_html_export_button_title": {
"message": "Esporta tutto",
"description": "This string is used as title for the export button on the settings page."
},
"setting_html_import_button": {
"message": "Importa",
"description": "This string is used as name for the reset button on the settings page."
},
"setting_html_import_button_title": {
"message": "Importa tutto",
"description": "This string is used as title for the import button on the settings page."
},
"setting_log_limit_label": {
"message": "Limita le voci di log a $LIMIT$. (-1 := ∞)",
"description": "This string is used as name for the log limit label.",
"placeholders": {
"limit": {
"content": "$1",
"example": "100"
}
}
},
"blocked_html_title": {
"message": "Questo sito è stato bloccato da <b>ClearURLs</b>",
"description": "This string is used as title on the blocked site page."
},
"blocked_html_body": {
"message": "Questo sito è stato bloccato da <b>ClearURLs</b> perché è stato identificato come sito web di advertising e/o servizio di tracciamento. Per visitare questo sito web devi temporaneamente disattivare il componente aggiuntivo. Dopo aver disattivato ClearURLs potrai fare clic sul pulsante qui sotto per ricaricare la pagina.",
"description": "This string is used as body on the blocked site page."
},
"blocked_html_button": {
"message": "Visita la pagina",
"description": "This string is used as button on the blocked site page."
},
"referral_marketing_enabled": {
"message": "Permetti l'utilizzo di referral marketing",
"description": "This string is used as label for the referral marketing switch"
},
"referral_marketing_enabled_title": {
"message": "Permette l'utilizzo del referral marketing (esempio: Amazon)",
"description": "This string is used as title for the referral marketing switch"
},
"watchdog": {
"message": "[ClearURLs]: Il sistema di controllo ha identificato un problema. ClearURLs verrà riavviato.",
"description": "This string is used as text for the watchdog"
}
}

View File

@@ -1,246 +1,234 @@
{
"hash_status_code_1": {
"description": "up to date",
"message": "最新の"
"message": "最新の",
"description": "このステータスコードは、ClearURLs ルールの更新が利用できず、すべてが最新であることを示しています。"
},
"hash_status_code_2": {
"description": "updated",
"message": "更新する"
"message": "更新する",
"description": "このステータスコードは、ClearURLs ルールが正常に更新されたことを示しています。"
},
"hash_status_code_3": {
"description": "update available",
"message": "利用可能な更新"
"message": "利用可能な更新",
"description": "このステータスコードは、ClearURLs ルールの更新が利用可能であることを示しています。"
},
"hash_status_code_4": {
"description": "error",
"message": "エラー"
"message": "エラー",
"description": "このステータスコードは、ClearURLs を正しく開始できなかったことを示しています。"
},
"hash_status_code_5": {
"description": "Oops something went wrong!",
"message": "おっと!何かが間違っていた!"
"message": "おっと!何かが間違っていた!",
"description": "このステータスコードは、ClearURLs ルールの更新中にエラーが発生したことを示しています。"
},
"log_redirect": {
"description": "This url is redirected",
"message": "この URL はリダイレクトされます"
"message": "この URL はリダイレクトされます",
"description": "この文字列は、ClearURLs ログをリダイレクトして使用されます"
},
"log_domain_blocked": {
"description": "This domain is blocked",
"message": "このドメインはブロックされています"
"message": "このドメインはブロックされています",
"description": "この文字列は、ClearURLs ログのブロックされたドメインで使用されます"
},
"check_os_log": {
"description": "[ClearURLs]: Log listener is added.",
"message": "[ClearURLs]:ログリスナーが追加されました。"
"message": "[ClearURLs]:ログリスナーが追加されました。",
"description": "この文字列は、ClearURLs ログの起動時に使用されま。"
},
"log_html_page_title": {
"description": "Log from ClearURLs",
"message": "ClearURLs からのログ"
"message": "ClearURLs からのログ",
"description": "この文字列は、ログページのヘッダーとして使用されます。"
},
"log_html_table_head_1": {
"description": "Before processing",
"message": "処理する前に"
"message": "処理する前に",
"description": "この文字列は、ログページのテーブルタイトルとして使用されます。"
},
"log_html_table_head_2": {
"description": "After processing",
"message": "処理後"
"message": "処理後",
"description": "この文字列は、ログページのテーブルタイトルとして使用されます。"
},
"log_html_table_head_3": {
"description": "Rule",
"message": "規則"
"message": "規則",
"description": "この文字列は、ログページのテーブルタイトルとして使用されます。"
},
"log_html_table_head_4": {
"description": "Time",
"message": "時間"
"message": "時間",
"description": "この文字列は、ログページのテーブルタイトルとして使用されます。"
},
"log_html_reset_button": {
"description": "Reset",
"message": "リセットする"
"message": "リセットする",
"description": "この文字列は、ログページのリセットボタンに使用されます。"
},
"log_html_reset_button_title": {
"description": "Reset the global log",
"message": "グローバルログをリセットする"
"message": "グローバルログをリセットする",
"description": "この文字列は、ログページのリセットボタンのタイトルとして使用されます。"
},
"popup_html_configs_head": {
"description": "Configs",
"message": "設定"
"message": "設定",
"description": "この文字列は、ポップアップページの設定のタイトルとして使用されます。"
},
"popup_html_configs_switch_filter": {
"description": "Filter",
"message": "フィルター"
"message": "フィルター",
"description": "この文字列は、ポップアップページのフィルタースイッチボタンの名前として使用されます。"
},
"popup_html_configs_switch_filter_title": {
"description": "The filters switch activates the cleaning functionality of ClearURLs. If you disable this option, the whole addon is disabled",
"message": "フィルタースイッチは、ClearURL のクリーニング機能を有効にします。 このオプションを無効にすると、アドオン全体が無効になります。"
"message": "フィルタースイッチは、ClearURLs のクリーニング機能を有効にします。 このオプションを無効にすると、アドオン全体が無効になります。",
"description": "この文字列は、ポップアップページのフィルタースイッチボタンのタイトルとして使用されます。"
},
"popup_html_configs_switch_log": {
"description": "Logging",
"message": "追跡記録"
"message": "追跡記録",
"description": "この文字列は、ポップアップページのロギングスイッチボタンの名前として使用されます。"
},
"popup_html_configs_switch_log_title": {
"description": "The log is saved only locally. We advise against this feature if you do not need it",
"message": "ログはローカルにのみ保存されます。この機能が必要ない場合は、この機能を無効にすることをおすすめします。"
"message": "ログはローカルにのみ保存されます。この機能が必要ない場合は、この機能を無効にすることをおすすめします。",
"description": "この文字列は、ポップアップページのロギングスイッチボタンのタイトルとして使用されます。"
},
"popup_html_configs_switch_badges": {
"description": "Badges",
"message": "バッジ"
"message": "バッジ",
"description": "この文字列は、ポップアップページのバッジスイッチボタンの名前として使用されます。"
},
"popup_html_configs_switch_badges_title": {
"description": "Show number of cleaned urls",
"message": "消去された URL の数を表示する"
"message": "消去された URL の数を表示する",
"description": "この文字列は、ポップアップページのバッジ切り替えボタンのタイトルとして使用されます。"
},
"popup_html_statistics_head": {
"description": "Statistics",
"message": "統計"
"message": "統計",
"description": "この文字列は、ポップアップページの統計のタイトルとして使用されます。"
},
"popup_html_statistics_elements": {
"description": "Elements",
"message": "要素"
"message": "要素",
"description": "この文字列は、ポップアップページの要素の名前として使用されます。"
},
"popup_html_statistics_blocked": {
"description": "Blocked",
"message": "ブロックされた"
"message": "ブロックされた要素",
"description": "この文字列は、ポップアップページでブロックされた要素の名前として使用されます。"
},
"popup_html_statistics_percentage": {
"description": "Percentage",
"message": "パーセンテージ"
"message": "ブロックされた要素の割合",
"description": "この文字列は、ポップアップページでブロックされた要素の割合の名前として使用されます。"
},
"popup_html_statistics_reset_button": {
"description": "Reset",
"message": "リセットする"
"message": "リセットする",
"description": "この文字列は、ポップアップページの統計リセットボタンの名前として使用されます。"
},
"popup_html_statistics_reset_button_title": {
"description": "Reset the global statistics",
"message": "グローバル統計リセットする"
"message": "グローバル統計をリセットする",
"description": "この文字列は、ポップアップページの統計リセットボタンのタイトルとして使用されます。"
},
"popup_html_rules_status_head": {
"description": "Rules-Status",
"message": "ルール・ステータス"
"message": "ルール・ステータス",
"description": "この文字列は、ポップアップページのルール・ステータスセクションのタイトルとして使用されます。"
},
"popup_html_log_head": {
"description": "Log",
"message": "記録を取る"
"message": "記録を取る",
"description": "この文字列は、ポップアップページのログボタンの名前として使用されます。"
},
"popup_html_log_head_title": {
"description": "Open the log",
"message": "記録を開く"
"message": "記録を開く",
"description": "この文字列は、ポップアップページのログボタンのタイトルとして使用されます。"
},
"popup_html_report_button": {
"description": "Report current URL",
"message": "現在の URL を報告する"
"message": "現在の URL を報告する",
"description": "注:現在使用されていません。"
},
"popup_html_report_button_title": {
"description": "Report the current URL from this tab.",
"message": "このタブから現在の URL を報告してください。"
"message": "このタブから現在の URL を報告してください。",
"description": "現在使用されていません。"
},
"core_save_on_disk": {
"description": "[ClearURLs]: Save on disk.",
"message": "[ClearURLs]ディスクに保存します。"
"message": "[ClearURLs]:ディスクに保存します。",
"description": "この文字列は、ClearURLs が設定をディスクに保存したことをユーザーに伝えるために使用されます。"
},
"core_error": {
"description": "[ClearURLs]: The addon could not started.",
"message": "[ClearURLs]:アドオンを開始できませんでした。"
"message": "[ClearURLs]:アドオンを開始できませんでした。",
"description": "この文字列は、ClearURLs を開始できなかったことをユーザーに伝えるために使用されます。"
},
"configs_switch_statistics": {
"description": "Statistics",
"message": "統計"
"message": "統計情報",
"description": "この文字列は、ポップアップページの統計情報切り替えボタンの名前として使用されます。"
},
"configs_switch_statistics_title": {
"description": "Activate or deactivate the statistics function",
"message": "統計機能を有効または無効にする"
"message": "統計情報機能を有効または無効にする",
"description": "この文字列は、ポップアップページの統計情報切り替えボタンのタイトルとして使用されます。"
},
"settings_html_page_title": {
"description": "Settings from ClearURLs",
"message": "ClearURL からの設定"
"message": "ClearURLs からの設定",
"description": "この文字列は、設定ページのタイトルとして使用されます。"
},
"badged_color_label": {
"description": "Badged color",
"message": "バッジの色"
"message": "バッジの色",
"description": "この文字列は、バッジ付きカラーラベルの名前として使用されます。"
},
"setting_html_reset_button": {
"description": "Reset",
"message": "リセットする"
"message": "リセットする",
"description": "この文字列は、設定ページのリセットボタンの名前として使用されます。"
},
"setting_html_reset_button_title": {
"description": "Reset everything",
"message": "すべてをリセットする"
"message": "すべてをリセットする",
"description": "この文字列は、設定ページのリセットボタンのタイトルとして使用されます。"
},
"setting_rule_url_label": {
"description": "The url to the data.json file (rules)",
"message": "data.json ファイルへの URLルール"
"message": "data.json ファイルへの URLルール",
"description": "この文字列は、ルールの URL ラベルの名前として使用されます。"
},
"settings_html_save_button": {
"description": "Save & reload addon",
"message": "アドオンの保存と再読み込み"
"message": "アドオンの保存と再読み込み",
"description": "この文字列は、設定ページの保存と再読み込みボタンの名前として使用されます。"
},
"settings_html_save_button_title": {
"description": "Saves the settings",
"message": "設定を保存します。"
"message": "設定を保存します。",
"description": "この文字列は、設定ページの保存と再読み込みボタンのタイトルとして使用されます。"
},
"setting_hash_url_label": {
"description": "The url to the rules.hash file (hash)",
"message": "rules.hash ファイル(ハッシュ)への URL"
"message": "rules.hash ファイル(ハッシュ)への URL",
"description": "この文字列は、rule.hash URL ラベルの名前として使用されます。"
},
"setting_types_label": {
"description": "<a href='https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/webRequest/ResourceType' target='_blank'>Request types</a> (expert level)",
"message": "<a href='https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/webRequest/ResourceType' target='_blank'> リクエストタイプ</a> (エキスパートレベル)"
"message": "<a href='https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/webRequest/ResourceType' target='_blank'> リクエストタイプ</a> (エキスパートレベル)",
"description": "この文字列は、タイプラベルの名前として使用されます。"
},
"setting_report_server_label": {
"description": "Report server for URLs",
"message": "URL のサーバーを報告する"
"message": "URL のサーバーを報告する",
"description": "注:現在使用されていません。"
},
"success_report_url": {
"description": "The URL was successfully reported. We will check this URL soon.",
"message": "URL は正常に報告されました。 我々はすぐに、この URL をチェックします。"
"message": "URL は正常に報告されました。 我々はすぐに、この URL をチェックします。",
"description": "注:現在使用されていません。"
},
"error_report_url": {
"description": "It seems like this URL has already been reported.",
"message": "この URL は既に報告されているようです。"
"message": "この URL は既に報告されているようです。",
"description": "注:現在使用されていません。"
},
"donate_button": {
"message": "ClearURLs 作成者への寄付。",
"description": "この文字列は、寄付ページを参照するために使用されます。"
},
"clipboard_copy_link": {
"message": "クリーンリンクの Location位置情報のコピー",
"description": "この文字列は、コンテキストメニューでクリーンリンクをコピーするために使用されます。"
},
"context_menu_enabled": {
"message": "コンテキストメニューエントリを表示する",
"description": "この文字列は、コンテキストメニューのエントリを切り替えて、クリーンなリンクをコピーするために使用されます。"
},
"history_listener_enabled": {
"message": "history(履歴)API でのインジェクションの追跡を防止する (参照: <a href='https://developer.mozilla.org/en-US/docs/Web/API/History_API#The_replaceState()_method' target='_blank'>The replaceState() method</a>)",
"description": "この文字列は、history(履歴)API リスナーラベルの名前として使用されます。"
},
"cleaning_tool_page_title": {
"message": "ClearURLs のクリーニングツール",
"description": "この文字列は、クリーニングツールページのタイトルとして使用されます。"
},
"cleaning_tool_description": {
"message": "このツールを使用すると、URL を貼り付けることができます。ClearURLs は、緑色のボタンをクリックすると URL を消去します。 一度に複数の URL を貼り付けることができますが、すべての URL を別々の行に含める必要があります。",
"description": "この文字列は、クリーニングツールの説明として使用されます。"
},
"cleaning_tool_btn": {
"message": "Clean URLs",
"description": "この文字列は、クリーン URL ボタンの名前として使用されます。"
},
"cleaning_tool_dirty_urls_label": {
"message": "ここで、難読化された URL を貼り付けることができます。",
"description": "この文字列は、難読化された URL のクリーニングツールページのタイトルとして使用されます。"
},
"cleaning_tool_clean_urls_label": {
"message": "ここで、クリーンアップされた URL を見つけることができます。",
"description": "この文字列は、クリーン URL のクリーニングツールページのタイトルとして使用されます。"
}
}
}

230
_locales/pl/messages.json Normal file
View File

@@ -0,0 +1,230 @@
{
"hash_status_code_1": {
"message": "aktualne",
"description": "This status code says, that no update is available for the ClearURLs rules and everything is up to date."
},
"hash_status_code_2": {
"message": "zaktualizowane",
"description": "This status code says, that the ClearURLs rules are successfully updated."
},
"hash_status_code_3": {
"message": "dostępna aktualizacja",
"description": "This status code says, that an update is available for the ClearURLs rules."
},
"hash_status_code_4": {
"message": "błąd",
"description": "This status code says, that the ClearURLs could not be started correctly."
},
"hash_status_code_5": {
"message": "Ups, coś poszło nie tak!",
"description": "This status code says, that an error occurred while updating the ClearURLs rules."
},
"log_redirect": {
"message": "Ten url jest przekierowany",
"description": "This string is used on redirections in the ClearURLs log."
},
"log_domain_blocked": {
"message": "Ta domena jest zablokowana",
"description": "This string is used on blocked domains in the ClearURLs log."
},
"check_os_log": {
"message": "[ClearURLs]: Dodano nasłuchiwanie dziennika.",
"description": "This string is used on ClearURLs log startup."
},
"log_html_page_title": {
"message": "Dziennik ClearURLs",
"description": "This string is used as header on the log page."
},
"log_html_table_head_1": {
"message": "Przed przetworzeniem",
"description": "This string is used as table title on the log page."
},
"log_html_table_head_2": {
"message": "Po przetworzeniu",
"description": "This string is used as table title on the log page."
},
"log_html_table_head_3": {
"message": "Reguła",
"description": "This string is used as table title on the log page."
},
"log_html_table_head_4": {
"message": "Czas",
"description": "This string is used as table title on the log page."
},
"log_html_reset_button": {
"message": "Wyczyść",
"description": "This string is used for the reset button on the log page."
},
"log_html_reset_button_title": {
"message": "Wyczyść wszystkie wpisy dziennika",
"description": "This string is used as title for the reset button on the log page."
},
"popup_html_configs_head": {
"message": "Konfiguracja",
"description": "This string is used as title for the configs on the popup page."
},
"popup_html_configs_switch_filter": {
"message": "Filtr",
"description": "This string is used as name for the filter switch button on the popup page."
},
"popup_html_configs_switch_filter_title": {
"message": "Przełącznik filtra aktywuje funkcję oczyszczania ClearURLs. Jeśli wyłączysz tę funkcję, dodatek przestanie działać.",
"description": "This string is used as title for the filter switch button on the popup page."
},
"popup_html_configs_switch_log": {
"message": "Dziennik",
"description": "This string is used as name for the logging switch button on the popup page."
},
"popup_html_configs_switch_log_title": {
"message": "Dziennik zapisywany jest wyłącznie lokalnie. Zalecamy nie używanie tej funkcji jeśli nie jest ci potrzebna.",
"description": "This string is used as title for the logging switch button on the popup page."
},
"popup_html_configs_switch_badges": {
"message": "Znacznik",
"description": "This string is used as name for the badges switch button on the popup page."
},
"popup_html_configs_switch_badges_title": {
"message": "Pokazuje liczbę oczyszczonych url",
"description": "This string is used as title for the badges switch button on the popup page."
},
"popup_html_statistics_head": {
"message": "Statystyki",
"description": "This string is used as title for the statistics on the popup page."
},
"popup_html_statistics_elements": {
"message": "Elementy",
"description": "This string is used as name for the elements on the popup page."
},
"popup_html_statistics_blocked": {
"message": "Zablokowano",
"description": "This string is used as name for the blocked elements on the popup page."
},
"popup_html_statistics_percentage": {
"message": "Procent",
"description": "This string is used as name for the percentage of blocked elements on the popup page."
},
"popup_html_statistics_reset_button": {
"message": "Wyczyść",
"description": "This string is used as name for the statistics reset button on the popup page."
},
"popup_html_statistics_reset_button_title": {
"message": "Wyczyść wszystkie statystyki",
"description": "This string is used as title for the statistics reset button on the popup page."
},
"popup_html_rules_status_head": {
"message": "StatusReguł",
"description": "This string is used as title for the rules-status section on the popup page."
},
"popup_html_log_head": {
"message": "Dziennik",
"description": "This string is used as name for the log button on the popup page."
},
"popup_html_log_head_title": {
"message": "Otwórz dziennik",
"description": "This string is used as title for the log button on the popup page."
},
"popup_html_report_button": {
"message": "Raportuj aktualny URL",
"description": "Note: Currently not used."
},
"popup_html_report_button_title": {
"message": "Raportuj aktualny URL z tej karty.",
"description": "Currently not used."
},
"core_save_on_disk": {
"message": "[ClearURLs]: Zapisz na dysku.",
"description": "This string is used to tell the user, that ClearURLs saved the settings on disk."
},
"core_error": {
"message": "[ClearURLs]: Dodatek nie mógł się uruchomić.",
"description": "This string is used to tell the user, that ClearURLs could not be started."
},
"configs_switch_statistics": {
"message": "Statystyki",
"description": "This string is used as name for the statistics switch button on the popup page."
},
"configs_switch_statistics_title": {
"message": "Aktywuj lub dezaktywuj funkcję statystyk",
"description": "This string is used as title for the statistics switch button on the popup page."
},
"settings_html_page_title": {
"message": "Ustawienia ClearURLs",
"description": "This string is used as title on the settings page."
},
"badged_color_label": {
"message": "Kolor znacznika",
"description": "This string is used as name for the badged color label."
},
"setting_html_reset_button": {
"message": "Wyczyść",
"description": "This string is used as name for the reset button on the settings page."
},
"setting_html_reset_button_title": {
"message": "Wyczyść wszystko",
"description": "This string is used as title for the reset button on the settings page."
},
"setting_rule_url_label": {
"message": "Url do pliku data.json (reguły)",
"description": "This string is used as name for the rule url label."
},
"settings_html_save_button": {
"message": "Zapisz i załaduj dodatek ponownie",
"description": "This string is used as name for the save&reload button on the settings page."
},
"settings_html_save_button_title": {
"message": "Zapisz ustawienia",
"description": "This string is used as title for the save&reload button on the settings page."
},
"setting_hash_url_label": {
"message": "Url do pliku rules.hash (hash)",
"description": "This string is used as name for the rule.hash url label."
},
"setting_report_server_label": {
"message": "Serwer raportów dla adresów URL",
"description": "Note: Currently not used."
},
"success_report_url": {
"message": "URL został zaraportowany z powodzeniem. Wkrótce sprawdzimy ten raport.",
"description": "Note: Currently not used."
},
"error_report_url": {
"message": "Ten Url już był raportowany.",
"description": "Note: Currently not used."
},
"donate_button": {
"message": "Dotacja dla twórcy ClearURLs.",
"description": "This string is used to refer to a donation page."
},
"clipboard_copy_link": {
"message": "Kopiuj Oczyszczony Odnośnik",
"description": "This string is used in the context menu to copy clean links."
},
"context_menu_enabled": {
"message": "Wyświetl wpis w menu kontekstowym",
"description": "This string is used toggle the context menu entry to copy clean links."
},
"history_listener_enabled": {
"message": "Zapobiegaj iniekcji śledzenia w API historii (Zobacz także: <a href='https://developer.mozilla.org/en-US/docs/Web/API/History_API#The_replaceState()_method' target='_blank'>The replaceState() method</a>)",
"description": "This string is used as name for the history API listener label."
},
"cleaning_tool_page_title": {
"message": "Narzędzie do oczyszczania URL",
"description": "This string is used as title on the cleaning tool page."
},
"cleaning_tool_description": {
"message": "To narzędzie pozwoli wkleić URL, a po wciśnięciu zielonego przycisku ClearURLs oczyści go. Można wkleić wiele URL jednocześnie, ale każdy pojedyńczy winien być w osobnej linii.",
"description": "This string is used as description of the cleaning tool."
},
"cleaning_tool_btn": {
"message": "Oczyść",
"description": "This string is used as name for the clean url button."
},
"cleaning_tool_dirty_urls_label": {
"message": "Tu możesz wkleić brudne URL:",
"description": "This string is used as title on the cleaning tool page for the dirty URLs."
},
"cleaning_tool_clean_urls_label": {
"message": "Tu możesz znaleźć oczyszczone URL:",
"description": "This string is used as title on the cleaning tool page for the clean URLs."
}
}

View File

@@ -1,206 +1,234 @@
{
"hash_status_code_1": {
"message": "atualizado",
"description": ""
"description": "This status code says, that no update is available for the ClearURLs rules and everything is up to date."
},
"hash_status_code_2": {
"message": "atualizado",
"description": ""
"description": "This status code says, that the ClearURLs rules are successfully updated."
},
"hash_status_code_3": {
"message": "atualização disponivel",
"description": ""
"message": "atualização disponível",
"description": "This status code says, that an update is available for the ClearURLs rules."
},
"hash_status_code_4": {
"message": "erro",
"description": ""
"description": "This status code says, that the ClearURLs could not be started correctly."
},
"hash_status_code_5": {
"message": "Oops, algo deu errado!",
"description": ""
"description": "This status code says, that an error occurred while updating the ClearURLs rules."
},
"log_redirect": {
"message": "Esta url foi redirecionada",
"description": ""
"description": "This string is used on redirections in the ClearURLs log."
},
"log_domain_blocked": {
"message": "Este domínio foi bloqueado",
"description": ""
"description": "This string is used on blocked domains in the ClearURLs log."
},
"check_os_log": {
"message": "[ClearURLs]: Examinador de registro foi adicionado",
"description": ""
"message": "[ClearURLs]: Examinador de registro foi adicionado.",
"description": "This string is used on ClearURLs log startup."
},
"log_html_page_title": {
"message": "Registro do ClearURLs",
"description": ""
"description": "This string is used as header on the log page."
},
"log_html_table_head_1": {
"message": "Antes de processar",
"description": ""
"description": "This string is used as table title on the log page."
},
"log_html_table_head_2": {
"message": "Depois de processar",
"description": ""
"description": "This string is used as table title on the log page."
},
"log_html_table_head_3": {
"message": "Regra",
"description": ""
"description": "This string is used as table title on the log page."
},
"log_html_table_head_4": {
"message": "Tempo",
"description": ""
"description": "This string is used as table title on the log page."
},
"log_html_reset_button": {
"message": "Resetar",
"description": ""
"description": "This string is used for the reset button on the log page."
},
"log_html_reset_button_title": {
"message": "Resetar o registro global",
"description": ""
"description": "This string is used as title for the reset button on the log page."
},
"popup_html_configs_head": {
"message": "Configurações",
"description": ""
"description": "This string is used as title for the configs on the popup page."
},
"popup_html_configs_switch_filter": {
"message": "Filtrar",
"description": ""
"description": "This string is used as name for the filter switch button on the popup page."
},
"popup_html_configs_switch_filter_title": {
"message": "O switch de filtros ativa a funcionalidade de limpeza do ClearURLs. Se você desabilitar essa opção, toda a extensão será desativada",
"description": "This string is used as title for the filter switch button on the popup page."
},
"popup_html_configs_switch_log": {
"message": "Registro",
"description": ""
"description": "This string is used as name for the logging switch button on the popup page."
},
"popup_html_configs_switch_log_title": {
"message": "O registro é salvo localmente apenas. Aconselhamos contra este recurso se você não precisa dele",
"description": ""
"message": "O registro é salvo apenas localmente. Aconselhamos contra este recurso se você não precisa dele",
"description": "This string is used as title for the logging switch button on the popup page."
},
"popup_html_configs_switch_badges": {
"message": "Contador",
"description": ""
"description": "This string is used as name for the badges switch button on the popup page."
},
"popup_html_configs_switch_badges_title": {
"message": "Mostrar o número de urls limpas",
"description": "This string is used as title for the badges switch button on the popup page."
},
"popup_html_statistics_head": {
"message": "Estatísticas",
"description": ""
"description": "This string is used as title for the statistics on the popup page."
},
"popup_html_statistics_elements": {
"message": "Elementos",
"description": ""
"description": "This string is used as name for the elements on the popup page."
},
"popup_html_statistics_blocked": {
"message": "Bloqueado",
"description": ""
"description": "This string is used as name for the blocked elements on the popup page."
},
"popup_html_statistics_percentage": {
"message": "Porcentagem",
"description": ""
"description": "This string is used as name for the percentage of blocked elements on the popup page."
},
"popup_html_statistics_reset_button": {
"message": "Resetar",
"description": ""
"description": "This string is used as name for the statistics reset button on the popup page."
},
"popup_html_statistics_reset_button_title": {
"message": "Resetar as estatísticas globais",
"description": ""
"description": "This string is used as title for the statistics reset button on the popup page."
},
"popup_html_rules_status_head": {
"message": "Estado das regras",
"description": ""
"description": "This string is used as title for the rules-status section on the popup page."
},
"popup_html_log_head": {
"message": "Registro",
"description": ""
"description": "This string is used as name for the log button on the popup page."
},
"popup_html_log_head_title": {
"message": "Abrir o registro",
"description": ""
"description": "This string is used as title for the log button on the popup page."
},
"popup_html_report_button": {
"message": "Reportar URL atual",
"description": "Note: Currently not used."
},
"popup_html_report_button_title": {
"message": "Reportar a URL atual dessa aba.",
"description": "Currently not used."
},
"core_save_on_disk": {
"message": "[ClearURLs]: Salvar no disco.",
"description": ""
"description": "This string is used to tell the user, that ClearURLs saved the settings on disk."
},
"core_error": {
"message": "[ClearURLs]: A extensão não pode ser inicializada.",
"description": ""
"message": "[ClearURLs]: A extensão não pôde ser inicializada.",
"description": "This string is used to tell the user, that ClearURLs could not be started."
},
"configs_switch_statistics": {
"message": "Estatísticas",
"description": ""
"description": "This string is used as name for the statistics switch button on the popup page."
},
"configs_switch_statistics_title": {
"message": "Ativar ou desativar função de estatísticas",
"description": ""
"description": "This string is used as title for the statistics switch button on the popup page."
},
"settings_html_page_title": {
"message": "Configurações do ClearURLs",
"description": ""
"description": "This string is used as title on the settings page."
},
"badged_color_label": {
"message": "Cor do contador",
"description": ""
"description": "This string is used as name for the badged color label."
},
"setting_html_reset_button": {
"message": "Resetar",
"description": ""
"description": "This string is used as name for the reset button on the settings page."
},
"setting_html_reset_button_title": {
"message": "Resetar tudo",
"description": ""
"description": "This string is used as title for the reset button on the settings page."
},
"setting_rule_url_label": {
"message": "Url do arquivo data.json (regras)",
"description": ""
"description": "This string is used as name for the rule url label."
},
"settings_html_save_button": {
"message": "Salvar e recarregar extensão",
"description": ""
"description": "This string is used as name for the save&reload button on the settings page."
},
"settings_html_save_button_title": {
"message": "Salvar configurações",
"description": ""
"description": "This string is used as title for the save&reload button on the settings page."
},
"setting_hash_url_label": {
"message": "Url do arquivo rules.hash (hash)",
"description": ""
"description": "This string is used as name for the rule.hash url label."
},
"setting_types_label": {
"message": "<a href='https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/webRequest/ResourceType' target='_blank'>Tipos de pedidos</a> (expert level)",
"description": "This string is used as name for the types label."
},
"setting_report_server_label": {
"message": "Reportar servidor para URLs",
"description": "Note: Currently not used."
},
"success_report_url": {
"message": "A URL foi reportada com sucesso. Estaremos verificando a url em breve.",
"description": "Note: Currently not used."
},
"error_report_url": {
"message": "Parece que essa URL ja foi reportada.",
"description": "Note: Currently not used."
},
"donate_button": {
"message": "Uma doação para o criador do ClearURLs.",
"description": "This string is used to refer to a donation page."
},
"clipboard_copy_link": {
"message": "Copiar local do link limpo",
"description": "This string is used in the context menu to copy clean links."
},
"context_menu_enabled": {
"message": "Mostrar entrada do menu de contexto",
"description": "This string is used toggle the context menu entry to copy clean links."
},
"history_listener_enabled": {
"message": "Prevent tracking injection over history API (See also: <a href='https://developer.mozilla.org/en-US/docs/Web/API/History_API#The_replaceState()_method' target='_blank'>The replaceState() method</a>)",
"description": "This string is used as name for the history API listener label."
},
"cleaning_tool_page_title": {
"message": "Ferramenta de limpeza do ClearURLs",
"description": "This string is used as title on the cleaning tool page."
},
"cleaning_tool_description": {
"message": "Com essa ferramenta você pode colar URLs e ClearURLs as limpará após um clique no botão verde. Você pode colar várias URLs de uma só vez, mas cada URL deve estar em uma linha separada.",
"description": "This string is used as description of the cleaning tool."
},
"cleaning_tool_btn": {
"message": "Limpar URLs",
"description": "This string is used as name for the clean url button."
},
"cleaning_tool_dirty_urls_label": {
"message": "Aqui você pode colar as urls que deseja limpar:",
"description": "This string is used as title on the cleaning tool page for the dirty URLs."
},
"cleaning_tool_clean_urls_label": {
"message": "Aqui você pode encontrar as urls limpas:",
"description": "This string is used as title on the cleaning tool page for the clean URLs."
}
}
}

View File

@@ -1,216 +1,328 @@
{
"hash_status_code_1": {
"message": "не требует обновления",
"description": ""
"message": "актуальны",
"description": "This status code says, that no update is available for the ClearURLs rules and everything is up to date."
},
"hash_status_code_2": {
"message": "обновлено",
"description": ""
"message": "обновлены",
"description": "This status code says, that the ClearURLs rules are successfully updated."
},
"hash_status_code_3": {
"message": "есть обновление",
"description": ""
"message": "доступно обновление",
"description": "This status code says, that an update is available for the ClearURLs rules."
},
"hash_status_code_4": {
"message": "ошибка",
"description": ""
"description": "This status code says, that the ClearURLs could not be started correctly."
},
"hash_status_code_5": {
"message": "Ой, что-то не так!",
"description": ""
"message": "Ой! Что-то пошло не так!",
"description": "This status code says, that an error occurred while updating the ClearURLs rules."
},
"log_redirect": {
"message": "Этот URL перенаправляется",
"description": ""
"description": "This string is used on redirections in the ClearURLs log."
},
"log_domain_blocked": {
"message": "Этот домен заблокирован",
"description": ""
"description": "This string is used on blocked domains in the ClearURLs log."
},
"check_os_log": {
"message": "[ClearURLs]: Лог listener добавлен.",
"description": ""
"message": "[ClearURLs]: логирование активировано.",
"description": "This string is used on ClearURLs log startup."
},
"log_html_page_title": {
"message": "Лог ClearURLs",
"description": ""
"message": "Журнал ClearURLs",
"description": "This string is used as header on the log page."
},
"log_html_table_head_1": {
"message": "До обработки",
"description": ""
"description": "This string is used as table title on the log page."
},
"log_html_table_head_2": {
"message": "После обработки",
"description": ""
"description": "This string is used as table title on the log page."
},
"log_html_table_head_3": {
"message": "Правило",
"description": ""
"description": "This string is used as table title on the log page."
},
"log_html_table_head_4": {
"message": "Время",
"description": ""
"description": "This string is used as table title on the log page."
},
"log_html_reset_button": {
"message": "Сброс",
"description": ""
"message": "Очистить",
"description": "This string is used for the reset button on the log page."
},
"log_html_reset_button_title": {
"message": "Сброс глобального лога",
"description": ""
"message": "Очистить журнал",
"description": "This string is used as title for the reset button on the log page."
},
"popup_html_configs_head": {
"message": "Настройки",
"description": ""
"description": "This string is used as title for the configs on the popup page."
},
"popup_html_configs_switch_filter": {
"message": "Фильтр",
"description": ""
"description": "This string is used as name for the filter switch button on the popup page."
},
"popup_html_configs_switch_filter_title": {
"message": "Активирует функцию очистки URL. Если выключить - аддон не будет работать",
"description": ""
"message": "Функция очистки URL. Если выключить - расширение работать не будет!",
"description": "This string is used as title for the filter switch button on the popup page."
},
"popup_html_configs_switch_log": {
"message": "Логирование",
"description": ""
"description": "This string is used as name for the logging switch button on the popup page."
},
"popup_html_configs_switch_log_title": {
"message": "Лог сохраняется только локально. Не используйте эту функцию, если она вам не нужна.",
"description": ""
"message": "Журнал сохраняется только локально. Не используйте эту функцию, если она Вам не нужна",
"description": "This string is used as title for the logging switch button on the popup page."
},
"popup_html_configs_switch_badges": {
"message": "Значки",
"description": ""
"message": "Счётчик",
"description": "This string is used as name for the badges switch button on the popup page."
},
"popup_html_configs_switch_badges_title": {
"message": "Показать количество очищенных URL",
"description": ""
"message": "Показывать количество очищенных URL",
"description": "This string is used as title for the badges switch button on the popup page."
},
"popup_html_statistics_head": {
"message": "Статистика",
"description": ""
"description": "This string is used as title for the statistics on the popup page."
},
"popup_html_statistics_elements": {
"message": "Элементы",
"description": ""
"message": "Элементов",
"description": "This string is used as name for the elements on the popup page."
},
"popup_html_statistics_blocked": {
"message": "Заблокировано",
"description": ""
"description": "This string is used as name for the blocked elements on the popup page."
},
"popup_html_statistics_percentage": {
"message": "Процент",
"description": ""
"description": "This string is used as name for the percentage of blocked elements on the popup page."
},
"popup_html_statistics_reset_button": {
"message": "Сброс",
"description": ""
"message": "Очистить",
"description": "This string is used as name for the statistics reset button on the popup page."
},
"popup_html_statistics_reset_button_title": {
"message": "Сброс глобальной статистики",
"description": ""
"message": "Очистить статистику",
"description": "This string is used as title for the statistics reset button on the popup page."
},
"popup_html_rules_status_head": {
"message": "Актуальность правил",
"description": ""
"description": "This string is used as title for the rules-status section on the popup page."
},
"popup_html_log_head": {
"message": "Лог",
"description": ""
"message": "Журнал",
"description": "This string is used as name for the log button on the popup page."
},
"popup_html_log_head_title": {
"message": "Открыть лог",
"description": ""
"message": "Открыть журнал",
"description": "This string is used as title for the log button on the popup page."
},
"popup_html_report_button": {
"message": "Сообщить о текущей ссылке",
"description": "Note: Currently not used."
},
"popup_html_report_button_title": {
"message": "Сообщить о текущей вкладке",
"description": "Currently not used."
},
"core_save_on_disk": {
"message": "[ClearURLs]: Сохранить на диск.",
"description": ""
"message": "[ClearURLs]: сохранено на диск.",
"description": "This string is used to tell the user, that ClearURLs saved the settings on disk."
},
"core_error": {
"message": "[ClearURLs]: Не удалось запустить аддон.",
"description": ""
"message": "[ClearURLs]: не удалось запустить расширение.",
"description": "This string is used to tell the user, that ClearURLs could not be started."
},
"configs_switch_statistics": {
"message": "Статистика",
"description": ""
"description": "This string is used as name for the statistics switch button on the popup page."
},
"configs_switch_statistics_title": {
"message": "Вкл. или выкл. статистику",
"description": ""
"message": "Вкл./выкл. статистики",
"description": "This string is used as title for the statistics switch button on the popup page."
},
"settings_html_page_title": {
"message": "Настройки ClearURLs",
"description": ""
"description": "This string is used as title on the settings page."
},
"badged_color_label": {
"message": "Цвет значка",
"description": ""
"description": "This string is used as name for the badged color label."
},
"setting_html_reset_button": {
"message": "Сброс",
"description": ""
"description": "This string is used as name for the reset button on the settings page."
},
"setting_html_reset_button_title": {
"message": "Сбросить всё",
"description": ""
"message": "Сброс всех настроек",
"description": "This string is used as title for the reset button on the settings page."
},
"setting_rule_url_label": {
"message": "Ссылка на файл data.json (правила)",
"description": ""
"message": "Ссылка к файлу data.json (правила)",
"description": "This string is used as name for the rule url label."
},
"settings_html_save_button": {
"message": "Сохранить и перезагрузить аддон",
"description": ""
"message": "Сохранить и перезапустить расширение",
"description": "This string is used as name for the save&reload button on the settings page."
},
"settings_html_save_button_title": {
"message": "Сохранение настроек",
"description": ""
"message": "Сохранить настройки",
"description": "This string is used as title for the save&reload button on the settings page."
},
"setting_hash_url_label": {
"message": "Ссылка на файл rules.hash (хэш)",
"description": ""
"message": "Ссылка к файлу rules.hash (хэш)",
"description": "This string is used as name for the rule.hash url label."
},
"setting_types_label": {
"message": "<a href='https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/webRequest/ResourceType' target='_blank'>Тип запроса</a> (уровень эксперта)",
"description": "This string is used as name for the types label."
},
"setting_report_server_label": {
"message": "Сервер отчётов для URL-адресов",
"description": "Note: Currently not used."
},
"success_report_url": {
"message": "Отчёт об URL успешно отправлен. Мы проверим его в ближайшее время.",
"description": "Note: Currently not used."
},
"error_report_url": {
"message": "Похоже, об этом URL уже сообщили.",
"description": "Note: Currently not used."
},
"donate_button": {
"message": "Пожертвование для разработчика ClearURLs",
"description": "This string is used to refer to a donation page."
},
"clipboard_copy_link": {
"message": "Копировать чистую ссылку",
"description": "This string is used in the context menu to copy clean links."
},
"context_menu_enabled": {
"message": "Отображение пункта в контекстном меню",
"description": "This string is used toggle the context menu entry to copy clean links."
},
"history_listener_enabled": {
"message": "Предотвращение отслеживания по истории API (см.: <a href='https://developer.mozilla.org/en-US/docs/Web/API/History_API#The_replaceState()_method' target='_blank'>replaceState() метод</a>)",
"description": "This string is used as name for the history API listener label."
},
"cleaning_tool_page_title": {
"message": "Инструмент очистки ClearURLs",
"description": "This string is used as title on the cleaning tool page."
},
"cleaning_tool_description": {
"message": "Вставьте ссылки в текстовое поле, ClearURLs очистит ссылки после нажатия на зелёную кнопку. Вы можете вставить несколько URL-адресов, но каждый URL-адрес должен быть в отдельной строке.",
"description": "This string is used as description of the cleaning tool."
},
"cleaning_tool_btn": {
"message": "Почистить ссылки",
"description": "This string is used as name for the clean url button."
},
"cleaning_tool_dirty_urls_label": {
"message": "Сюда Вы можете вставить грязные ссылки:",
"description": "This string is used as title on the cleaning tool page for the dirty URLs."
},
"cleaning_tool_clean_urls_label": {
"message": "Здесь Вы найдёте очищенные ссылки:",
"description": "This string is used as title on the cleaning tool page for the clean URLs."
},
"local_hosts_skipping": {
"message": "Пропускать локальные адреса (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, 100.64.0.0/10, 169.254.0.0/16, 127.0.0.1, localhost)",
"description": "This string is used as label for the local host skipping switch"
},
"local_hosts_skipping_title": {
"message": "Пропускать локальные адреса",
"description": "This string is used as title for the local host skipping switch"
},
"log_html_export_button": {
"message": "Экспорт",
"description": "This string is used for the export button on the log page."
},
"log_html_export_button_title": {
"message": "Экспорт журнала",
"description": "This string is used as title for the export button on the log page."
},
"log_html_import_button": {
"message": "Импорт",
"description": "This string is used for the import button on the log page."
},
"log_html_import_button_title": {
"message": "Импорт журнала",
"description": "This string is used as title for the import button on the log page."
},
"setting_html_export_button": {
"message": "Экспорт",
"description": "This string is used as name for the export button on the settings page."
},
"setting_html_export_button_title": {
"message": "Экспортировать всё",
"description": "This string is used as title for the export button on the settings page."
},
"setting_html_import_button": {
"message": "Импорт",
"description": "This string is used as name for the reset button on the settings page."
},
"setting_html_import_button_title": {
"message": "Импортировать всё",
"description": "This string is used as title for the import button on the settings page."
},
"setting_log_limit_label": {
"message": "Ограничивать журнал до $LIMIT$ записей (-1 := ∞)",
"description": "This string is used as name for the log limit label.",
"placeholders": {
"limit": {
"content": "$1",
"example": "100"
}
}
},
"blocked_html_title": {
"message": "Этот сайт был заблокирован <b>ClearURLs</b>",
"description": "This string is used as title on the blocked site page."
},
"blocked_html_body": {
"message": "Этот сайт был заблокирован расширением <b>ClearURLs</b>, потому что он определён как рекламный и/или отслеживающий сервис. Чтобы посетить этот сайт, необходимо временно отключить расширение или отключить блокировку домена в настройках ClearURLs. Затем нажмите кнопку ниже, чтобы загрузить страницу",
"description": "This string is used as body on the blocked site page."
},
"blocked_html_button": {
"message": "Посетить страницу",
"description": "This string is used as button on the blocked site page."
},
"referral_marketing_enabled": {
"message": "Разрешить рефералы маркетинга",
"description": "This string is used as label for the referral marketing switch"
},
"referral_marketing_enabled_title": {
"message": "Разрешить рефералы маркетинга",
"description": "This string is used as title for the referral marketing switch"
},
"watchdog": {
"message": "[ClearURLs]: сторожевой таймер обнаружил проблему. ClearURLs будет перезапущен.",
"description": "This string is used as text for the watchdog"
},
"domain_blocking_enabled": {
"message": "Разрешить блокировку домена (может вызвать проблемы на сайтах, которые запрещают AdBlocker)",
"description": "This string is used as label for the domain blocking switch"
},
"domain_blocking_enabled_title": {
"message": "Разрешить блокировку домена (может вызвать проблемы на сайтах, которые запрещают AdBlocker)",
"description": "This string is used as title for the domain blocking switch"
},
"log_ping_blocked": {
"message": "Аудит гиперссылки был заблокирован",
"description": "This string is used on hyperlink auditing in the ClearURLs log."
},
"ping_blocking_enabled": {
"message": "Блокировка аудита гиперссылок (см. <a href='https://html.spec.whatwg.org/multipage/links.html#hyperlink-auditing' target='_blank'>эту статью</a>)",
"description": "This string is used as label for the hyperlink auditing blocking switch"
},
"ping_blocking_enabled_title": {
"message": "Блокировка аудита гиперссылок",
"description": "This string is used as title for the hyperlink auditing blocking switch"
}
}
}

View File

@@ -0,0 +1,316 @@
{
"hash_status_code_1": {
"message": "senaste version",
"description": "This status code says, that no update is available for the ClearURLs rules and everything is up to date."
},
"hash_status_code_2": {
"message": "uppdaterad",
"description": "This status code says, that the ClearURLs rules are successfully updated."
},
"hash_status_code_3": {
"message": "uppdatering tillgänglig",
"description": "This status code says, that an update is available for the ClearURLs rules."
},
"hash_status_code_4": {
"message": "fel",
"description": "This status code says, that the ClearURLs could not be started correctly."
},
"hash_status_code_5": {
"message": "Ojdå, något gick fel!",
"description": "This status code says, that an error occurred while updating the ClearURLs rules."
},
"log_redirect": {
"message": "Den här webbadressen omdirigeras",
"description": "This string is used on redirections in the ClearURLs log."
},
"log_domain_blocked": {
"message": "Den här domänen är blockerad",
"description": "This string is used on blocked domains in the ClearURLs log."
},
"check_os_log": {
"message": "[ClearURLs]: Logglistare är tilllagd.",
"description": "This string is used on ClearURLs log startup."
},
"log_html_page_title": {
"message": "Logg från ClearURLs",
"description": "This string is used as header on the log page."
},
"log_html_table_head_1": {
"message": "Före bearbetning",
"description": "This string is used as table title on the log page."
},
"log_html_table_head_2": {
"message": "Efter bearbetning",
"description": "This string is used as table title on the log page."
},
"log_html_table_head_3": {
"message": "Regel",
"description": "This string is used as table title on the log page."
},
"log_html_table_head_4": {
"message": "Tid",
"description": "This string is used as table title on the log page."
},
"log_html_reset_button": {
"message": "Återställ",
"description": "This string is used for the reset button on the log page."
},
"log_html_reset_button_title": {
"message": "Återställ den globala loggen",
"description": "This string is used as title for the reset button on the log page."
},
"popup_html_configs_head": {
"message": "Konfiguration",
"description": "This string is used as title for the configs on the popup page."
},
"popup_html_configs_switch_filter": {
"message": "Filter",
"description": "This string is used as name for the filter switch button on the popup page."
},
"popup_html_configs_switch_filter_title": {
"message": "Filteromkopplaren aktiverar rensningsfunktionen i ClearURLs. Om du inaktiverar detta alternativ, är hela tillägget inaktiverat",
"description": "This string is used as title for the filter switch button on the popup page."
},
"popup_html_configs_switch_log": {
"message": "Logga",
"description": "This string is used as name for the logging switch button on the popup page."
},
"popup_html_configs_switch_log_title": {
"message": "Loggen sparas endast lokalt. Vi avråder dig från att använda den här funktionen om du inte behöver den",
"description": "This string is used as title for the logging switch button on the popup page."
},
"popup_html_configs_switch_badges": {
"message": "Märken",
"description": "This string is used as name for the badges switch button on the popup page."
},
"popup_html_configs_switch_badges_title": {
"message": "Visa antalet rensade webbadresser",
"description": "This string is used as title for the badges switch button on the popup page."
},
"popup_html_statistics_head": {
"message": "Statistik",
"description": "This string is used as title for the statistics on the popup page."
},
"popup_html_statistics_elements": {
"message": "Element",
"description": "This string is used as name for the elements on the popup page."
},
"popup_html_statistics_blocked": {
"message": "Blockerade",
"description": "This string is used as name for the blocked elements on the popup page."
},
"popup_html_statistics_percentage": {
"message": "Procentsats",
"description": "This string is used as name for the percentage of blocked elements on the popup page."
},
"popup_html_statistics_reset_button": {
"message": "Återställ",
"description": "This string is used as name for the statistics reset button on the popup page."
},
"popup_html_statistics_reset_button_title": {
"message": "Återställ den globala statistiken",
"description": "This string is used as title for the statistics reset button on the popup page."
},
"popup_html_rules_status_head": {
"message": "Regler-Status",
"description": "This string is used as title for the rules-status section on the popup page."
},
"popup_html_log_head": {
"message": "Logg",
"description": "This string is used as name for the log button on the popup page."
},
"popup_html_log_head_title": {
"message": "Öppna loggen",
"description": "This string is used as title for the log button on the popup page."
},
"popup_html_report_button": {
"message": "Rapportera aktuell webbadress",
"description": "Note: Currently not used."
},
"popup_html_report_button_title": {
"message": "Rapportera den aktuella webbadressen från den här fliken.",
"description": "Currently not used."
},
"core_save_on_disk": {
"message": "[ClearURLs]: Spara till disk.",
"description": "This string is used to tell the user, that ClearURLs saved the settings on disk."
},
"core_error": {
"message": "[ClearURLs]: Tillägget kunde inte starta.",
"description": "This string is used to tell the user, that ClearURLs could not be started."
},
"configs_switch_statistics": {
"message": "Statistik",
"description": "This string is used as name for the statistics switch button on the popup page."
},
"configs_switch_statistics_title": {
"message": "Aktivera eller inaktivera statistiken",
"description": "This string is used as title for the statistics switch button on the popup page."
},
"settings_html_page_title": {
"message": "Inställningar för ClearURLs",
"description": "This string is used as title on the settings page."
},
"badged_color_label": {
"message": "Märkesfärg",
"description": "This string is used as name for the badged color label."
},
"setting_html_reset_button": {
"message": "Återställ",
"description": "This string is used as name for the reset button on the settings page."
},
"setting_html_reset_button_title": {
"message": "Återställer allt",
"description": "This string is used as title for the reset button on the settings page."
},
"setting_rule_url_label": {
"message": "Webbadressen till filen data.json (regler)",
"description": "This string is used as name for the rule url label."
},
"settings_html_save_button": {
"message": "Spara och ladda om tillägget",
"description": "This string is used as name for the save&reload button on the settings page."
},
"settings_html_save_button_title": {
"message": "Sparar inställningarna",
"description": "This string is used as title for the save&reload button on the settings page."
},
"setting_hash_url_label": {
"message": "Webbadressen till filen rules.hash (hash)",
"description": "This string is used as name for the rule.hash url label."
},
"setting_types_label": {
"message": "<a href='https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/webRequest/ResourceType' target='_blank'>Request types</a> (expertnivå)",
"description": "This string is used as name for the types label."
},
"setting_report_server_label": {
"message": "Rapporteringsserver för webbadresser",
"description": "Note: Currently not used."
},
"success_report_url": {
"message": "Webbadressen har rapporterats. Vi kommer att kontrollera webbadressen snart.",
"description": "Note: Currently not used."
},
"error_report_url": {
"message": "Det verkar som att den här webbadressen redan har rapporterats.",
"description": "Note: Currently not used."
},
"donate_button": {
"message": "Donera till skaparen av ClearURLs.",
"description": "This string is used to refer to a donation page."
},
"clipboard_copy_link": {
"message": "Kopiera rensad webbadress",
"description": "This string is used in the context menu to copy clean links."
},
"context_menu_enabled": {
"message": "Visa post i innehållsmenyn",
"description": "This string is used toggle the context menu entry to copy clean links."
},
"history_listener_enabled": {
"message": "Förhindra spårning av injektion över historik-API (Se även: <a href='https://developer.mozilla.org/en-US/docs/Web/API/History_API#The_replaceState()_method' target='_blank'>The replaceState() method</a>)",
"description": "This string is used as name for the history API listener label."
},
"cleaning_tool_page_title": {
"message": "Rensningsverktyg för ClearURLs",
"description": "This string is used as title on the cleaning tool page."
},
"cleaning_tool_description": {
"message": "Med detta verktyg kan du klistra in webbadresser och ClearURLs kommer att rensa webbadresserna efter ett klick på den gröna knappen. Du kan klistra en mer än en webbadress samtidigt, men varje webbadress måste vara på var sin rad.",
"description": "This string is used as description of the cleaning tool."
},
"cleaning_tool_btn": {
"message": "Rensa webbadresser",
"description": "This string is used as name for the clean url button."
},
"cleaning_tool_dirty_urls_label": {
"message": "Här kan du klistra in orensade webbadresser:",
"description": "This string is used as title on the cleaning tool page for the dirty URLs."
},
"cleaning_tool_clean_urls_label": {
"message": "Här hittar du de rensade webbadresserna:",
"description": "This string is used as title on the cleaning tool page for the clean URLs."
},
"local_hosts_skipping": {
"message": "Hoppa över webbadresser på lokala värdar (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, 100.64.0.0/10, 169.254.0.0/16, 127.0.0.1, localhost)",
"description": "This string is used as label for the local host skipping switch"
},
"local_hosts_skipping_title": {
"message": "Hoppa över webbadresser på lokala värdar",
"description": "This string is used as title for the local host skipping switch"
},
"log_html_export_button": {
"message": "Exportera",
"description": "This string is used for the export button on the log page."
},
"log_html_export_button_title": {
"message": "Exportera den globala loggen",
"description": "This string is used as title for the export button on the log page."
},
"log_html_import_button": {
"message": "Importera",
"description": "This string is used for the import button on the log page."
},
"log_html_import_button_title": {
"message": "Importera den globala loggen",
"description": "This string is used as title for the import button on the log page."
},
"setting_html_export_button": {
"message": "Exportera",
"description": "This string is used as name for the export button on the settings page."
},
"setting_html_export_button_title": {
"message": "Exportera allt",
"description": "This string is used as title for the export button on the settings page."
},
"setting_html_import_button": {
"message": "Importera",
"description": "This string is used as name for the reset button on the settings page."
},
"setting_html_import_button_title": {
"message": "Importera allt",
"description": "This string is used as title for the import button on the settings page."
},
"setting_log_limit_label": {
"message": "Begränsa loggfilen till $LIMIT$ poster. (-1 := ∞)",
"description": "This string is used as name for the log limit label.",
"placeholders": {
"limit": {
"content": "$1",
"example": "100"
}
}
},
"blocked_html_title": {
"message": "Den här webbplatsen blockerades av <b>ClearURLs</b>",
"description": "This string is used as title on the blocked site page."
},
"blocked_html_body": {
"message": "Den här sidan har blivit blockerats av <b>ClearURLs</b>, eftersom vi har identifierat webbplatsen som en reklam- och/eller spårningstjänst. För att besöka webbplatsen måste du tillfälligt inaktivera tillägget eller inaktivera domänblockering i inställningarna på ClearURLs. Efter detta kan du klicka på knappen nedan för att ladda sidan.",
"description": "This string is used as body on the blocked site page."
},
"blocked_html_button": {
"message": "Gå till sidan",
"description": "This string is used as button on the blocked site page."
},
"referral_marketing_enabled": {
"message": "Tillåt referral marketing",
"description": "This string is used as label for the referral marketing switch"
},
"referral_marketing_enabled_title": {
"message": "Tillåt referral marketing",
"description": "This string is used as title for the referral marketing switch"
},
"watchdog": {
"message": "[ClearURLs]: Ett problem har upptäckts. ClearURLs startar om.",
"description": "This string is used as text for the watchdog"
},
"domain_blocking_enabled": {
"message": "Tillåt domänblockering (Kan leda till problem på sidor som inte tillåter AdBlockers)",
"description": "This string is used as label for the domain blocking switch"
},
"domain_blocking_enabled_title": {
"message": "Tillåt domänblockering (Kan leda till problem på sidor som inte tillåter AdBlockers)",
"description": "This string is used as title for the domain blocking switch"
}
}

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

@@ -0,0 +1,328 @@
{
"hash_status_code_1": {
"message": "güncel",
"description": "Bu durum kodu, ClearURL kuralları için güncelleme olmadığını ve her şeyin güncel olduğunu söylüyor."
},
"hash_status_code_2": {
"message": "güncelleştirildi",
"description": "Bu durum kodu, ClearURL kurallarının başarıyla güncellendiğini söylüyor."
},
"hash_status_code_3": {
"message": "Güncelleme mevcut",
"description": "Bu durum kodu, ClearURL kuralları için bir güncellemenin mevcut olduğunu söylüyor."
},
"hash_status_code_4": {
"message": "hata",
"description": "Bu durum kodu, ClearURL'lerin doğru şekilde başlatılamadığını söylüyor."
},
"hash_status_code_5": {
"message": "Hoop! Birşeyler yanlış gitti!",
"description": "Bu durum kodu, ClearURL kurallarını güncellerken bir hata oluştuğunu söylüyor."
},
"log_redirect": {
"message": "Bu URL yönlendirildi",
"description": "Bu dize ClearURL'ler günlüğündeki yönlendirmelerde kullanılır."
},
"log_domain_blocked": {
"message": "Bu alan adı engellendi",
"description": "Bu dize ClearURL'ler günlüğündeki engellenen alan adlarında kullanılır."
},
"check_os_log": {
"message": "[ClearURLs]: Günlük dinleyicisi eklendi.",
"description": "Bu dize ClearURLs log başlangıcında kullanılır."
},
"log_html_page_title": {
"message": "ClearURLs'dan Günlük",
"description": "Bu dize, günlük sayfasında üstbilgi olarak kullanılır."
},
"log_html_table_head_1": {
"message": "İşlemeden önce",
"description": "Bu dize, günlük sayfasında tablo başlığı olarak kullanılır."
},
"log_html_table_head_2": {
"message": "İşlemden sonra",
"description": "Bu dize, günlük sayfasında tablo başlığı olarak kullanılır."
},
"log_html_table_head_3": {
"message": "Kural",
"description": "Bu dize, günlük sayfasında tablo başlığı olarak kullanılır."
},
"log_html_table_head_4": {
"message": "Zaman",
"description": "Bu dize, günlük sayfasında tablo başlığı olarak kullanılır."
},
"log_html_reset_button": {
"message": "Sıfırla",
"description": "Bu dize, günlük sayfasındaki sıfırlama düğmesi için kullanılır."
},
"log_html_reset_button_title": {
"message": "Genel günlüğü sıfırla",
"description": "Bu dize, günlük sayfasındaki sıfırlama düğmesi için başlık olarak kullanılır."
},
"popup_html_configs_head": {
"message": "Yapılandırmalar",
"description": "Bu dize, açılır sayfadaki yapılandırmalar için başlık olarak kullanılır."
},
"popup_html_configs_switch_filter": {
"message": "Filtre",
"description": "Bu dize, açılır sayfadaki filtre değiştirme düğmesinin adı olarak kullanılır."
},
"popup_html_configs_switch_filter_title": {
"message": "Filtreler anahtarı ClearURL'lerin temizleme işlevini etkinleştirir. Bu seçeneği devre dışı bırakırsanız, tüm eklenti devre dışı bırakılır",
"description": "Bu dize, açılır sayfadaki filtre değiştirme düğmesinin başlığı olarak kullanılır."
},
"popup_html_configs_switch_log": {
"message": "Günlük tutma",
"description": "Bu dize, açılır sayfadaki günlük anahtar düğmesinin adı olarak kullanılır."
},
"popup_html_configs_switch_log_title": {
"message": "Günlük yalnızca yerel olarak kaydedilir. İhtiyacınız yoksa bu özelliğe karşı tavsiyede bulunuruz",
"description": "Bu dize, açılır sayfadaki kayıt anahtarı düğmesinin başlığı olarak kullanılır."
},
"popup_html_configs_switch_badges": {
"message": "Rozetler",
"description": "Bu dize, açılır sayfadaki rozetler anahtar düğmesinin adı olarak kullanılır."
},
"popup_html_configs_switch_badges_title": {
"message": "Temizlenmiş URL'lerin sayısını göster",
"description": "Bu dize, açılır sayfadaki rozetler anahtar düğmesinin başlığı olarak kullanılır."
},
"popup_html_statistics_head": {
"message": "istatistik",
"description": "Bu dize, açılır sayfadaki istatistikler için başlık olarak kullanılır."
},
"popup_html_statistics_elements": {
"message": "Öğeler",
"description": "Bu dize, açılır sayfadaki öğelerin adı olarak kullanılır."
},
"popup_html_statistics_blocked": {
"message": "Engellendi",
"description": "Bu dize, açılır penceredeki engellenen öğelerin adı olarak kullanılır."
},
"popup_html_statistics_percentage": {
"message": "Yüzde",
"description": "Bu dize, açılır sayfadaki engellenen öğelerin yüzdesi için ad olarak kullanılır."
},
"popup_html_statistics_reset_button": {
"message": "Sıfırlama",
"description": "Bu dize, açılır sayfadaki istatistik sıfırlama düğmesinin adı olarak kullanılır."
},
"popup_html_statistics_reset_button_title": {
"message": "Genel istatistikleri sıfırla",
"description": "Bu dize, açılır sayfadaki istatistik sıfırlama düğmesinin başlığı olarak kullanılır."
},
"popup_html_rules_status_head": {
"message": "Kurallar-Durum",
"description": "Bu dize, açılır sayfadaki kurallar-durum bölümü için başlık olarak kullanılır."
},
"popup_html_log_head": {
"message": "Günlük",
"description": "Bu dize, açılır sayfadaki günlük düğmesinin adı olarak kullanılır."
},
"popup_html_log_head_title": {
"message": "Günlüğü aç",
"description": "Bu dize, açılır penceredeki günlük düğmesinin başlığı olarak kullanılır."
},
"popup_html_report_button": {
"message": "Geçerli URL'yi bildir",
"description": "Not: Şu anda kullanılmamaktadır."
},
"popup_html_report_button_title": {
"message": "Geçerli URLyi bu sekmeden bildirin.",
"description": "Şu anda kullanılmamış."
},
"core_save_on_disk": {
"message": "[ClearURLs]: Diske kaydedin.",
"description": "Bu dize, kullanıcıya ClearURL'lerin ayarları diske kaydettiğini söylemek için kullanılır."
},
"core_error": {
"message": "[ClearURLs]: Eklenti başlatılamadı.",
"description": "Bu dize, kullanıcıya ClearURL'lerin başlatılamadığını söylemek için kullanılır."
},
"configs_switch_statistics": {
"message": "İstatistikler",
"description": "Bu dize, açılır sayfadaki istatistik anahtar düğmesinin adı olarak kullanılır."
},
"configs_switch_statistics_title": {
"message": "İstatistik işlevini etkinleştirin veya devre dışı bırakın",
"description": "Bu dize, açılır sayfadaki istatistik değiştirme düğmesinin başlığı olarak kullanılır."
},
"settings_html_page_title": {
"message": "ClearURL'lerdeki Ayarlar",
"description": "Bu dize, ayarlar sayfasında başlık olarak kullanılır."
},
"badged_color_label": {
"message": "Rozet renk",
"description": "Bu dize, rozet renk etiketinin adı olarak kullanılır."
},
"setting_html_reset_button": {
"message": "Sıfırlama",
"description": "Bu dize, ayarlar sayfasındaki sıfırlama düğmesinin adı olarak kullanılır."
},
"setting_html_reset_button_title": {
"message": "Her şeyi sıfırla",
"description": "Bu dize, ayarlar sayfasındaki sıfırlama düğmesinin adı olarak kullanılır."
},
"setting_rule_url_label": {
"message": "Data.json dosyasının URL'si (kurallar)",
"description": "Bu dize kural url etiketinin adı olarak kullanılır."
},
"settings_html_save_button": {
"message": "Eklentiyi kaydet ve yeniden yükle",
"description": "Bu dize, ayarlar sayfasındaki kaydet ve yeniden yükle düğmesinin adı olarak kullanılır."
},
"settings_html_save_button_title": {
"message": "Ayarları kaydeder",
"description": "Bu dize, ayarlar sayfasındaki kaydet ve yeniden yükle düğmesinin adı olarak kullanılır."
},
"setting_hash_url_label": {
"message": "Rules.hash dosyasının URL'si (karma)",
"description": "Bu dize rule.hash url etiketinin adı olarak kullanılır."
},
"setting_types_label": {
"message": "<a href='https://developer.mozilla.org/tr-TR/docs/Mozilla/Add-ons/WebExtensions/API/webRequest/ResourceType' target='_blank'>Request types</a> (uzman seviyesi)",
"description": "Bu dize, tür etiketi için ad olarak kullanılır."
},
"setting_report_server_label": {
"message": "URL'ler için rapor sunucusu",
"description": "Not: Şu anda kullanılmamaktadır."
},
"success_report_url": {
"message": "URL başarıyla rapor edildi. Bu URLyi yakında kontrol edeceğiz.",
"description": "Not: Şu anda kullanılmamaktadır."
},
"error_report_url": {
"message": "Bu URL zaten bildirilmiş gibi görünüyor.",
"description": "Not: Şu anda kullanılmamaktadır."
},
"donate_button": {
"message": "ClearURL'nin yaratıcısı için bir bağış.",
"description": "Bu dize bir bağış sayfasına başvurmak için kullanılır."
},
"clipboard_copy_link": {
"message": "Temiz Bağlantı Konumunu Kopyala",
"description": "Bu dize bağlam menüsünde temiz bağlantıları kopyalamak için kullanılır."
},
"context_menu_enabled": {
"message": "İçerik menüsü girişini görüntüle",
"description": "Bu dize, temiz linkleri kopyalamak için bağlam menüsü girişini değiştirmek için kullanılır."
},
"history_listener_enabled": {
"message": "Geçmiş API'si üzerinden izleme enjeksiyonunu engelle(Ayrıca bakınız: <a href='https://developer.mozilla.org/tr-TR/docs/Web/API/History_API#The_replaceState()_method' target='_blank'>The replaceState() method</a>)",
"description": "Bu dize geçmiş API dinleyici etiketinin adı olarak kullanılır."
},
"cleaning_tool_page_title": {
"message": "ClearURL'lerden temizleme aracı",
"description": "Bu dize temizleme aracı sayfasında başlık olarak kullanılır."
},
"cleaning_tool_description": {
"message": "Bu araçla URL'lere yapıştırabilirsiniz ve ClearURL'ler yeşil düğmeye tıkladıktan sonra URL'leri temizler. Aynı anda birden fazla URL'ye yapıştırabilirsiniz, ancak her URL ayrı bir satırda olmalıdır.",
"description": "Bu dize temizleme aracının açıklaması olarak kullanılır."
},
"cleaning_tool_btn": {
"message": "URLleri temizle",
"description": "Bu dize temiz url düğmesinin adı olarak kullanılır."
},
"cleaning_tool_dirty_urls_label": {
"message": "Burada kirli URL'leri yapıştırabilirsiniz:",
"description": "Bu dize, kirli URLlerin temizleme aracı sayfasında başlık olarak kullanılır."
},
"cleaning_tool_clean_urls_label": {
"message": "Temizlenmiş URLleri burada bulabilirsiniz:",
"description": "Bu dize, temiz URLlerin temizleme aracı sayfasında başlık olarak kullanılır."
},
"local_hosts_skipping": {
"message": "Yerel ana makinelerde URLlerin atlanması (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, 100.64.0.0/10, 169.254.0.0/16, 127.0.0.1, yerel ana bilgisayar)",
"description": "Bu dize, yerel ana bilgisayar atlama anahtarı için etiket olarak kullanılır."
},
"local_hosts_skipping_title": {
"message": "Yerel ana makinelerde URL atlama",
"description": "Bu dize, yerel ana bilgisayar atlama anahtarı için başlık olarak kullanılır"
},
"log_html_export_button": {
"message": "Dışa Aktar",
"description": "Bu dize, günlük sayfasındaki verme düğmesi için kullanılır."
},
"log_html_export_button_title": {
"message": "Genel günlüğü dışa aktar",
"description": "Bu dize, günlük sayfasındaki verme düğmesine başlık olarak kullanılır."
},
"log_html_import_button": {
"message": "İçe Aktar",
"description": "Bu dize, günlük sayfasındaki içe aktar düğmesi için kullanılır."
},
"log_html_import_button_title": {
"message": "Genel günlüğü içe aktar",
"description": "Bu dize, günlük sayfasındaki içe aktarma düğmesi için başlık olarak kullanılır."
},
"setting_html_export_button": {
"message": "Dışa Aktar",
"description": "Bu dize, ayarlar sayfasındaki verme düğmesinin adı olarak kullanılır."
},
"setting_html_export_button_title": {
"message": "Her şeyi dışa aktar",
"description": "Bu dize, ayarlar sayfasındaki dışa aktar düğmesi için başlık olarak kullanılır."
},
"setting_html_import_button": {
"message": "Dışa Aktar",
"description": "Bu dize, ayarlar sayfasındaki sıfırlama düğmesinin adı olarak kullanılır."
},
"setting_html_import_button_title": {
"message": "Her şeyi içe aktar",
"description": "Bu dize, ayarlar sayfasındaki alma düğmesinin adı olarak kullanılır."
},
"setting_log_limit_label": {
"message": "Günlüğü $ LIMIT $ girişleriyle sınırlar. (-1: = ∞)",
"description": "Bu dize, günlük sınırı etiketinin adı olarak kullanılır.",
"placeholders": {
"limit": {
"content": "$1",
"example": "100"
}
}
},
"blocked_html_title": {
"message": "Bu site tarafından engellendi <b>ClearURLs</b>",
"description": "Bu dize engellenen site sayfasında başlık olarak kullanılır."
},
"blocked_html_body": {
"message": "Bu site tarafından engellendi <b>ClearURLs</b> Eklentisi, çünkü bu siteyi bir reklamcılık ve / veya izleme hizmeti olarak tanımlıyoruz. Bu siteyi ziyaret etmek için Eklentiyi geçici olarak devre dışı bırakmanız gerekir. ClearURL'leri devre dışı bıraktıktan sonra sayfayı yüklemek için aşağıdaki düğmeye tıklayabilirsiniz.",
"description": "Bu dize engellenen site sayfasında gövde olarak kullanılır."
},
"blocked_html_button": {
"message": "Sayfayı ziyaret et",
"description": "Bu dize engellenen site sayfasındaki düğme olarak kullanılır."
},
"referral_marketing_enabled": {
"message": "Tavsiye pazarlamasına izin ver",
"description": "Bu dize tavsiye pazarlama anahtarı için etiket olarak kullanılır"
},
"referral_marketing_enabled_title": {
"message": "Tavsiye pazarlamasına izin verir",
"description": "Bu dize tavsiye pazarlama anahtarı için başlık olarak kullanılır"
},
"watchdog": {
"message": "[ClearURL'ler]: Güvenlik Zamanlayıcısı bir sorun tespit etti. ClearURL'ler yeniden başlatıldı.",
"description": "Bu dize güvenlik zamanlayıcısı için metin olarak kullanılır."
},
"domain_blocking_enabled": {
"message": "Alan adı engellemeye izin ver (Reklam Engelleyicilere izin vermeyen sayfalarda sorunlara neden olabilir)",
"description": "Bu dize, alan adı engelleme anahtarı için etiket olarak kullanılır"
},
"domain_blocking_enabled_title": {
"message": "Alan adı engellemeye izin ver (Reklam Engelleyicilere izin vermeyen sayfalarda sorunlara neden olabilir)",
"description": "Bu dize, alan adı engelleme anahtarının başlığı olarak kullanılır"
},
"log_ping_blocked": {
"message": "Bu köprü denetimi engellendi",
"description": "Bu dize, ClearURLs günlüğündeki köprü denetimi için kullanılır."
},
"ping_blocking_enabled": {
"message": "Köprü denetimini engelle (Ayrıca bkz.<a href='https://html.spec.whatwg.org/multipage/links.html#hyperlink-auditing' target='_blank'>this article</a>)",
"description": "Bu dize köprü denetim engelleme anahtarı için etiket olarak kullanılır"
},
"ping_blocking_enabled_title": {
"message": "Köprü denetimini engelle",
"description": "Bu dize köprü denetim engelleme anahtarının başlığı olarak kullanılır"
}
}

View File

@@ -1,216 +1,202 @@
{
"hash_status_code_1": {
"message": "не потребує оновлення",
"description": ""
"description": "This status code says, that no update is available for the ClearURLs rules and everything is up to date."
},
"hash_status_code_2": {
"message": "оновлено",
"description": ""
"description": "This status code says, that the ClearURLs rules are successfully updated."
},
"hash_status_code_3": {
"message": "наявне оновлення",
"description": ""
"description": "This status code says, that an update is available for the ClearURLs rules."
},
"hash_status_code_4": {
"message": "помилка",
"description": ""
"description": "This status code says, that the ClearURLs could not be started correctly."
},
"hash_status_code_5": {
"message": "Ой, щось не так!",
"description": ""
"description": "This status code says, that an error occurred while updating the ClearURLs rules."
},
"log_redirect": {
"message": ей URL перенаправляється",
"description": ""
"message": я URL-адреса перенаправляється",
"description": "This string is used on redirections in the ClearURLs log."
},
"log_domain_blocked": {
"message": "Цей домен заблоковано",
"description": ""
"description": "This string is used on blocked domains in the ClearURLs log."
},
"check_os_log": {
"message": "[ClearURLs]: Лог listener додано.",
"description": ""
"message": "[ClearURLs]: listener журналу додано.",
"description": "This string is used on ClearURLs log startup."
},
"log_html_page_title": {
"message": "Лог ClearURLs",
"description": ""
"message": "Журнал ClearURLs",
"description": "This string is used as header on the log page."
},
"log_html_table_head_1": {
"message": "Перед обробкою",
"description": ""
"description": "This string is used as table title on the log page."
},
"log_html_table_head_2": {
"message": "Після обробки",
"description": ""
"description": "This string is used as table title on the log page."
},
"log_html_table_head_3": {
"message": "Правило",
"description": ""
"description": "This string is used as table title on the log page."
},
"log_html_table_head_4": {
"message": "Час",
"description": ""
"description": "This string is used as table title on the log page."
},
"log_html_reset_button": {
"message": "Скидання",
"description": ""
"message": "Скинути",
"description": "This string is used for the reset button on the log page."
},
"log_html_reset_button_title": {
"message": "Скидання глобального логу",
"description": ""
"message": "Скидання глобального журналу",
"description": "This string is used as title for the reset button on the log page."
},
"popup_html_configs_head": {
"message": "Налаштування",
"description": ""
"description": "This string is used as title for the configs on the popup page."
},
"popup_html_configs_switch_filter": {
"message": "Фільтр",
"description": ""
"description": "This string is used as name for the filter switch button on the popup page."
},
"popup_html_configs_switch_filter_title": {
"message": "Активує функцію очищення URL. Якщо вимкнути - аддон не працюватиме",
"description": ""
"message": "Активує функцію очищення ClearURLs. Якщо вимкнути - додаток не працюватиме",
"description": "This string is used as title for the filter switch button on the popup page."
},
"popup_html_configs_switch_log": {
"message": "Логування",
"description": ""
"message": "Журнал",
"description": "This string is used as name for the logging switch button on the popup page."
},
"popup_html_configs_switch_log_title": {
"message": "Лог зберігається лише локально. Не активуйте цю функцію, якщо вона вам не потрібна.",
"description": ""
"message": "Журнал зберігається лише локально. Не активуйте цю функцію, якщо вона вам не потрібна",
"description": "This string is used as title for the logging switch button on the popup page."
},
"popup_html_configs_switch_badges": {
"message": "Значки",
"description": ""
"message": "Позначки",
"description": "This string is used as name for the badges switch button on the popup page."
},
"popup_html_configs_switch_badges_title": {
"message": "Показати кількість очищених URL",
"description": ""
"description": "This string is used as title for the badges switch button on the popup page."
},
"popup_html_statistics_head": {
"message": "Статистика",
"description": ""
"description": "This string is used as title for the statistics on the popup page."
},
"popup_html_statistics_elements": {
"message": "Елементи",
"description": ""
"description": "This string is used as name for the elements on the popup page."
},
"popup_html_statistics_blocked": {
"message": "Заблоковано",
"description": ""
"description": "This string is used as name for the blocked elements on the popup page."
},
"popup_html_statistics_percentage": {
"message": "Відсоток",
"description": ""
"description": "This string is used as name for the percentage of blocked elements on the popup page."
},
"popup_html_statistics_reset_button": {
"message": "Скинути",
"description": ""
"description": "This string is used as name for the statistics reset button on the popup page."
},
"popup_html_statistics_reset_button_title": {
"message": "Скидання глобальної статистики",
"description": ""
"description": "This string is used as title for the statistics reset button on the popup page."
},
"popup_html_rules_status_head": {
"message": "Актуальність правил",
"description": ""
"description": "This string is used as title for the rules-status section on the popup page."
},
"popup_html_log_head": {
"message": "Лог",
"description": ""
"message": "Журнал",
"description": "This string is used as name for the log button on the popup page."
},
"popup_html_log_head_title": {
"message": "Відкрити лог",
"description": ""
"message": "Відкрити журнал",
"description": "This string is used as title for the log button on the popup page."
},
"popup_html_report_button": {
"message": "Повідомити про URL",
"description": "Note: Currently not used."
},
"popup_html_report_button_title": {
"message": "Повідомити про URL з цієї вкладки.",
"description": "Currently not used."
},
"core_save_on_disk": {
"message": "[ClearURLs]: Зберегти на диск.",
"description": ""
"description": "This string is used to tell the user, that ClearURLs saved the settings on disk."
},
"core_error": {
"message": "[ClearURLs]: Не вдалося запустити аддон.",
"description": ""
"message": "[ClearURLs]: Не вдалося запустити додаток.",
"description": "This string is used to tell the user, that ClearURLs could not be started."
},
"configs_switch_statistics": {
"message": "Статистика",
"description": ""
"description": "This string is used as name for the statistics switch button on the popup page."
},
"configs_switch_statistics_title": {
"message": "Увімк. чи вимк. статистику",
"description": ""
"message": "Увімкнення чи вимкнення статистики",
"description": "This string is used as title for the statistics switch button on the popup page."
},
"settings_html_page_title": {
"message": "Налаштування ClearURLs",
"description": ""
"description": "This string is used as title on the settings page."
},
"badged_color_label": {
"message": "Колір значка",
"description": ""
"message": "Колір піктограми",
"description": "This string is used as name for the badged color label."
},
"setting_html_reset_button": {
"message": "Скинути",
"description": ""
"description": "This string is used as name for the reset button on the settings page."
},
"setting_html_reset_button_title": {
"message": "Скинути все",
"description": ""
"description": "This string is used as title for the reset button on the settings page."
},
"setting_rule_url_label": {
"message": "Посилання на файл data.json (правила)",
"description": ""
"description": "This string is used as name for the rule url label."
},
"settings_html_save_button": {
"message": "Зберегти і перезавантажити аддон",
"description": ""
"message": "Зберегти і перезавантажити додаток",
"description": "This string is used as name for the save&reload button on the settings page."
},
"settings_html_save_button_title": {
"message": "Збереження налаштувань",
"description": ""
"description": "This string is used as title for the save&reload button on the settings page."
},
"setting_hash_url_label": {
"message": "Посилання на файл rules.hash (хеш)",
"description": ""
"description": "This string is used as name for the rule.hash url label."
},
"setting_types_label": {
"message": "<a href='https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/webRequest/ResourceType' target='_blank'>Типи запитів</a> (експертний рівень)",
"description": "This string is used as name for the types label."
},
"setting_report_server_label": {
"message": "Звіт про сервер URL",
"description": "Note: Currently not used."
},
"success_report_url": {
"message": "Успішно повідомлено про URL-адресу. Ми невдовзі це перевіримо.",
"description": "Note: Currently not used."
},
"error_report_url": {
"message": "Схоже, про цю URL-адресу вже повідомлено.",
"description": "Note: Currently not used."
},
"donate_button": {
"message": "Внесок для розробників ClearURLs.",
"description": "This string is used to refer to a donation page."
}
}
}

View File

@@ -1,216 +1,234 @@
{
"hash_status_code_1": {
"message": "已是最新的",
"description": ""
"description": "This status code says, that no update is available for the ClearURLs rules and everything is up to date."
},
"hash_status_code_2": {
"message": "已更新",
"description": ""
"description": "This status code says, that the ClearURLs rules are successfully updated."
},
"hash_status_code_3": {
"message": "有可用的更新",
"description": ""
"description": "This status code says, that an update is available for the ClearURLs rules."
},
"hash_status_code_4": {
"message": "错误",
"description": ""
"description": "This status code says, that the ClearURLs could not be started correctly."
},
"hash_status_code_5": {
"message": "糟糕! 有东西不对劲",
"description": ""
"message": "发生错误",
"description": "This status code says, that an error occurred while updating the ClearURLs rules."
},
"log_redirect": {
"message": "此网址已被转址",
"description": ""
"description": "This string is used on redirections in the ClearURLs log."
},
"log_domain_blocked": {
"message": "此网已被封锁",
"description": ""
"message": "此网已被封锁",
"description": "This string is used on blocked domains in the ClearURLs log."
},
"check_os_log": {
"message": "[ClearURLs]: 已新增日志聆听者",
"description": ""
"description": "This string is used on ClearURLs log startup."
},
"log_html_page_title": {
"message": "ClearURLs日志",
"description": ""
"description": "This string is used as header on the log page."
},
"log_html_table_head_1": {
"message": "处理前",
"description": ""
"description": "This string is used as table title on the log page."
},
"log_html_table_head_2": {
"message": "处理后",
"description": ""
"description": "This string is used as table title on the log page."
},
"log_html_table_head_3": {
"message": "规则",
"description": ""
"description": "This string is used as table title on the log page."
},
"log_html_table_head_4": {
"message": "时间",
"description": ""
"description": "This string is used as table title on the log page."
},
"log_html_reset_button": {
"message": "重",
"description": ""
"message": "重",
"description": "This string is used for the reset button on the log page."
},
"log_html_reset_button_title": {
"message": "重设全域日志",
"description": ""
"message": "重置全局日志",
"description": "This string is used as title for the reset button on the log page."
},
"popup_html_configs_head": {
"message": "配置",
"description": ""
"message": "设定",
"description": "This string is used as title for the configs on the popup page."
},
"popup_html_configs_switch_filter": {
"message": "过滤器",
"description": ""
"description": "This string is used as name for the filter switch button on the popup page."
},
"popup_html_configs_switch_filter_title": {
"message": "此过滤器开关为ClearURLs的主开关, 若此项不勾选, 则本插件失效.",
"description": ""
"message": "此为ClearURLs的主开关.关闭则此插件失效.",
"description": "This string is used as title for the filter switch button on the popup page."
},
"popup_html_configs_switch_log": {
"message": "日志",
"description": ""
"description": "This string is used as name for the logging switch button on the popup page."
},
"popup_html_configs_switch_log_title": {
"message": "日志会被储存于本地. 若不需要此功能, 建议不要使用.",
"description": ""
"message": "日志会被储存于本地. 若不需要此功能建议关闭.",
"description": "This string is used as title for the logging switch button on the popup page."
},
"popup_html_configs_switch_badges": {
"message": "徽章",
"description": ""
"description": "This string is used as name for the badges switch button on the popup page."
},
"popup_html_configs_switch_badges_title": {
"message": "显示已清理数量",
"description": ""
"description": "This string is used as title for the badges switch button on the popup page."
},
"popup_html_statistics_head": {
"message": "统计",
"description": ""
"description": "This string is used as title for the statistics on the popup page."
},
"popup_html_statistics_elements": {
"message": "元件",
"description": ""
"description": "This string is used as name for the elements on the popup page."
},
"popup_html_statistics_blocked": {
"message": "已阻挡",
"description": ""
"description": "This string is used as name for the blocked elements on the popup page."
},
"popup_html_statistics_percentage": {
"message": "比例",
"description": ""
"description": "This string is used as name for the percentage of blocked elements on the popup page."
},
"popup_html_statistics_reset_button": {
"message": "重",
"description": ""
"message": "重",
"description": "This string is used as name for the statistics reset button on the popup page."
},
"popup_html_statistics_reset_button_title": {
"message": "重设全域统计",
"description": ""
"message": "重置全局统计",
"description": "This string is used as title for the statistics reset button on the popup page."
},
"popup_html_rules_status_head": {
"message": "规则状态",
"description": ""
"message": "规则-状态",
"description": "This string is used as title for the rules-status section on the popup page."
},
"popup_html_log_head": {
"message": "日志",
"description": ""
"description": "This string is used as name for the log button on the popup page."
},
"popup_html_log_head_title": {
"message": "开启日志",
"description": ""
"description": "This string is used as title for the log button on the popup page."
},
"popup_html_report_button": {
"message": "回报目前网址",
"description": "Note: Currently not used."
},
"popup_html_report_button_title": {
"message": "回报该分页目前网址",
"description": "Currently not used."
},
"core_save_on_disk": {
"message": "[ClearURLs]: 储存于硬盘",
"description": ""
"message": "[ClearURLs]: 储存于本地",
"description": "This string is used to tell the user, that ClearURLs saved the settings on disk."
},
"core_error": {
"message": "[ClearURLs]: 插件无法启动",
"description": ""
"message": "[ClearURLs]: 插件无法启动",
"description": "This string is used to tell the user, that ClearURLs could not be started."
},
"configs_switch_statistics": {
"message": "统计",
"description": ""
"description": "This string is used as name for the statistics switch button on the popup page."
},
"configs_switch_statistics_title": {
"message": "开启或关闭统计功能",
"description": ""
"description": "This string is used as title for the statistics switch button on the popup page."
},
"settings_html_page_title": {
"message": "ClearURLs设",
"description": ""
"message": "ClearURLs设",
"description": "This string is used as title on the settings page."
},
"badged_color_label": {
"message": "徽章颜色",
"description": ""
"description": "This string is used as name for the badged color label."
},
"setting_html_reset_button": {
"message": "重",
"description": ""
"message": "重",
"description": "This string is used as name for the reset button on the settings page."
},
"setting_html_reset_button_title": {
"message": "重所有设",
"description": ""
"message": "重所有设",
"description": "This string is used as title for the reset button on the settings page."
},
"setting_rule_url_label": {
"message": "data.json的网址 (规则)",
"description": ""
"message": "data.json的网址 (规则)",
"description": "This string is used as name for the rule url label."
},
"settings_html_save_button": {
"message": "储存并重启插件",
"description": ""
"description": "This string is used as name for the save&reload button on the settings page."
},
"settings_html_save_button_title": {
"message": "储存设",
"description": ""
"message": "储存设",
"description": "This string is used as title for the save&reload button on the settings page."
},
"setting_hash_url_label": {
"message": "rules.hash的网址 (校验)",
"description": ""
"message": "rules.hash的网址 (校验)",
"description": "This string is used as name for the rule.hash url label."
},
"setting_types_label": {
"message": "<a href='https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/webRequest/ResourceType' target='_blank'>请求类型</a> (进阶设定)",
"description": "This string is used as name for the types label."
},
"setting_report_server_label": {
"message": "回报网址",
"description": "Note: Currently not used."
},
"success_report_url": {
"message": "该网址已成功回报",
"description": "Note: Currently not used."
},
"error_report_url": {
"message": "该网址已被回报过",
"description": "Note: Currently not used."
},
"donate_button": {
"message": "给ClearURLs的作者一点贊助",
"description": "This string is used to refer to a donation page."
},
"clipboard_copy_link": {
"message": "複製清理过的网址",
"description": "This string is used in the context menu to copy clean links."
},
"context_menu_enabled": {
"message": "显示右键选单条目",
"description": "This string is used toggle the context menu entry to copy clean links."
},
"history_listener_enabled": {
"message": "Prevent tracking injection over history API (详见: <a href='https://developer.mozilla.org/en-US/docs/Web/API/History_API#The_replaceState()_method' target='_blank'>The replaceState() method</a>)",
"description": "This string is used as name for the history API listener label."
},
"cleaning_tool_page_title": {
"message": "ClearURLs的网址清理工具",
"description": "This string is used as title on the cleaning tool page."
},
"cleaning_tool_description": {
"message": "此工具提供手动清理网址的功能. 在下方贴上网址并按下绿色按钮, ClearURLs将会输出清理后的网址. 若要同时清理多个网址, 请将每个置于不同行.",
"description": "This string is used as description of the cleaning tool."
},
"cleaning_tool_btn": {
"message": "网址清理工具",
"description": "This string is used as name for the clean url button."
},
"cleaning_tool_dirty_urls_label": {
"message": "清理前的网址:",
"description": "This string is used as title on the cleaning tool page for the dirty URLs."
},
"cleaning_tool_clean_urls_label": {
"message": "清理后的网址:",
"description": "This string is used as title on the cleaning tool page for the clean URLs."
}
}
}

View File

@@ -1,216 +1,234 @@
{
"hash_status_code_1": {
"message": "已是最新的",
"description": ""
"description": "This status code says, that no update is available for the ClearURLs rules and everything is up to date."
},
"hash_status_code_2": {
"message": "已更新",
"description": ""
"description": "This status code says, that the ClearURLs rules are successfully updated."
},
"hash_status_code_3": {
"message": "有可用的更新",
"description": ""
"description": "This status code says, that an update is available for the ClearURLs rules."
},
"hash_status_code_4": {
"message": "錯誤",
"description": ""
"description": "This status code says, that the ClearURLs could not be started correctly."
},
"hash_status_code_5": {
"message": "糟糕! 有東西不對勁",
"description": ""
"message": "發生錯誤",
"description": "This status code says, that an error occurred while updating the ClearURLs rules."
},
"log_redirect": {
"message": "此網址已被轉址",
"description": ""
"description": "This string is used on redirections in the ClearURLs log."
},
"log_domain_blocked": {
"message": "此網已被封鎖",
"description": ""
"message": "此網已被封鎖",
"description": "This string is used on blocked domains in the ClearURLs log."
},
"check_os_log": {
"message": "[ClearURLs]: 已新增記錄聆聽者",
"description": ""
"message": "[ClearURLs]: 已新增記錄監聽器",
"description": "This string is used on ClearURLs log startup."
},
"log_html_page_title": {
"message": "ClearURLs記錄",
"description": ""
"message": "ClearURLs歷史記錄",
"description": "This string is used as header on the log page."
},
"log_html_table_head_1": {
"message": "處理前",
"description": ""
"description": "This string is used as table title on the log page."
},
"log_html_table_head_2": {
"message": "處理後",
"description": ""
"description": "This string is used as table title on the log page."
},
"log_html_table_head_3": {
"message": "規則",
"description": ""
"description": "This string is used as table title on the log page."
},
"log_html_table_head_4": {
"message": "時間",
"description": ""
"description": "This string is used as table title on the log page."
},
"log_html_reset_button": {
"message": "重",
"description": ""
"message": "重",
"description": "This string is used for the reset button on the log page."
},
"log_html_reset_button_title": {
"message": "重全域記錄檔",
"description": ""
"message": "重全域記錄檔",
"description": "This string is used as title for the reset button on the log page."
},
"popup_html_configs_head": {
"message": "配置",
"description": ""
"message": "設定",
"description": "This string is used as title for the configs on the popup page."
},
"popup_html_configs_switch_filter": {
"message": "過濾器",
"description": ""
"description": "This string is used as name for the filter switch button on the popup page."
},
"popup_html_configs_switch_filter_title": {
"message": "此過濾器開關為ClearURLs的主開關,此項不打勾, 則本附加元件失效.",
"description": ""
"message": "此為ClearURLs的主開關.關閉則此附件元件失效.",
"description": "This string is used as title for the filter switch button on the popup page."
},
"popup_html_configs_switch_log": {
"message": "記錄",
"description": ""
"message": "歷史記錄",
"description": "This string is used as name for the logging switch button on the popup page."
},
"popup_html_configs_switch_log_title": {
"message": "記錄檔會被儲存於本機. 若不需要此功能, 建議不要使用.",
"description": ""
"message": "記錄檔會被儲存於本機. 若不需要此功能建議關閉.",
"description": "This string is used as title for the logging switch button on the popup page."
},
"popup_html_configs_switch_badges": {
"message": "徽章",
"description": ""
"description": "This string is used as name for the badges switch button on the popup page."
},
"popup_html_configs_switch_badges_title": {
"message": "顯示已清理數量",
"description": ""
"description": "This string is used as title for the badges switch button on the popup page."
},
"popup_html_statistics_head": {
"message": "統計",
"description": ""
"description": "This string is used as title for the statistics on the popup page."
},
"popup_html_statistics_elements": {
"message": "元件",
"description": ""
"description": "This string is used as name for the elements on the popup page."
},
"popup_html_statistics_blocked": {
"message": "已阻擋",
"description": ""
"description": "This string is used as name for the blocked elements on the popup page."
},
"popup_html_statistics_percentage": {
"message": "比例",
"description": ""
"description": "This string is used as name for the percentage of blocked elements on the popup page."
},
"popup_html_statistics_reset_button": {
"message": "重",
"description": ""
"message": "重",
"description": "This string is used as name for the statistics reset button on the popup page."
},
"popup_html_statistics_reset_button_title": {
"message": "重全域統計",
"description": ""
"message": "重全域統計",
"description": "This string is used as title for the statistics reset button on the popup page."
},
"popup_html_rules_status_head": {
"message": "規則狀態",
"description": ""
"message": "規則-狀態",
"description": "This string is used as title for the rules-status section on the popup page."
},
"popup_html_log_head": {
"message": "記錄",
"description": ""
"message": "記錄",
"description": "This string is used as name for the log button on the popup page."
},
"popup_html_log_head_title": {
"message": "開啟記錄",
"description": ""
"message": "開啟記錄",
"description": "This string is used as title for the log button on the popup page."
},
"popup_html_report_button": {
"message": "回報目前網址",
"description": "Note: Currently not used."
},
"popup_html_report_button_title": {
"message": "回報該分頁目前網址",
"description": "Currently not used."
},
"core_save_on_disk": {
"message": "[ClearURLs]: 儲存於磁碟",
"description": ""
"message": "[ClearURLs]: 儲存於本機",
"description": "This string is used to tell the user, that ClearURLs saved the settings on disk."
},
"core_error": {
"message": "[ClearURLs]: 附加元件無法啟動",
"description": ""
"message": "[ClearURLs]: 附加元件無法啟動",
"description": "This string is used to tell the user, that ClearURLs could not be started."
},
"configs_switch_statistics": {
"message": "統計",
"description": ""
"description": "This string is used as name for the statistics switch button on the popup page."
},
"configs_switch_statistics_title": {
"message": "開啟或關閉統計功能",
"description": ""
"description": "This string is used as title for the statistics switch button on the popup page."
},
"settings_html_page_title": {
"message": "ClearURLs設定",
"description": ""
"description": "This string is used as title on the settings page."
},
"badged_color_label": {
"message": "徽章顏色",
"description": ""
"description": "This string is used as name for the badged color label."
},
"setting_html_reset_button": {
"message": "重",
"description": ""
"message": "重",
"description": "This string is used as name for the reset button on the settings page."
},
"setting_html_reset_button_title": {
"message": "重所有設定",
"description": ""
"message": "重所有設定",
"description": "This string is used as title for the reset button on the settings page."
},
"setting_rule_url_label": {
"message": "data.json的網址 (規則)",
"description": ""
"message": "data.json的網址 (規則)",
"description": "This string is used as name for the rule url label."
},
"settings_html_save_button": {
"message": "儲存並重啟附元件",
"description": ""
"message": "儲存並重啟附元件",
"description": "This string is used as name for the save&reload button on the settings page."
},
"settings_html_save_button_title": {
"message": "儲存設定",
"description": ""
"description": "This string is used as title for the save&reload button on the settings page."
},
"setting_hash_url_label": {
"message": "rules.hash的網址 (校驗)",
"description": ""
"message": "rules.hash的網址 (校驗)",
"description": "This string is used as name for the rule.hash url label."
},
"setting_types_label": {
"message": "<a href='https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/webRequest/ResourceType' target='_blank'>請求類型</a> (進階設定)",
"description": "This string is used as name for the types label."
},
"setting_report_server_label": {
"message": "回報網址",
"description": "Note: Currently not used."
},
"success_report_url": {
"message": "該網址已成功回報",
"description": "Note: Currently not used."
},
"error_report_url": {
"message": "該網址已被回報過",
"description": "Note: Currently not used."
},
"donate_button": {
"message": "給ClearURLs的作者一點贊助",
"description": "This string is used to refer to a donation page."
},
"clipboard_copy_link": {
"message": "複製清理過的網址",
"description": "This string is used in the context menu to copy clean links."
},
"context_menu_enabled": {
"message": "顯示右鍵選單項目",
"description": "This string is used toggle the context menu entry to copy clean links."
},
"history_listener_enabled": {
"message": "Prevent tracking injection over history API (詳見: <a href='https://developer.mozilla.org/en-US/docs/Web/API/History_API#The_replaceState()_method' target='_blank'>The replaceState() method</a>)",
"description": "This string is used as name for the history API listener label."
},
"cleaning_tool_page_title": {
"message": "ClearURLs的網址清理工具",
"description": "This string is used as title on the cleaning tool page."
},
"cleaning_tool_description": {
"message": "此工具提供手動清理網址的功能. 在下方貼上網址並按下綠色按鈕, ClearURLs將會輸出清理後的網址. 若要同時清理多個網址, 請將每個置於不同行.",
"description": "This string is used as description of the cleaning tool."
},
"cleaning_tool_btn": {
"message": "網址清理工具",
"description": "This string is used as name for the clean url button."
},
"cleaning_tool_dirty_urls_label": {
"message": "清理前的網址:",
"description": "This string is used as title on the cleaning tool page for the dirty URLs."
},
"cleaning_tool_clean_urls_label": {
"message": "清理後的網址:",
"description": "This string is used as title on the cleaning tool page for the clean URLs."
}
}
}

View File

@@ -11,7 +11,7 @@
global.browser = mod.exports;
}
})(this, function (module) {
/* webextension-polyfill - v0.3.1 - Tue Aug 21 2018 10:09:34 */
/* webextension-polyfill - v0.4.0 - Wed Feb 06 2019 11:58:31 */
/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set sts=2 sw=2 et tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
@@ -28,7 +28,7 @@
// contents of a function until the first time it's called, and since it will
// never actually need to be called, this allows the polyfill to be included
// in Firefox nearly for free.
const wrapAPIs = () => {
const wrapAPIs = extensionAPIs => {
// NOTE: apiMetadata is associated to the content of the api-metadata.json file
// at build time by replacing the following "include" with the content of the
// JSON file.
@@ -241,7 +241,8 @@
"inspectedWindow": {
"eval": {
"minArgs": 1,
"maxArgs": 2
"maxArgs": 2,
"singleCallbackArg": false
}
},
"panels": {
@@ -763,9 +764,9 @@
*/
const makeCallback = (promise, metadata) => {
return (...callbackArgs) => {
if (chrome.runtime.lastError) {
promise.reject(chrome.runtime.lastError);
} else if (metadata.singleCallbackArg || callbackArgs.length <= 1) {
if (extensionAPIs.runtime.lastError) {
promise.reject(extensionAPIs.runtime.lastError);
} else if (metadata.singleCallbackArg || callbackArgs.length <= 1 && metadata.singleCallbackArg !== false) {
promise.resolve(callbackArgs[0]);
} else {
promise.resolve(callbackArgs);
@@ -1110,14 +1111,14 @@
});
const wrappedSendMessageCallback = ({ reject, resolve }, reply) => {
if (chrome.runtime.lastError) {
if (extensionAPIs.runtime.lastError) {
// Detect when none of the listeners replied to the sendMessage call and resolve
// the promise to undefined as in Firefox.
// See https://github.com/mozilla/webextension-polyfill/issues/130
if (chrome.runtime.lastError.message === CHROME_SEND_MESSAGE_CALLBACK_NO_RESPONSE_MESSAGE) {
if (extensionAPIs.runtime.lastError.message === CHROME_SEND_MESSAGE_CALLBACK_NO_RESPONSE_MESSAGE) {
resolve();
} else {
reject(chrome.runtime.lastError);
reject(extensionAPIs.runtime.lastError);
}
} else if (reply && reply.__mozWebExtensionPolyfillReject__) {
// Convert back the JSON representation of the error into
@@ -1173,14 +1174,13 @@
}
};
return wrapObject(chrome, staticWrappers, apiMetadata);
return wrapObject(extensionAPIs, staticWrappers, apiMetadata);
};
// The build process adds a UMD wrapper around this file, which makes the
// `module` variable available.
module.exports = wrapAPIs(); // eslint-disable-line no-undef
module.exports = wrapAPIs(chrome);
} else {
module.exports = browser; // eslint-disable-line no-undef
module.exports = browser;
}
});
//# sourceMappingURL=browser-polyfill.js.map

View File

@@ -0,0 +1,87 @@
/*
* ClearURLs
* Copyright (c) 2017-2020 Kevin Röbert
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/*jshint esversion: 6 */
/*
* This script is responsible for minification of the data.min.json file and deletes also empty entries.
*/
let fs = require('fs');
const inFileLocation = process.argv.slice(2)[0];
const outFileLocation = process.argv.slice(2)[1];
if(inFileLocation === undefined || outFileLocation === undefined) {
throw "in- and output must be set!";
}
const fileContent = fs.readFileSync(inFileLocation).toString();
/**
* Builds a minify version of the data.min.json file.
*/
function build() {
const data = JSON.parse(fileContent);
let minifiedData = {"providers":{}};
for(let provider in data.providers) {
minifiedData.providers[provider] = {};
let self = minifiedData.providers[provider];
if(data.providers[provider].completeProvider === true) {
self.completeProvider = true;
}
if(data.providers[provider].forceRedirection === true) {
self.forceRedirection = true;
}
if(data.providers[provider].urlPattern !== "") {
self.urlPattern = data.providers[provider].urlPattern;
}
if(data.providers[provider].rules.length !== 0) {
self.rules = data.providers[provider].rules;
}
if(data.providers[provider].rawRules.length !== 0) {
self.rawRules = data.providers[provider].rawRules;
}
if(data.providers[provider].referralMarketing.length !== 0) {
self.referralMarketing = data.providers[provider].referralMarketing;
}
if(data.providers[provider].exceptions.length !== 0) {
self.exceptions = data.providers[provider].exceptions;
}
if(data.providers[provider].redirections.length !== 0) {
self.redirections = data.providers[provider].redirections;
}
}
fs.writeFile(outFileLocation, JSON.stringify(minifiedData), function(err) {
if(err) {
return console.log(err);
}
console.log("The file was saved!");
});
}
build();

File diff suppressed because it is too large Load Diff

80
core_js/cleaning_tool.js Normal file
View File

@@ -0,0 +1,80 @@
/*
* ClearURLs
* Copyright (c) 2017-2020 Kevin Röbert
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/*jshint esversion: 6 */
var cleanedURLs = [];
var i = 0;
var length = 0;
/**
* Load only when document is ready
*/
$(document).ready(function(){
setText();
$('#cleaning_tool_btn').on("click", cleanURLs);
});
/**
* This function cleans all URLs line by line in the textarea.
*/
function cleanURLs() {
const cleanTArea = $('#cleanURLs');
const dirtyTArea = $('#dirtyURLs');
const urls = dirtyTArea.val().split('\n');
cleanedURLs = [];
length = urls.length;
for(i=0; i < length; i++) {
browser.runtime.sendMessage({
function: "pureCleaning",
params: [urls[i]]
}).then((data) => {
cleanedURLs.push(data.response);
if(i >= length-1) {
cleanTArea.val(cleanedURLs.join('\n'));
}
}, handleError);
}
}
/**
* Translate a string with the i18n API.
*
* @param {string} string Name of the attribute used for localization
*/
function translate(string)
{
return browser.i18n.getMessage(string);
}
/**
* Set the text for the UI.
*/
function setText()
{
document.title = translate('cleaning_tool_page_title');
$('#page_title').text(translate('cleaning_tool_page_title'));
$('#cleaning_tool_description').text(translate('cleaning_tool_description'));
$('#cleaning_tool_btn').text(translate('cleaning_tool_btn'));
$('#cleaning_tool_dirty_urls_label').text(translate('cleaning_tool_dirty_urls_label'));
$('#cleaning_tool_clean_urls_label').text(translate('cleaning_tool_clean_urls_label'));
}
function handleError(error) {
console.log(`Error: ${error}`);
}

57
core_js/context_menu.js Normal file
View File

@@ -0,0 +1,57 @@
/*
* ClearURLs
* Copyright (c) 2017-2020 Kevin Röbert
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/*jshint esversion: 6 */
/*
* This script is responsible for context menu cleaning functions
* and based on: https://github.com/mdn/webextensions-examples/tree/master/context-menu-copy-link-with-types
*/
function contextMenuStart() {
if(storage.contextMenuEnabled) {
browser.contextMenus.create({
id: "copy-link-to-clipboard",
title: translate("clipboard_copy_link"),
contexts: ["link"]
});
browser.contextMenus.onClicked.addListener((info, tab) => {
if (info.menuItemId === "copy-link-to-clipboard") {
const url = pureCleaning(info.linkUrl);
const code = "copyToClipboard(" +
JSON.stringify(url)+");";
browser.tabs.executeScript({
code: "typeof copyToClipboard === 'function';",
}).then((results) => {
if (!results || results[0] !== true) {
return browser.tabs.executeScript(tab.id, {
file: "/external_js/clipboard-helper.js",
});
}
}).then(() => {
return browser.tabs.executeScript(tab.id, {
code,
});
}).catch((error) => {
console.error("Failed to copy text: " + error);
});
}
});
}
}

View File

@@ -0,0 +1,67 @@
/*
* ClearURLs
* Copyright (c) 2017-2020 Kevin Röbert
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* Based on:
* Remove Google Redirection
* https://github.com/kodango/Remove-Google-Redirection/blob/master/extension/chrome/remove-google-redirection.user.js
* Copyright (c) 2017 kodango
* MIT License: https://github.com/kodango/Remove-Google-Redirection/blob/master/LICENSE
*/
(function (window) {
"use strict";
function injectFunction() {
let ele = document.createElement('script');
let s = document.getElementsByTagName('script')[0];
ele.type = 'text/javascript';
ele.textContent = "Object.defineProperty(window, 'rwt', {" +
" value: function() { return false; }," +
" writable: false," +
" configurable: false" +
"});";
s.parentNode.insertBefore(ele, s);
}
/*
* The main entry
*/
function main()
{
injectFunction();
document.addEventListener('mouseover', function (event) {
let a = event.target, depth = 1;
while (a && a.tagName !== 'A' && depth-- > 0) {
a = a.parentNode;
}
if (a && a.tagName === 'A') {
try {
a.removeAttribute('data-cthref');
delete a.dataset.cthref;
} catch(e) {
console.log(e);
}
}
}, true);
}
main();
})(window);

View File

@@ -0,0 +1,55 @@
/*
* ClearURLs
* Copyright (c) 2017-2020 Kevin Röbert
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/*jshint esversion: 6 */
/*
* This script is responsible for listen on history changes.
* This technique is often used to inject tracking code into the location bar,
* because all feature events will use the updated URL.
*/
function historyListenerStart() {
if(storage.historyListenerEnabled) {
browser.webNavigation.onHistoryStateUpdated.addListener(historyCleaner);
}
}
/**
* Function that is triggered on history changes. Injects script into page
* to clean links that were pushed to the history stack with the
* history.replaceState method.
* @param {state object} details The state object is a JavaScript object
* which is associated with the new history entry created by replaceState()
*/
function historyCleaner(details) {
if(storage.globalStatus) {
const urlBefore = details.url;
const urlAfter = pureCleaning(details.url);
if(urlBefore !== urlAfter) {
browser.tabs.executeScript(details.tabId, {
frameId: details.frameId,
code: 'history.replaceState({state: "cleaned_history"},"",'+JSON.stringify(urlAfter)+');'
}).then(() => {}, onError);
}
}
}
function onError(error) {
console.log(`[ClearURLs] Error: ${error}`);
}

View File

@@ -1,21 +1,38 @@
/*
* ClearURLs
* Copyright (c) 2017-2020 Kevin Röbert
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/*jshint esversion: 6 */
/**
* Get the log and display the data as table.
*/
var log = {};
var core = function (func) {
return browser.runtime.getBackgroundPage().then(func);
};
/**
* Reset the global log
*/
function resetGlobalLog(){
core(function (ref){
obj = {"log": []};
ref.setData('log', JSON.stringify(obj));
let obj = {"log": []};
browser.runtime.sendMessage({
function: "setData",
params: ['log', JSON.stringify(obj)]
});
getLog();
location.reload();
}
@@ -24,25 +41,28 @@ function resetGlobalLog(){
*/
function getLog()
{
core(function (ref){
log = ref.getData('log');
browser.runtime.sendMessage({
function: "getData",
params: ['log']
}).then((data) => {
log = data.response;
// Sort the log | issue #70
log.log.sort(function(a,b) {
return b.timestamp - a.timestamp;
});
var length = Object.keys(log.log).length;
var row;
if(length != 0)
const length = Object.keys(log.log).length;
let row;
if(length !== 0)
{
for(var i=0; i<length;i++)
for(let i=0; i<length;i++)
{
row = "<tr>"
+ "<td>"+log.log[i].before+"</td>"
+ "<td>"+log.log[i].after+"</td>"
+ "<td>"+log.log[i].rule+"</td>"
+ "<td>"+toDate(log.log[i].timestamp)+"</td>";
row = "<tr>" +
"<td>"+log.log[i].before+"</td>" +
"<td>"+log.log[i].after+"</td>" +
"<td>"+log.log[i].rule+"</td>" +
"<td>"+toDate(log.log[i].timestamp)+"</td>";
$('#tbody').append(row);
}
}
@@ -60,11 +80,9 @@ function getLog()
*/
function getDataTableTranslation()
{
var lang = browser.i18n.getUILanguage();
let lang = browser.i18n.getUILanguage();
lang = lang.substring(0,2);
var file = browser.extension.getURL('./external_js/dataTables/i18n/'+lang+'.lang');
return file;
return browser.extension.getURL('./external_js/dataTables/i18n/' + lang + '.lang');
}
/**
@@ -75,6 +93,42 @@ function toDate(time)
return new Date(time).toLocaleString();
}
/**
* This function export the global log as json file.
*/
function exportGlobalLog() {
browser.runtime.sendMessage({
function: "getData",
params: ['log']
}).then((data) => {
let blob = new Blob([JSON.stringify(data.response)], {type: 'application/json'});
browser.downloads.download({
'url': URL.createObjectURL(blob),
'filename': 'ClearURLsLogExport.json',
'saveAs': true
});
});
}
/**
* This function imports an exported global log and overwrites the old one.
*/
function importGlobalLog(evt) {
let file = evt.target.files[0];
let fileReader = new FileReader();
fileReader.onload = function(e) {
browser.runtime.sendMessage({
function: "setData",
params: ["log", e.target.result]
}).then(() => {
location.reload();
}, handleError);
};
fileReader.readAsText(file);
}
/**
* Load only when document is ready
*/
@@ -82,6 +136,8 @@ $(document).ready(function(){
setText();
getLog();
$('#reset_log_btn').on("click", resetGlobalLog);
$('#export_log_btn').on("click", exportGlobalLog);
$('#importLog').on("change", importGlobalLog);
});
/**
@@ -101,10 +157,18 @@ function setText()
{
document.title = translate('log_html_page_title');
$('#page_title').text(translate('log_html_page_title'));
$('#reset_log_btn').text(translate('log_html_reset_button'));
$('#log_html_reset_button').prop('title', translate('log_html_reset_button_title'));
$('#reset_log_btn').text(translate('log_html_reset_button'))
.prop('title', translate('log_html_reset_button_title'));
$('#head_1').text(translate('log_html_table_head_1'));
$('#head_2').text(translate('log_html_table_head_2'));
$('#head_3').text(translate('log_html_table_head_3'));
$('#head_4').text(translate('log_html_table_head_4'));
$('#export_log_btn_text').text(translate('log_html_export_button'));
$('#export_log_btn').prop('title', translate('log_html_export_button_title'));
$('#import_log_btn_text').text(translate('log_html_import_button'));
$('#importLog').prop('title', translate('log_html_import_button_title'));
}
function handleError(error) {
console.log(`Error: ${error}`);
}

View File

@@ -0,0 +1,42 @@
/*
* ClearURLs
* Copyright (c) 2017-2020 Kevin Röbert
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/*jshint esversion: 6 */
/*
* This script is responsible for the communication between background and content_scripts.
*/
/**
* [handleMessage description]
* @param request The message itself. This is a JSON-ifiable object.
* @param sender A runtime.MessageSender object representing the sender of the message.
* @param sendResponse A function to call, at most once, to send a response to the message. The function takes a single argument, which may be any JSON-ifiable object. This argument is passed back to the message sender.
*/
function handleMessage(request, sender, sendResponse)
{
let fn = window[request.function];
if(typeof fn === "function")
{
let response = fn.apply(null, request.params);
return Promise.resolve({response});
}
}
browser.runtime.onMessage.addListener(handleMessage);

281
core_js/popup.js Normal file
View File

@@ -0,0 +1,281 @@
/*
* ClearURLs
* Copyright (c) 2017-2020 Kevin Röbert
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/*jshint esversion: 6 */
var element = $("#statistics_value");
var elGlobalPercentage = $("#statistics_value_global_percentage");
var elProgressbar_blocked = $('#progress_blocked');
var elProgressbar_non_blocked = $('#progress_non_blocked');
var elTotal = $('#statistics_total_elements');
var globalPercentage = 0;
var globalCounter;
var globalurlcounter;
var globalStatus;
var badgedStatus;
var hashStatus;
var loggingStatus;
var statisticsStatus;
var currentURL;
/**
* Initialize the UI.
*
*/
function init()
{
setSwitchButton("globalStatus", "globalStatus");
setSwitchButton("tabcounter", "badgedStatus");
setSwitchButton("logging", "loggingStatus");
setSwitchButton("statistics", "statisticsStatus");
setHashStatus();
changeStatistics();
}
/**
* Get the globalCounter and globalurlcounter value from the storage
*/
function changeStatistics()
{
globalPercentage = ((globalCounter/globalurlcounter)*100).toFixed(3);
if(isNaN(Number(globalPercentage))) globalPercentage = 0;
element.text(globalCounter.toLocaleString());
elGlobalPercentage.text(globalPercentage+"%");
elProgressbar_blocked.css('width', globalPercentage+'%');
elProgressbar_non_blocked.css('width', (100-globalPercentage)+'%');
elTotal.text(globalurlcounter.toLocaleString());
}
/**
* Set the value for the hashStatus on startUp.
*/
function setHashStatus()
{
let element = $('#hashStatus');
if(hashStatus)
{
element.text(translate(hashStatus));
}
else {
element.text(translate('hash_status_code_5'));
}
}
/**
* Change the value of a switch button.
* @param {string} id HTML id
* @param {string} storageID storage internal id
*/
function changeSwitchButton(id, storageID)
{
let element = $('#'+id);
changeVisibility(id, storageID);
element.on('change', function(){
browser.runtime.sendMessage({
function: "setData",
params: [storageID, element.is(':checked')]
}).then((data) => {
if(storageID === "globalStatus"){
browser.runtime.sendMessage({
function: "changeIcon",
params: []
});
}
changeVisibility(id, storageID);
browser.runtime.sendMessage({
function: "saveOnExit",
params: []
});
});
});
}
/**
* Change the visibility of sections.
*/
function changeVisibility(id, storageID)
{
let element;
switch(storageID)
{
case "loggingStatus":
element = $('#log_section');
break;
case "statisticsStatus":
element = $('#statistic_section');
break;
default:
element = "undefine";
}
if(element !== "undefine")
{
if($('#'+id).is(':checked'))
{
element.css('display', '');
element.css('display', '');
}
else {
element.css('display', 'none');
element.css('display', 'none');
}
}
}
/**
* Set the value of a switch button.
* @param {string} id HTML id
* @param {string} varname js internal variable name
*/
function setSwitchButton(id, varname)
{
let element = $('#'+id);
element.prop('checked', this[varname]);
}
/**
* Reset the global statistic
*/
function resetGlobalCounter(){
browser.runtime.sendMessage({
function: "setData",
params: ['globalCounter', 0]
});
browser.runtime.sendMessage({
function: "setData",
params: ['globalurlcounter', 0]
});
browser.runtime.sendMessage({
function: "saveOnExit",
params: []
});
globalCounter = 0;
globalurlcounter = 0;
changeStatistics();
}
$(document).ready(function(){
loadData("globalCounter")
.then(() => loadData("globalurlcounter"))
.then(() => loadData("globalStatus"))
.then(() => loadData("badgedStatus"))
.then(() => loadData("hashStatus"))
.then(() => loadData("loggingStatus"))
.then(() => loadData("statisticsStatus"))
.then(() => loadData("getCurrentURL", "currentURL"))
.then(() => {
init();
$('#reset_counter_btn').on("click", resetGlobalCounter);
changeSwitchButton("globalStatus", "globalStatus");
changeSwitchButton("tabcounter", "badgedStatus");
changeSwitchButton("logging", "loggingStatus");
changeSwitchButton("statistics", "statisticsStatus");
$('#loggingPage').attr('href', browser.extension.getURL('./html/log.html'));
$('#settings').attr('href', browser.extension.getURL('./html/settings.html'));
$('#cleaning_tools').attr('href', browser.extension.getURL('./html/cleaningTool.html'));
setText();
});
});
/**
* Set the text for the UI.
*/
function setText()
{
injectText('loggingPage','popup_html_log_head');
injectText('reset_counter_btn','popup_html_statistics_reset_button');
injectText('rules_status_head','popup_html_rules_status_head');
injectText('statistics_percentage','popup_html_statistics_percentage');
injectText('statistics_blocked','popup_html_statistics_blocked');
injectText('statistics_elements','popup_html_statistics_elements');
injectText('statistics_head','popup_html_statistics_head');
injectText('configs_switch_badges','popup_html_configs_switch_badges');
injectText('configs_switch_log','popup_html_configs_switch_log');
injectText('configs_switch_filter','popup_html_configs_switch_filter');
injectText('configs_head','popup_html_configs_head');
injectText('configs_switch_statistics','configs_switch_statistics');
$('#donate').prop('title', translate('donate_button'));
}
/**
* Helper function to inject the translated text and tooltip.
*
* @param {string} id ID of the HTML element
* @param {string} attribute Name of the attribute used for localization
* @param {string} tooltip
*/
function injectText(id, attribute, tooltip = "")
{
let object = $('#'+id);
object.text(translate(attribute));
/*
This function will throw an error if no translation
is found for the tooltip. This is a planned error.
*/
tooltip = translate(attribute+"_title");
if(tooltip !== "")
{
object.prop('title', tooltip);
}
}
/**
* Loads data from storage and saves into local variable.
*
* @param name data name
* @param varName variable name
* @returns {Promise<data>} requested data
*/
async function loadData(name, varName=name) {
return new Promise((resolve, reject) => {
browser.runtime.sendMessage({
function: "getData",
params: [name]
}).then(data => {
this[varName] = data.response;
resolve(data);
}, handleError);
});
}
/**
* Translate a string with the i18n API.
*
* @param {string} string Name of the attribute used for localization
*/
function translate(string)
{
return browser.i18n.getMessage(string);
}
function handleError(error) {
console.log(`Error: ${error}`);
}

View File

@@ -1,266 +0,0 @@
var element = $("#statistics_value");
var elGlobalPercentage = $("#statistics_value_global_percentage");
var elProgressbar_blocked = $('#progress_blocked');
var elProgressbar_non_blocked = $('#progress_non_blocked');
var elTotal = $('#statistics_total_elements');
var globalPercentage = 0;
var globalCounter;
var globalurlcounter;
var globalStatus;
var badgedStatus;
var hashStatus;
var loggingStatus;
var statisticsStatus;
var currentURL;
var reportServer;
var core = function (func) {
return browser.runtime.getBackgroundPage().then(func);
};
function getData()
{
core(function (ref){
globalCounter = ref.getData('globalCounter');
globalurlcounter = ref.getData('globalurlcounter');
globalStatus = ref.getData('globalStatus');
badgedStatus = ref.getData('badgedStatus');
hashStatus = ref.getData('hashStatus');
loggingStatus = ref.getData('loggingStatus');
statisticsStatus = ref.getData('statisticsStatus');
currentURL = ref.getCurrentURL();
reportServer = ref.getData('reportServer');
});
}
/**
* Initialize the UI.
*
*/
function init()
{
setSwitchButton("globalStatus", "globalStatus");
setSwitchButton("tabcounter", "badgedStatus");
setSwitchButton("logging", "loggingStatus");
setSwitchButton("statistics", "statisticsStatus");
setHashStatus();
changeStatistics();
}
/**
* Get the globalCounter value from the browser storage
* @param {(data){} Return value form browser.storage.local.get
*/
function changeStatistics()
{
globalPercentage = ((globalCounter/globalurlcounter)*100).toFixed(3);
if(isNaN(Number(globalPercentage))) globalPercentage = 0;
element.text(globalCounter.toLocaleString());
elGlobalPercentage.text(globalPercentage+"%");
elProgressbar_blocked.css('width', globalPercentage+'%');
elProgressbar_non_blocked.css('width', (100-globalPercentage)+'%');
elTotal.text(globalurlcounter.toLocaleString());
}
/**
* Set the value for the hashStatus on startUp.
*/
function setHashStatus()
{
var element = $('#hashStatus');
if(hashStatus)
{
element.text(translate(hashStatus));
}
else {
element.text(translate('hash_status_code_5'));
}
}
/**
* Change the value of a switch button.
* @param {string} id HTML id
* @param {string} storageID storage internal id
*/
function changeSwitchButton(id, storageID)
{
var element = $('#'+id);
changeVisibility(id, storageID);
element.on('change', function(){
core(function (ref){
ref.setData(storageID, element.is(':checked'));
if(storageID == "globalStatus") ref.changeIcon();
changeVisibility(id, storageID);
ref.saveOnExit();
});
});
}
/**
* Change the visibility of sections.
*/
function changeVisibility(id, storageID)
{
var element;
switch(storageID)
{
case "loggingStatus":
element = $('#log_section');
break;
case "statisticsStatus":
element = $('#statistic_section');
break;
default:
element = "undefine";
}
if(element != "undefine")
{
if($('#'+id).is(':checked'))
{
element.css('display', '');
element.css('display', '');
}
else {
element.css('display', 'none');
element.css('display', 'none');
}
}
}
/**
* Set the value of a switch button.
* @param {string} id HTML id
* @param {string} varname js internal variable name
*/
function setSwitchButton(id, varname)
{
var element = $('#'+id);
element.prop('checked', this[varname]);
}
/**
* Reset the global statistic
*/
function resetGlobalCounter(){
core(function (ref){
globalurlcounter = 0;
globalCounter = 0;
ref.setData('globalCounter', 0);
ref.setData('globalurlcounter', 0);
ref.saveOnExit();
changeStatistics();
});
}
if(!browser.extension.inIncognitoContext)
{
getData();
}
$(document).ready(function(){
if(!browser.extension.inIncognitoContext)
{
init();
$('#reset_counter_btn').on("click", resetGlobalCounter);
changeSwitchButton("globalStatus", "globalStatus");
changeSwitchButton("tabcounter", "badgedStatus");
changeSwitchButton("logging", "loggingStatus");
changeSwitchButton("statistics", "statisticsStatus");
$('#loggingPage').attr('href', browser.extension.getURL('./html/log.html'));
$('#settings').attr('href', browser.extension.getURL('./html/settings.html'));
$('#reportButton').on("click", reportURL);
setText();
} else {
$('#config_section').remove();
$('#statistic_section').remove();
$('#status_section').remove();
$('#log_section').remove();
$('#incognito').css('display', '');
}
});
/**
* Set the text for the UI.
*/
function setText()
{
injectText('loggingPage','popup_html_log_head');
injectText('reset_counter_btn','popup_html_statistics_reset_button');
injectText('rules_status_head','popup_html_rules_status_head');
injectText('statistics_percentage','popup_html_statistics_percentage');
injectText('statistics_blocked','popup_html_statistics_blocked');
injectText('statistics_elements','popup_html_statistics_elements');
injectText('statistics_head','popup_html_statistics_head');
injectText('configs_switch_badges','popup_html_configs_switch_badges');
injectText('configs_switch_log','popup_html_configs_switch_log');
injectText('configs_switch_filter','popup_html_configs_switch_filter');
injectText('configs_head','popup_html_configs_head');
injectText('configs_switch_statistics','configs_switch_statistics');
injectText('reportButton', 'popup_html_report_button', true);
$('#donate').prop('title', translate('donate_button'));
}
/**
* Helper function to inject the translated text and tooltip.
*
* @param {string} id ID of the HTML element
* @param {string} attribute Name of the attribute used for localization
* @param {boolean} tooltip
*/
function injectText(id, attribute, tooltip)
{
object = $('#'+id);
object.text(translate(attribute));
/*
This function will throw an error if no translation
is found for the tooltip. This is a planned error.
*/
tooltip = translate(attribute+"_title");
if(tooltip != "")
{
object.prop('title', tooltip);
}
}
/**
* Translate a string with the i18n API.
*
* @param {string} string Name of the attribute used for localization
*/
function translate(string)
{
return browser.i18n.getMessage(string);
}
/**
* Send the url to the DB on clearurls.röb.it to checked for tracking fields.
*/
function reportURL()
{
$.ajax({
url: reportServer+'/report_url.php?url='+encodeURI(currentURL),
success: function(result) {
BootstrapDialog.show({
message: translate('success_report_url')
});
},
error: function(result) {
BootstrapDialog.show({
message: translate('error_report_url')
});
}
});
}

58
core_js/pureCleaning.js Normal file
View File

@@ -0,0 +1,58 @@
/*
* ClearURLs
* Copyright (c) 2017-2020 Kevin Röbert
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/*jshint esversion: 6 */
/**
* Cleans given links. Also do automatic redirection.
*
* @param {String} url url as string
* @param {boolean} quiet if the action should be displayed in log and statistics
* @return {String} redirectUrl or none
*/
function pureCleaning(url, quiet = false) {
let cleanURL = url;
const URLbeforeReplaceCount = countFields(url);
if(!quiet) {
//Add Fields form Request to global url counter
increaseGlobalURLCounter(URLbeforeReplaceCount);
}
for (let i = 0; i < providers.length; i++) {
let result = {
"changes": false,
"url": "",
"redirect": false,
"cancel": false
};
if(providers[i].matchURL(cleanURL))
{
result = removeFieldsFormURL(providers[i], cleanURL, quiet);
cleanURL = result.url;
}
if(result.redirect)
{
return result.url;
}
}
return cleanURL;
}

View File

@@ -1,8 +1,22 @@
var settings = [];
/*
* ClearURLs
* Copyright (c) 2017-2020 Kevin Röbert
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
var core = function (func) {
return browser.runtime.getBackgroundPage().then(func);
};
var settings = [];
getData();
@@ -11,95 +25,286 @@ getData();
*/
$(document).ready(function(){
setText();
$(".pick-a-color").pickAColor();
$('#reset_settings_btn').on("click", reset);
$('#save_settings_btn').on("click", save);
$("#badged_color input").on("change", function () {
settings.badged_color = $(this).val();
core(function (ref){
ref.setData('badged_color', settings.badged_color);
ref.setBadgedStatus();
ref.saveOnExit();
});
$("#badged-color-picker").colorpicker({
format: "hex"
});
$('#reset_settings_btn').on("click", reset);
$('#export_settings_btn').on("click", exportSettings);
$('#importSettings').on("change", importSettings);
$('#save_settings_btn').on("click", save);
});
/**
* Reset everything.
* Set everthing to the default values.
*/
* Reset everything.
* Set everthing to the default values.
*/
function reset()
{
core(function (ref){
ref.initSettings();
ref.saveOnExit();
ref.reload();
});
browser.runtime.sendMessage({
function: "initSettings",
params: []
}).then(handleResponse, handleError);
browser.runtime.sendMessage({
function: "saveOnExit",
params: []
}).then(handleResponse, handleError);
browser.runtime.sendMessage({
function: "reload",
params: []
}).then(handleResponse, handleError);
}
/**
* Saves the settings.
*/
* Saves the settings.
*/
function save()
{
core(function (ref){
ref.setData('badged_color', $('input[name=badged_color]').val());
ref.setBadgedStatus();
ref.setData('ruleURL', $('input[name=rule_url]').val());
ref.setData('hashURL', $('input[name=hash_url]').val());
ref.setData('types', $('input[name=types]').val());
ref.setData('reportServer', $('input[name=report_server]').val());
ref.saveOnExit();
ref.reload();
});
location.reload();
saveData("badged_color", $('input[name=badged_color]').val())
.then(() => saveData("ruleURL", $('input[name=ruleURL]').val()))
.then(() => saveData("hashURL", $('input[name=hashURL]').val()))
.then(() => saveData("types", $('input[name=types]').val()))
.then(() => saveData("logLimit", $('input[name=logLimit]').val()))
.then(() => browser.runtime.sendMessage({
function: "setBadgedStatus",
params: []
}), handleError)
.then(() => browser.runtime.sendMessage({
function: "saveOnExit",
params: []
}), handleError)
.then(() => browser.runtime.sendMessage({
function: "reload",
params: []
}), handleError);
}
/**
* Translate a string with the i18n API.
*
* @param {string} string Name of the attribute used for localization
* Translate a string with the i18n API.
*
* @param {string} string Name of the attribute used for localization
* @param {string[]} placeholders Array of placeholders
*/
function translate(string)
function translate(string, ...placeholders)
{
return browser.i18n.getMessage(string);
return browser.i18n.getMessage(string, placeholders);
}
/**
* Get the data.
*/
* Get the data.
*/
function getData()
{
core(function (ref){
settings.badged_color = ref.getData('badged_color');
settings.rule_url = ref.getData('ruleURL');
settings.hash_url = ref.getData('hashURL');
settings.types = ref.getData('types');
settings.reportServer = ref.getData('reportServer');
loadData("badged_color")
.then(() => loadData("ruleURL"))
.then(() => loadData("hashURL"))
.then(() => loadData("types"))
.then(() => loadData("logLimit"))
.then(logData => {
if(logData.response === undefined || logData.response === -1) {
$('#logLimit_label').text(translate('setting_log_limit_label', "∞"));
} else {
$('#logLimit_label').text(translate('setting_log_limit_label', logData.response));
}
});
loadData("contextMenuEnabled")
.then(() => loadData("historyListenerEnabled"))
.then(() => loadData("localHostsSkipping"))
.then(() => loadData("referralMarketing"))
.then(() => loadData("domainBlocking"))
.then(() => loadData("pingBlocking"))
.then(() => {
changeSwitchButton("localHostsSkipping", "localHostsSkipping");
changeSwitchButton("historyListenerEnabled", "historyListenerEnabled");
changeSwitchButton("contextMenuEnabled", "contextMenuEnabled");
changeSwitchButton("referralMarketing", "referralMarketing");
changeSwitchButton("domainBlocking", "domainBlocking");
changeSwitchButton("pingBlocking", "pingBlocking");
});
}
/**
* Loads data from storage and saves into local variable.
*
* @param name data/variable name
* @returns {Promise<data>} requested data
*/
async function loadData(name) {
return new Promise((resolve, reject) => {
browser.runtime.sendMessage({
function: "getData",
params: [name]
}).then(data => {
settings[name] = data.response;
$('input[name='+name+']').val(data.response);
resolve(data);
}, handleError);
});
}
/**
* Set the text for the UI.
* Saves data to storage.
*
* @param key key of the data that should be saved
* @param data data that should be saved
* @returns {Promise<message>} message from background script
*/
async function saveData(key, data) {
return new Promise((resolve, reject) => {
browser.runtime.sendMessage({
function: "setData",
params: [key, data]
}).then(message => {
handleResponse(message);
resolve(message);
}, handleError);
});
}
/**
* Set the text for the UI.
*/
function setText()
{
document.title = translate('settings_html_page_title');
$('#page_title').text(translate('settings_html_page_title'));
$('#badged_color_label').text(translate('badged_color_label'));
$('input[name=badged_color]').val(settings.badged_color);
$('#reset_settings_btn').text(translate('setting_html_reset_button'));
$('#reset_settings_btn').prop('title', translate('setting_html_reset_button_title'));
$('#reset_settings_btn').text(translate('setting_html_reset_button'))
.prop('title', translate('setting_html_reset_button_title'));
$('#rule_url_label').text(translate('setting_rule_url_label'));
$('input[name=rule_url]').val(settings.rule_url);
$('#hash_url_label').text(translate('setting_hash_url_label'));
$('input[name=hash_url]').val(settings.hash_url);
$('#types_label').html(translate('setting_types_label'));
$('input[name=types]').val(settings.types);
$('#save_settings_btn').text(translate('settings_html_save_button'));
$('#save_settings_btn').prop('title', translate('settings_html_save_button_title'));
$('#report_server_label').html(translate('setting_report_server_label'));
$('input[name=report_server]').val(settings.reportServer);
$('#save_settings_btn').text(translate('settings_html_save_button'))
.prop('title', translate('settings_html_save_button_title'));
injectText("context_menu_enabled", "context_menu_enabled");
$('#history_listener_enabled').html(translate('history_listener_enabled'));
injectText("local_hosts_skipping", "local_hosts_skipping");
$('#export_settings_btn_text').text(translate('setting_html_export_button'));
$('#export_settings_btn').prop('title', translate('setting_html_export_button_title'));
$('#import_settings_btn_text').text(translate('setting_html_import_button'));
$('#importSettings').prop('title', translate('setting_html_import_button_title'));
injectText("referral_marketing_enabled", "referral_marketing_enabled");
injectText("domain_blocking_enabled", "domain_blocking_enabled");
$('#ping_blocking_enabled').html(translate('ping_blocking_enabled'))
.prop('title', translate('ping_blocking_enabled_title'));
}
/**
* This function exports all ClearURLs settings with statistics and rules.
*/
function exportSettings() {
browser.runtime.sendMessage({
function: "storageAsJSON",
params: []
}).then((data) => {
let blob = new Blob([JSON.stringify(data.response)], {type: 'application/json'});
browser.downloads.download({
'url': URL.createObjectURL(blob),
'filename': 'ClearURLs.conf',
'saveAs': true
});
});
}
/**
* This function imports an exported ClearURLs setting and overwrites the old one.
*/
function importSettings(evt) {
let file = evt.target.files[0];
let fileReader = new FileReader();
fileReader.onload = function(e) {
let data = JSON.parse(e.target.result);
const length = Object.keys(data).length;
let i=0;
Object.entries(data).forEach(([key, value]) => {
browser.runtime.sendMessage({
function: "setData",
params: [key, value]
}).then(() => {
i++;
if(i === length) {
location.reload();
}
}, handleError);
});
};
fileReader.readAsText(file);
}
function handleResponse(message) {
console.log(`Message from the background script: ${message.response}`);
}
function handleError(error) {
console.log(`Error: ${error}`);
}
/**
* Change the value of a switch button.
* @param {string} id HTML id
* @param {string} storageID storage internal id
*/
function changeSwitchButton(id, storageID)
{
let element = $('#'+id);
element.on('change', function(){
browser.runtime.sendMessage({
function: "setData",
params: [storageID, element.is(':checked')]
}).then((data) => {
if(storageID === "globalStatus"){
browser.runtime.sendMessage({
function: "changeIcon",
params: []
});
}
browser.runtime.sendMessage({
function: "saveOnExit",
params: []
});
});
});
setSwitchButton(id, storageID);
}
/**
* Helper function to inject the translated text and tooltip.
*
* @param {string} id ID of the HTML element
* @param {string} attribute Name of the attribute used for localization
* @param {boolean} tooltip
*/
function injectText(id, attribute, tooltip = "")
{
let object = $('#'+id);
object.text(translate(attribute));
/*
This function will throw an error if no translation
is found for the tooltip. This is a planned error.
*/
tooltip = translate(attribute+"_title");
if(tooltip !== "")
{
object.prop('title', tooltip);
}
}
/**
* Set the value of a switch button.
* @param {string} id HTML id
* @param {string} varname js internal variable name
*/
function setSwitchButton(id, varname)
{
let element = $('#'+id);
element.prop('checked', settings[varname]);
}

View File

@@ -0,0 +1,51 @@
/*
* ClearURLs
* Copyright (c) 2017-2020 Kevin Röbert
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/*jshint esversion: 6 */
/*
* This script is responsible for the blocked alert page.
*/
/**
* Set the text for the UI.
*/
function setText()
{
document.title = translate('blocked_html_title');
$('#title').html(translate('blocked_html_title'));
$('#body').html(translate('blocked_html_body'));
$('#page').text(translate('blocked_html_button'));
}
$(document).ready(function(){
setText();
let source = new URLSearchParams(window.location.search).get("source");
$('#page').attr('href', decodeURIComponent(source));
});
/**
* Translate a string with the i18n API.
*
* @param {string} string Name of the attribute used for localization
*/
function translate(string)
{
return browser.i18n.getMessage(string);
}

287
core_js/storage.js Normal file
View File

@@ -0,0 +1,287 @@
/*
* ClearURLs
* Copyright (c) 2017-2020 Kevin Röbert
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/*jshint esversion: 6 */
/*
* This script is responsible for the storage.
*/
var storage = [];
var hasPendingSaves = false;
var pendingSaves = new Set();
/**
* Writes the storage variable to the disk.
*/
function saveOnExit() {
saveOnDisk(Object.keys(storage));
}
/**
* Returns the storage as JSON.
*/
function storageAsJSON() {
let json = {};
Object.entries(storage).forEach(([key, value]) => {
json[key] = storageDataAsString(key);
});
return json;
}
/**
* Converts a given storage data to its string representation.
* @param key key of the storage data
* @returns {string} string representation
*/
function storageDataAsString(key) {
let value = storage[key];
switch (key) {
case "ClearURLsData":
case "log":
return JSON.stringify(value);
case "types":
return value.toString();
default:
return value;
}
}
/**
* Save multiple keys on the disk.
* @param {String[]} keys
*/
function saveOnDisk(keys) {
let json = {};
keys.forEach(function (key) {
json[key] = storageDataAsString(key);
});
console.log(translate('core_save_on_disk'));
browser.storage.local.set(json);
}
/**
* Schedule to save a key to disk in 30 seconds.
* @param {String} key
*/
function deferSaveOnDisk(key) {
if (hasPendingSaves) {
pendingSaves.add(key);
return;
}
setTimeout(function () {
saveOnDisk(Array.from(pendingSaves));
pendingSaves.clear();
hasPendingSaves = false;
}, 30000);
hasPendingSaves = true;
}
/**
* Start sequence for ClearURLs.
*/
function genesis() {
browser.storage.local.get(null).then((items) => {
initStorage(items);
// Start the clearurls.js
start();
//Set correct icon on startup
changeIcon();
// Start the context_menu
contextMenuStart();
// Start history listener
historyListenerStart();
}, error);
}
/**
* Return the value under the key.
* @param {String} key
* @return {Object}
*/
function getData(key) {
return storage[key];
}
/**
* Return the entire storage object.
* @return {Object}
*/
function getEntireData() {
return storage;
}
/**
* Save the value under the key on the RAM.
*
* Note: To store the data on the hard disk, one of
* deferSaveOnDisk(), saveOnDisk(), or saveOnExit()
* must be called.
* @param {String} key
* @param {Object} value
*/
function setData(key, value) {
switch (key) {
case "ClearURLsData":
case "log":
storage[key] = JSON.parse(value);
break;
case "hashURL":
case "ruleURL":
storage[key] = replaceOldURLs(value);
break;
case "types":
storage[key] = value.split(',');
break;
case "logLimit":
storage[key] = Number(value);
break;
default:
storage[key] = value;
}
}
/**
* Write error on console.
*/
function error(e) {
console.log(translate('core_error'));
console.error(e);
}
/**
* Set default values, if the storage is empty.
* @param {Object} items
*/
function initStorage(items) {
initSettings();
if (!isEmpty(items)) {
Object.entries(items).forEach(([key, value]) => {
setData(key, value);
});
}
}
/**
* Set default values for the settings.
*/
function initSettings() {
storage.ClearURLsData = [];
storage.dataHash = "";
storage.badgedStatus = true;
storage.globalStatus = true;
storage.globalurlcounter = 0;
storage.globalCounter = 0;
storage.hashStatus = "error";
storage.loggingStatus = false;
storage.log = {"log": []};
storage.statisticsStatus = true;
storage.badged_color = "#ffa500";
storage.hashURL = "https://kevinroebert.gitlab.io/ClearUrls/data/rules.minify.hash";
storage.ruleURL = "https://kevinroebert.gitlab.io/ClearUrls/data/data.minify.json";
storage.contextMenuEnabled = true;
storage.historyListenerEnabled = true;
storage.localHostsSkipping = true;
storage.referralMarketing = false;
storage.logLimit = -1;
storage.domainBlocking = true;
storage.pingBlocking = true;
if (getBrowser() === "Firefox") {
storage.types = ["font", "image", "imageset", "main_frame", "media", "object", "object_subrequest", "other", "script", "stylesheet", "sub_frame", "websocket", "xbl", "xml_dtd", "xmlhttprequest", "xslt"];
storage.pingRequestTypes = ["ping", "beacon"];
} else if (getBrowser() === "Chrome") {
storage.types = ["main_frame", "sub_frame", "stylesheet", "script", "image", "font", "object", "xmlhttprequest", "ping", "csp_report", "media", "websocket", "other"];
storage.pingRequestTypes = ["ping"];
}
}
/**
* Replace the old URLs with the
* new GitLab URLs.
*/
function replaceOldURLs(url) {
switch (url) {
case "https://raw.githubusercontent.com/KevinRoebert/ClearUrls/master/data/rules.hash?flush_cache=true":
return "https://kevinroebert.gitlab.io/ClearUrls/data/rules.minify.hash";
case "https://raw.githubusercontent.com/KevinRoebert/ClearUrls/master/data/data.json?flush_cache=true":
return "https://kevinroebert.gitlab.io/ClearUrls/data/data.minify.json";
case "https://gitlab.com/KevinRoebert/ClearUrls/raw/master/data/rules.hash":
return "https://kevinroebert.gitlab.io/ClearUrls/data/rules.minify.hash";
case "https://gitlab.com/KevinRoebert/ClearUrls/raw/master/data/data.json":
return "https://kevinroebert.gitlab.io/ClearUrls/data/data.minify.json";
case "https://gitlab.com/KevinRoebert/ClearUrls/-/jobs/artifacts/master/raw/rules.min.hash?job=hash%20rules":
return "https://kevinroebert.gitlab.io/ClearUrls/data/rules.minify.hash";
case "https://gitlab.com/KevinRoebert/ClearUrls/raw/master/data/data.min.json":
return "https://kevinroebert.gitlab.io/ClearUrls/data/data.minify.json";
case "https://gitlab.com/KevinRoebert/ClearUrls/raw/master/data/data.minify.json":
return "https://kevinroebert.gitlab.io/ClearUrls/data/data.minify.json";
case "https://gitlab.com/KevinRoebert/ClearUrls/-/jobs/artifacts/master/raw/data.minify.json?job=hash%20rules":
return "https://kevinroebert.gitlab.io/ClearUrls/data/data.minify.json";
case "https://gitlab.com/KevinRoebert/ClearUrls/-/jobs/artifacts/master/raw/rules.minify.hash?job=hash%20rules":
return "https://kevinroebert.gitlab.io/ClearUrls/data/rules.minify.hash";
default:
return url;
}
}
/**
* Load local saved data, if the browser is offline or
* some other network trouble.
*/
function loadOldDataFromStore() {
localDataHash = storage.dataHash;
}
/**
* Save the hash status to the local storage (RAM).
* The status can have the following values:
* 1 "up to date"
* 2 "updated"
* 3 "update available"
* @param status_code the number for the status
*/
function storeHashStatus(status_code) {
switch (status_code) {
case 1:
status_code = "hash_status_code_1";
break;
case 2:
status_code = "hash_status_code_2";
break;
case 3:
status_code = "hash_status_code_3";
break;
default:
status_code = "hash_status_code_4";
}
storage.hashStatus = status_code;
}
// Start storage and ClearURLs
genesis();

304
core_js/tools.js Normal file
View File

@@ -0,0 +1,304 @@
/*
* ClearURLs
* Copyright (c) 2017-2020 Kevin Röbert
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/*jshint esversion: 6 */
/*
* This script is responsible for some tools.
*/
/*
* To support Waterfox.
*/
Array.prototype.rmEmpty = function () {
return this.filter(v => v);
};
/*
* To support Waterfox.
*/
Array.prototype.flatten = function () {
return this.reduce((a, b) => a.concat(b), []);
};
/**
* Check if an object is empty.
* @param {Object} obj
* @return {Boolean}
*/
function isEmpty(obj) {
return (Object.getOwnPropertyNames(obj).length === 0);
}
/**
* Translate a string with the i18n API.
*
* @param {string} string Name of the attribute used for localization
*/
function translate(string) {
return browser.i18n.getMessage(string);
}
/**
* Reloads the extension.
*/
function reload() {
browser.runtime.reload();
}
/**
* Check if it is an android device.
* @return bool
*/
async function checkOSAndroid() {
if (os === undefined || os === null || os === "") {
await chrome.runtime.getPlatformInfo(function (info) {
os = info.os;
});
}
return os === "android";
}
/**
* Extract the host without port from an url.
* @param {String} url URL as String
* @return {String} host as string
*/
function extractHost(url) {
let parsed_url = new URL(url);
return parsed_url.hostname;
}
/**
* Returns true if the url has a local host.
* @param {String} url URL as String
* @return {boolean}
*/
function checkLocalURL(url) {
let host = extractHost(url);
return ipRangeCheck(host, ["10.0.0.0/8", "172.16.0.0/12",
"192.168.0.0/16", "100.64.0.0/10",
"169.254.0.0/16", "127.0.0.1"]) ||
host === 'localhost';
}
/**
* Return the number of parameters query strings.
* @param {String} url URL as String
* @return {int} Number of Parameters
*/
function countFields(url) {
return extractFileds(url).length;
}
/**
* Returns true if fields exists.
* @param {String} url URL as String
* @return {boolean}
*/
function existsFields(url) {
let matches = (url.match(/\?.+/i) || []);
let count = matches.length;
return (count > 0);
}
/**
* Extract the fields from an url.
* @param {String} url URL as String
* @return {Array} Fields as array
*/
function extractFileds(url) {
if (existsFields(url)) {
let fields = url.replace(new RegExp(".*?\\?", "i"), "");
if (existsFragments(url)) {
fields = fields.replace(new RegExp("#.*", "i"), "");
}
return (fields.match(/[^\/|\?|&]+=?[^&]*/gi) || []);
}
return [];
}
/**
* Return the number of fragments query strings.
* @param {String} url URL as String
* @return {int} Number of fragments
*/
function countFragments(url) {
return extractFragments(url).length;
}
/**
* Extract the fragments from an url.
* @param {String} url URL as String
* @return {Array} fragments as array
*/
function extractFragments(url) {
if (existsFragments(url)) {
let fragments = url.replace(new RegExp(".*?#", "i"), "");
return (fragments.match(/[^&]+=?[^&]*/gi) || []);
}
return [];
}
/**
* Returns true if fragments exists.
* @param {String} url URL as String
* @return {boolean}
*/
function existsFragments(url) {
let matches = (url.match(/\#.+/i) || []);
let count = matches.length;
return (count > 0);
}
/**
* Load local saved data, if the browser is offline or
* some other network trouble.
*/
function loadOldDataFromStore() {
localDataHash = storage.dataHash;
}
/**
* Save the hash status to the local storage (RAM).
* The status can have the following values:
* 1 "up to date"
* 2 "updated"
* 3 "update available"
* @param status_code the number for the status
*/
function storeHashStatus(status_code) {
switch (status_code) {
case 1:
status_code = "hash_status_code_1";
break;
case 2:
status_code = "hash_status_code_2";
break;
case 3:
status_code = "hash_status_code_3";
break;
default:
status_code = "hash_status_code_4";
}
storage.hashStatus = status_code;
}
/**
* Increase by {number} the GlobalURLCounter
* @param {int} number
*/
function increaseGlobalURLCounter(number) {
if (storage.statisticsStatus) {
storage.globalurlcounter += number;
deferSaveOnDisk('globalurlcounter');
}
}
/**
* Increase by one the URLCounter
*/
function increaseURLCounter() {
if (storage.statisticsStatus) {
storage.globalCounter++;
deferSaveOnDisk('globalCounter');
}
}
/**
* Change the icon.
*/
function changeIcon() {
checkOSAndroid().then((res) => {
if (!res) {
if (storage.globalStatus) {
browser.browserAction.setIcon({path: "img/clearurls_128x128.png"});
} else {
browser.browserAction.setIcon({path: "img/clearurls_gray_128x128.png"});
}
}
});
}
/**
* Get the badged status from the browser storage and put the value
* into a local variable.
*
*/
function setBadgedStatus() {
checkOSAndroid().then((res) => {
if (!res && storage.badgedStatus) {
let color = storage.badged_color;
if(storage.badged_color.charAt(0) !== '#')
color = '#' + storage.badged_color;
browser.browserAction.setBadgeBackgroundColor({
'color': color
});
}
});
}
/**
* Returns the current URL.
* @return {String} [description]
*/
function getCurrentURL() {
return currentURL;
}
/**
* Check for browser.
*/
function getBrowser() {
if (typeof InstallTrigger !== 'undefined') {
return "Firefox";
} else {
return "Chrome";
}
}
/**
* Decodes an URL, also one that is encoded multiple times.
* @param url the url, that should be decoded
*/
function decodeURL(url) {
const rtn = decodeURIComponent(url);
if (rtn.indexOf("http://") === -1 && rtn.indexOf("https://") === -1) {
return decodeURL(rtn);
}
return rtn;
}
/**
* Gets the value of at `key` an object. If the resolved value is `undefined`, the `defaultValue` is returned in its place.
*
* @param {string} key the key of the object
* @param {object} defaultValue the default value
*/
Object.prototype.getOrDefault = function (key, defaultValue) {
return this[key] === undefined ? defaultValue : this[key];
};

38
core_js/watchdog.js Normal file
View File

@@ -0,0 +1,38 @@
/*
* ClearURLs
* Copyright (c) 2017-2020 Kevin Röbert
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/*jshint esversion: 6 */
/*
* This script is responsible to check in fixed intervals, that ClearURLs works properly.
* In issue #203, some users reported, that ClearURLs filter function doesn't work after
* some time, but without any recognizable reason.
*
* This watchdog restarts the whole Add-on, when the check fails.
*/
const CHECK_INTERVAL = 15000;
setInterval(function() {
const dirtyURL = "https://clearurls.roebert.eu?utm_source=addon";
const cleanURL = "https://clearurls.roebert.eu";
if(pureCleaning(dirtyURL, true) !== cleanURL) {
console.log(translate('watchdog'));
saveOnExit();
reload();
}
}, CHECK_INTERVAL);

View File

@@ -1,6 +1,24 @@
/*
* ClearURLs
* Copyright (c) 2017-2020 Kevin Röbert
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* This file writes only the version into every page.
* @return version
*/
var version = browser.runtime.getManifest().version;
const version = browser.runtime.getManifest().version;
$('#version').text(version);

View File

@@ -0,0 +1,66 @@
/*
* ClearURLs
* Copyright (c) 2017-2020 Kevin Röbert
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* Based on:
* Remove Google Redirection
* https://github.com/kodango/Remove-Google-Redirection/blob/master/extension/chrome/remove-google-redirection.user.js
* Copyright (c) 2017 kodango
* MIT License: https://github.com/kodango/Remove-Google-Redirection/blob/master/LICENSE
*/
(function (window) {
"use strict";
function injectFunction() {
let ele = document.createElement('script');
let s = document.getElementsByTagName('script')[0];
ele.type = 'text/javascript';
ele.textContent = "Object.defineProperty(window, '_borschik', {" +
" value: function() { return false; }," +
" writable: false," +
" configurable: false" +
"});";
s.parentNode.insertBefore(ele, s);
}
/*
* The main entry
*/
function main() {
injectFunction();
document.addEventListener('mouseover', function (event) {
let a = event.target, depth = 1;
while (a && a.tagName !== 'A' && depth-- > 0) {
a = a.parentNode;
}
if (a && a.tagName === 'A') {
try {
a.removeAttribute('data-counter');
delete a.dataset.cthref;
} catch (e) {
console.log(e);
}
}
}, true);
}
main();
})(window);

10
css/bootstrap-colorpicker.min.css vendored Normal file

File diff suppressed because one or more lines are too long

View File

@@ -1 +0,0 @@
.bootstrap-dialog .modal-header{border-top-left-radius:4px;border-top-right-radius:4px}.bootstrap-dialog .bootstrap-dialog-title{color:#fff;display:inline-block;font-size:16px}.bootstrap-dialog .bootstrap-dialog-message{font-size:14px}.bootstrap-dialog .bootstrap-dialog-button-icon{margin-right:3px}.bootstrap-dialog .bootstrap-dialog-close-button{font-size:20px;float:right;opacity:.9;filter:alpha(opacity=90)}.bootstrap-dialog .bootstrap-dialog-close-button:hover{cursor:pointer;opacity:1;filter:alpha(opacity=100)}.bootstrap-dialog.type-default .modal-header{background-color:#fff}.bootstrap-dialog.type-default .bootstrap-dialog-title{color:#333}.bootstrap-dialog.type-info .modal-header{background-color:#5bc0de}.bootstrap-dialog.type-primary .modal-header{background-color:#337ab7}.bootstrap-dialog.type-success .modal-header{background-color:#5cb85c}.bootstrap-dialog.type-warning .modal-header{background-color:#f0ad4e}.bootstrap-dialog.type-danger .modal-header{background-color:#d9534f}.bootstrap-dialog.size-large .bootstrap-dialog-title{font-size:24px}.bootstrap-dialog.size-large .bootstrap-dialog-close-button{font-size:30px}.bootstrap-dialog.size-large .bootstrap-dialog-message{font-size:18px}.bootstrap-dialog .icon-spin{display:inline-block;-moz-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;-webkit-animation:spin 2s infinite linear;animation:spin 2s infinite linear}@-moz-keyframes spin{0%{-moz-transform:rotate(0deg)}100%{-moz-transform:rotate(359deg)}}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg)}}@-o-keyframes spin{0%{-o-transform:rotate(0deg)}100%{-o-transform:rotate(359deg)}}@-ms-keyframes spin{0%{-ms-transform:rotate(0deg)}100%{-ms-transform:rotate(359deg)}}@keyframes spin{0%{transform:rotate(0deg)}100%{transform:rotate(359deg)}}

File diff suppressed because one or more lines are too long

View File

@@ -1,26 +1,61 @@
/*
* ClearURLs
* Copyright (c) 2017-2020 Kevin Röbert
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
body {
font-size: 13px;
font-size: 14px;
}
.small-version {
font-size: 10px;
}
.navbar-header {
margin-top: 0;
margin-bottom: 8px;
.brand {
font-size: 17px;
}
.col-sm-1 {
margin-top: -10px;
.navbar-margin {
margin-top: 0;
margin-bottom: 10px;
}
#donate {
transition: 0.3s;
opacity: 0.8;
color: red;
color: #ffa500;
}
#donate:hover {
opacity: 1;
}
.btn-default {
color:#333;
background-color:#fff;
border-color:#ccc
}
.btn-default.focus,
.btn-default:focus {
color:#333;
background-color:#e6e6e6;
border-color:#8c8c8c
}
.btn-default:hover {
color:#333;
background-color:#e6e6e6;
border-color:#adadad
}

View File

@@ -1 +0,0 @@
table.dataTable{clear:both;margin-top:6px !important;margin-bottom:6px !important;max-width:none !important;border-collapse:separate !important}table.dataTable td,table.dataTable th{-webkit-box-sizing:content-box;box-sizing:content-box}table.dataTable td.dataTables_empty,table.dataTable th.dataTables_empty{text-align:center}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}div.dataTables_wrapper div.dataTables_length label{font-weight:normal;text-align:left;white-space:nowrap}div.dataTables_wrapper div.dataTables_length select{width:75px;display:inline-block}div.dataTables_wrapper div.dataTables_filter{text-align:right}div.dataTables_wrapper div.dataTables_filter label{font-weight:normal;white-space:nowrap;text-align:left}div.dataTables_wrapper div.dataTables_filter input{margin-left:0.5em;display:inline-block;width:auto}div.dataTables_wrapper div.dataTables_info{padding-top:8px;white-space:nowrap}div.dataTables_wrapper div.dataTables_paginate{margin:0;white-space:nowrap;text-align:right}div.dataTables_wrapper div.dataTables_paginate ul.pagination{margin:2px 0;white-space:nowrap}div.dataTables_wrapper div.dataTables_processing{position:absolute;top:50%;left:50%;width:200px;margin-left:-100px;margin-top:-26px;text-align:center;padding:1em 0}table.dataTable thead>tr>th.sorting_asc,table.dataTable thead>tr>th.sorting_desc,table.dataTable thead>tr>th.sorting,table.dataTable thead>tr>td.sorting_asc,table.dataTable thead>tr>td.sorting_desc,table.dataTable thead>tr>td.sorting{padding-right:30px}table.dataTable thead>tr>th:active,table.dataTable thead>tr>td:active{outline:none}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc,table.dataTable thead .sorting_asc_disabled,table.dataTable thead .sorting_desc_disabled{cursor:pointer;position:relative}table.dataTable thead .sorting:after,table.dataTable thead .sorting_asc:after,table.dataTable thead .sorting_desc:after,table.dataTable thead .sorting_asc_disabled:after,table.dataTable thead .sorting_desc_disabled:after{position:absolute;bottom:8px;right:8px;display:block;font-family:'Glyphicons Halflings';opacity:0.5}table.dataTable thead .sorting:after{opacity:0.2;content:"\e150"}table.dataTable thead .sorting_asc:after{content:"\e155"}table.dataTable thead .sorting_desc:after{content:"\e156"}table.dataTable thead .sorting_asc_disabled:after,table.dataTable thead .sorting_desc_disabled:after{color:#eee}div.dataTables_scrollHead table.dataTable{margin-bottom:0 !important}div.dataTables_scrollBody>table{border-top:none;margin-top:0 !important;margin-bottom:0 !important}div.dataTables_scrollBody>table>thead .sorting:after,div.dataTables_scrollBody>table>thead .sorting_asc:after,div.dataTables_scrollBody>table>thead .sorting_desc:after{display:none}div.dataTables_scrollBody>table>tbody>tr:first-child>th,div.dataTables_scrollBody>table>tbody>tr:first-child>td{border-top:none}div.dataTables_scrollFoot>.dataTables_scrollFootInner{box-sizing:content-box}div.dataTables_scrollFoot>.dataTables_scrollFootInner>table{margin-top:0 !important;border-top:none}@media screen and (max-width: 767px){div.dataTables_wrapper div.dataTables_length,div.dataTables_wrapper div.dataTables_filter,div.dataTables_wrapper div.dataTables_info,div.dataTables_wrapper div.dataTables_paginate{text-align:center}}table.dataTable.table-condensed>thead>tr>th{padding-right:20px}table.dataTable.table-condensed .sorting:after,table.dataTable.table-condensed .sorting_asc:after,table.dataTable.table-condensed .sorting_desc:after{top:6px;right:6px}table.table-bordered.dataTable th,table.table-bordered.dataTable td{border-left-width:0}table.table-bordered.dataTable th:last-child,table.table-bordered.dataTable th:last-child,table.table-bordered.dataTable td:last-child,table.table-bordered.dataTable td:last-child{border-right-width:0}table.table-bordered.dataTable tbody th,table.table-bordered.dataTable tbody td{border-bottom-width:0}div.dataTables_scrollHead table.table-bordered{border-bottom-width:0}div.table-responsive>div.dataTables_wrapper>div.row{margin:0}div.table-responsive>div.dataTables_wrapper>div.row>div[class^="col-"]:first-child{padding-left:0}div.table-responsive>div.dataTables_wrapper>div.row>div[class^="col-"]:last-child{padding-right:0}

15
css/datatables.min.css vendored Normal file

File diff suppressed because one or more lines are too long

View File

@@ -1,86 +0,0 @@
.pick-a-color-markup *{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}
.pick-a-color-markup .hex-pound{padding-left:8px;padding-right:8px}@media screen and (max-width:991px){.pick-a-color-markup .hex-pound{padding:3px 5px 0px 5px;min-height:30px}}
.pick-a-color-markup .pick-a-color{padding:5px}@media screen and (max-width:991px){.pick-a-color-markup .pick-a-color{width:100%;font-size:18px;padding:9px;min-width:222px;height:47px}}
.pick-a-color-markup .input-group-btn .color-dropdown{padding:6px 5px}.pick-a-color-markup .input-group-btn .color-dropdown.no-hex{border-bottom-left-radius:4px;border-top-left-radius:4px}
.pick-a-color-markup .input-group-btn .color-dropdown:focus{background-color:#fff}
@media screen and (max-width:991px){.pick-a-color-markup .input-group-btn .color-dropdown{height:47px}}
.pick-a-color-markup .color-preview{border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 0 2px 2px rgba(0,0,0,0.075);box-shadow:inset 0 0 2px 2px rgba(0,0,0,0.075);height:1.429em;width:1.429em;display:inline-block;cursor:pointer;margin-right:5px}.pick-a-color-markup .color-preview.current-color{margin-bottom:-5px}
@media screen and (max-width:991px){.pick-a-color-markup .color-preview{height:1.875em;width:1.875em}}
.pick-a-color-markup .color-menu{text-align:left;padding:5px 0px;width:330px;font-size:14px;left:auto;}.pick-a-color-markup .color-menu.color-menu--inline{left:-285px}@media screen and (max-width:991px){.pick-a-color-markup .color-menu.color-menu--inline{left:-242px}}
@media screen and (max-width:991px){.pick-a-color-markup .color-menu{left:-242px;width:293px}}.pick-a-color-markup .color-menu.small{width:100px}@media screen and (max-width:991px){.pick-a-color-markup .color-menu.small{left:-105px}}
.pick-a-color-markup .color-menu.no-hex{left:0px}
.pick-a-color-markup .color-menu ul{padding:0px;margin:0px}
.pick-a-color-markup .color-menu li{list-style-type:none;padding:5px 0px;margin:0px}
.pick-a-color-markup .color-menu .color-preview{vertical-align:middle;margin:0px}@media screen and (max-width:991px){.pick-a-color-markup .color-menu .color-preview{height:35px;width:35px}}.pick-a-color-markup .color-menu .color-preview.current-color,.pick-a-color-markup .color-menu .color-preview.white{background-color:#fff}
.pick-a-color-markup .color-menu .color-preview.red{background-color:#f00}
.pick-a-color-markup .color-menu .color-preview.orange{background-color:#f60}
.pick-a-color-markup .color-menu .color-preview.yellow{background-color:#ff0}
.pick-a-color-markup .color-menu .color-preview.green{background-color:#008000}
.pick-a-color-markup .color-menu .color-preview.blue{background-color:#00f}
.pick-a-color-markup .color-menu .color-preview.indigo{background-color:#4a0080}
.pick-a-color-markup .color-menu .color-preview.violet{background-color:#ee81ee}
.pick-a-color-markup .color-menu .color-preview.purple{background-color:#80007f}
.pick-a-color-markup .color-menu .color-preview.black{background-color:#000}
.pick-a-color-markup .color-menu .basicColors-content li>a,.pick-a-color-markup .color-menu .savedColors-content li>a{padding:5px 15px 3px 15px;cursor:default;min-height:25px;color:#333}.pick-a-color-markup .color-menu .basicColors-content li>a:hover,.pick-a-color-markup .color-menu .savedColors-content li>a:hover{background-color:#fff}
@media screen and (max-width:991px){.pick-a-color-markup .color-menu .basicColors-content li>a,.pick-a-color-markup .color-menu .savedColors-content li>a{min-height:40px}}
.pick-a-color-markup .color-menu .basicColors-content li:hover a,.pick-a-color-markup .color-menu .savedColors-content li:hover a{color:#333;background-image:none;filter:none;text-decoration:none;font-weight:bold}@media screen and (max-width:991px){.pick-a-color-markup .color-menu .basicColors-content li:hover a,.pick-a-color-markup .color-menu .savedColors-content li:hover a{background-color:#fff;font-weight:normal}}
.pick-a-color-markup .color-menu .btn.color-select{margin:0px 5px;height:20px;padding:0px 5px;margin-top:0px;line-height:1.5px;border-radius:4px}@media screen and (max-width:991px){.pick-a-color-markup .color-menu .btn.color-select{height:35px}}
.pick-a-color-markup .caret{margin-bottom:3px}
.pick-a-color-markup .color-menu-instructions,.pick-a-color-markup .advanced-instructions{text-align:center;padding:0px 6px;margin:0px;font-size:14px;font-weight:normal}@media screen and (min-width:992px){.pick-a-color-markup .color-menu-instructions,.pick-a-color-markup .advanced-instructions{display:none}}
.pick-a-color-markup .color-label{vertical-align:middle;margin:0px;margin-left:10px;cursor:pointer}@media screen and (max-width:991px){.pick-a-color-markup .color-label{margin-left:8px}}
.pick-a-color-markup .color-box{height:20px;width:200px;position:absolute;left:115px;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 0 2px 2px rgba(0,0,0,0.075);box-shadow:inset 0 0 2px 2px rgba(0,0,0,0.075);cursor:pointer}@media screen and (max-width:991px){.pick-a-color-markup .color-box{width:160px;height:35px}}
.pick-a-color-markup .black .highlight-band-stripe{background-color:#fff}
.pick-a-color-markup .spectrum-white{background-image:-webkit-gradient(linear, 0 top, 100% top, from(#fff), to(#808080));background-image:-webkit-linear-gradient(left, color-stop(#fff 0), color-stop(#808080 100%));background-image:-moz-linear-gradient(left, #fff 0, #808080 100%);background-image:linear-gradient(to right, #fff 0, #808080 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ff808080', GradientType=1)}.pick-a-color-markup .spectrum-white .highlight-band{left:0px}
.pick-a-color-markup .spectrum-red{background-image:-webkit-gradient(linear, left top, right top, color-stop(0, #fff), color-stop(.5, #f00), color-stop(1, #000));background-image:-moz-linear-gradient(left center, #fff 0, #f00 50%, #000 100%);background-image:-webkit-linear-gradient(left, #fff 0, #f00 50%, #000 100%);background-image:-o-linear-gradient(left, #fff 0, #f00 50%, #000 100%);background-image:linear-gradient(to right, #fff 0, #f00 50%, #000 100%);background-repeat:repeat-x}
.pick-a-color-markup .spectrum-orange{background-image:-webkit-gradient(linear, left top, right top, color-stop(0, #fff), color-stop(.5, #f60), color-stop(1, #000));background-image:-moz-linear-gradient(left center, #fff 0, #f60 50%, #000 100%);background-image:-webkit-linear-gradient(left, #fff 0, #f60 50%, #000 100%);background-image:-o-linear-gradient(left, #fff 0, #f60 50%, #000 100%);background-image:linear-gradient(to right, #fff 0, #f60 50%, #000 100%);background-repeat:repeat-x}
.pick-a-color-markup .spectrum-yellow{background-image:-webkit-gradient(linear, left top, right top, color-stop(0, #fff), color-stop(.5, #ff0), color-stop(1, #000));background-image:-moz-linear-gradient(left center, #fff 0, #ff0 50%, #000 100%);background-image:-webkit-linear-gradient(left, #fff 0, #ff0 50%, #000 100%);background-image:-o-linear-gradient(left, #fff 0, #ff0 50%, #000 100%);background-image:linear-gradient(to right, #fff 0, #ff0 50%, #000 100%);background-repeat:repeat-x}
.pick-a-color-markup .spectrum-green{background-image:-webkit-gradient(linear, left top, right top, color-stop(0, #80ff80), color-stop(.5, #008000), color-stop(1, #000));background-image:-moz-linear-gradient(left center, #80ff80 0, #008000 50%, #000 100%);background-image:-webkit-linear-gradient(left, #80ff80 0, #008000 50%, #000 100%);background-image:-o-linear-gradient(left, #80ff80 0, #008000 50%, #000 100%);background-image:linear-gradient(to right, #80ff80 0, #008000 50%, #000 100%);background-repeat:repeat-x}
.pick-a-color-markup .spectrum-blue{background-image:-webkit-gradient(linear, left top, right top, color-stop(0, #fff), color-stop(.5, #00f), color-stop(1, #000));background-image:-moz-linear-gradient(left center, #fff 0, #00f 50%, #000 100%);background-image:-webkit-linear-gradient(left, #fff 0, #00f 50%, #000 100%);background-image:-o-linear-gradient(left, #fff 0, #00f 50%, #000 100%);background-image:linear-gradient(to right, #fff 0, #00f 50%, #000 100%);background-repeat:repeat-x}
.pick-a-color-markup .spectrum-purple{background-image:-webkit-gradient(linear, left top, right top, color-stop(0, #ff80ff), color-stop(.5, #80007f), color-stop(1, #000));background-image:-moz-linear-gradient(left center, #ff80ff 0, #80007f 50%, #000 100%);background-image:-webkit-linear-gradient(left, #ff80ff 0, #80007f 50%, #000 100%);background-image:-o-linear-gradient(left, #ff80ff 0, #80007f 50%, #000 100%);background-image:linear-gradient(to right, #ff80ff 0, #80007f 50%, #000 100%);background-repeat:repeat-x}
.pick-a-color-markup .spectrum-black{background-image:-webkit-gradient(linear, 0 top, 100% top, from(#000), to(#808080));background-image:-webkit-linear-gradient(left, color-stop(#000 0), color-stop(#808080 100%));background-image:-moz-linear-gradient(left, #000 0, #808080 100%);background-image:linear-gradient(to right, #000 0, #808080 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff000000', endColorstr='#ff808080', GradientType=1)}.pick-a-color-markup .spectrum-black .highlight-band{left:0px;border:1px solid #808080}
.pick-a-color-markup .ie-spectrum{height:20px;width:100px;display:inline-block;top:-1}.pick-a-color-markup .ie-spectrum.hue{width:50.5px}@media screen and (max-width:991px){.pick-a-color-markup .ie-spectrum.hue{width:45.5px}}
@media screen and (max-width:991px){.pick-a-color-markup .ie-spectrum{width:80px;height:35px}}
.pick-a-color-markup .red-spectrum-0,.pick-a-color-markup .lightness-spectrum-0{background-image:-webkit-gradient(linear, 0 top, 100% top, from(#fff), to(#f00));background-image:-webkit-linear-gradient(left, color-stop(#fff 0), color-stop(#f00 100%));background-image:-moz-linear-gradient(left, #fff 0, #f00 100%);background-image:linear-gradient(to right, #fff 0, #f00 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffff0000', GradientType=1);border-bottom-left-radius:4px;border-top-left-radius:4px}
.pick-a-color-markup .red-spectrum-1,.pick-a-color-markup .lightness-spectrum-1{background-image:-webkit-gradient(linear, 0 top, 100% top, from(#f00), to(#000));background-image:-webkit-linear-gradient(left, color-stop(#f00 0), color-stop(#000 100%));background-image:-moz-linear-gradient(left, #f00 0, #000 100%);background-image:linear-gradient(to right, #f00 0, #000 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffff0000', endColorstr='#ff000000', GradientType=1);border-bottom-right-radius:4px;border-top-right-radius:4px}
.pick-a-color-markup .lightness-spectrum-0,.pick-a-color-markup .lightness-spectrum-1{width:150px}@media screen and (max-width:991px){.pick-a-color-markup .lightness-spectrum-0,.pick-a-color-markup .lightness-spectrum-1{width:135px}}
.pick-a-color-markup .orange-spectrum-0{background-image:-webkit-gradient(linear, 0 top, 100% top, from(#fff), to(#f60));background-image:-webkit-linear-gradient(left, color-stop(#fff 0), color-stop(#f60 100%));background-image:-moz-linear-gradient(left, #fff 0, #f60 100%);background-image:linear-gradient(to right, #fff 0, #f60 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffff6600', GradientType=1);border-bottom-left-radius:4px;border-top-left-radius:4px}
.pick-a-color-markup .orange-spectrum-1{background-image:-webkit-gradient(linear, 0 top, 100% top, from(#f60), to(#000));background-image:-webkit-linear-gradient(left, color-stop(#f60 0), color-stop(#000 100%));background-image:-moz-linear-gradient(left, #f60 0, #000 100%);background-image:linear-gradient(to right, #f60 0, #000 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffff6600', endColorstr='#ff000000', GradientType=1);border-bottom-right-radius:4px;border-top-right-radius:4px}
.pick-a-color-markup .yellow-spectrum-0{background-image:-webkit-gradient(linear, 0 top, 100% top, from(#fff), to(#ff0));background-image:-webkit-linear-gradient(left, color-stop(#fff 0), color-stop(#ff0 100%));background-image:-moz-linear-gradient(left, #fff 0, #ff0 100%);background-image:linear-gradient(to right, #fff 0, #ff0 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffffff00', GradientType=1);border-bottom-left-radius:4px;border-top-left-radius:4px}
.pick-a-color-markup .yellow-spectrum-1{background-image:-webkit-gradient(linear, 0 top, 100% top, from(#ff0), to(#000));background-image:-webkit-linear-gradient(left, color-stop(#ff0 0), color-stop(#000 100%));background-image:-moz-linear-gradient(left, #ff0 0, #000 100%);background-image:linear-gradient(to right, #ff0 0, #000 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff00', endColorstr='#ff000000', GradientType=1);border-bottom-right-radius:4px;border-top-right-radius:4px}
.pick-a-color-markup .green-spectrum-0{background-image:-webkit-gradient(linear, 0 top, 100% top, from(#80ff80), to(#008000));background-image:-webkit-linear-gradient(left, color-stop(#80ff80 0), color-stop(#008000 100%));background-image:-moz-linear-gradient(left, #80ff80 0, #008000 100%);background-image:linear-gradient(to right, #80ff80 0, #008000 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff80ff80', endColorstr='#ff008000', GradientType=1);border-bottom-left-radius:4px;border-top-left-radius:4px}
.pick-a-color-markup .green-spectrum-1{background-image:-webkit-gradient(linear, 0 top, 100% top, from(#008000), to(#000));background-image:-webkit-linear-gradient(left, color-stop(#008000 0), color-stop(#000 100%));background-image:-moz-linear-gradient(left, #008000 0, #000 100%);background-image:linear-gradient(to right, #008000 0, #000 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff008000', endColorstr='#ff000000', GradientType=1);border-bottom-right-radius:4px;border-top-right-radius:4px}
.pick-a-color-markup .blue-spectrum-0{background-image:-webkit-gradient(linear, 0 top, 100% top, from(#fff), to(#00f));background-image:-webkit-linear-gradient(left, color-stop(#fff 0), color-stop(#00f 100%));background-image:-moz-linear-gradient(left, #fff 0, #00f 100%);background-image:linear-gradient(to right, #fff 0, #00f 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ff0000ff', GradientType=1);border-bottom-left-radius:4px;border-top-left-radius:4px}
.pick-a-color-markup .blue-spectrum-1{background-image:-webkit-gradient(linear, 0 top, 100% top, from(#00f), to(#000));background-image:-webkit-linear-gradient(left, color-stop(#00f 0), color-stop(#000 100%));background-image:-moz-linear-gradient(left, #00f 0, #000 100%);background-image:linear-gradient(to right, #00f 0, #000 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0000ff', endColorstr='#ff000000', GradientType=1);border-bottom-right-radius:4px;border-top-right-radius:4px}
.pick-a-color-markup .purple-spectrum-0{background-image:-webkit-gradient(linear, 0 top, 100% top, from(#ff80ff), to(#80007f));background-image:-webkit-linear-gradient(left, color-stop(#ff80ff 0), color-stop(#80007f 100%));background-image:-moz-linear-gradient(left, #ff80ff 0, #80007f 100%);background-image:linear-gradient(to right, #ff80ff 0, #80007f 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffff80ff', endColorstr='#ff80007f', GradientType=1);border-bottom-left-radius:4px;border-top-left-radius:4px}
.pick-a-color-markup .purple-spectrum-1{background-image:-webkit-gradient(linear, 0 top, 100% top, from(#80007f), to(#000));background-image:-webkit-linear-gradient(left, color-stop(#80007f 0), color-stop(#000 100%));background-image:-moz-linear-gradient(left, #80007f 0, #000 100%);background-image:linear-gradient(to right, #80007f 0, #000 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff80007f', endColorstr='#ff000000', GradientType=1);border-bottom-right-radius:4px;border-top-right-radius:4px}
.pick-a-color-markup .saturation-spectrum-0{background-image:-webkit-gradient(linear, 0 top, 100% top, from(#808080), to(#bf4040));background-image:-webkit-linear-gradient(left, color-stop(#808080 0), color-stop(#bf4040 100%));background-image:-moz-linear-gradient(left, #808080 0, #bf4040 100%);background-image:linear-gradient(to right, #808080 0, #bf4040 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff808080', endColorstr='#ffbf4040', GradientType=1);border-bottom-left-radius:4px;border-top-left-radius:4px;width:150px}@media screen and (max-width:991px){.pick-a-color-markup .saturation-spectrum-0{width:135px}}
.pick-a-color-markup .saturation-spectrum-1{background-image:-webkit-gradient(linear, 0 top, 100% top, from(#bf4040), to(#f00));background-image:-webkit-linear-gradient(left, color-stop(#bf4040 0), color-stop(#f00 100%));background-image:-moz-linear-gradient(left, #bf4040 0, #f00 100%);background-image:linear-gradient(to right, #bf4040 0, #f00 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffbf4040', endColorstr='#ffff0000', GradientType=1);border-bottom-right-radius:4px;border-top-right-radius:4px;width:150px}@media screen and (max-width:991px){.pick-a-color-markup .saturation-spectrum-1{width:135px}}
.pick-a-color-markup .hue-spectrum-0{background-image:-webkit-gradient(linear, 0 top, 100% top, from(#f00), to(#ff0));background-image:-webkit-linear-gradient(left, color-stop(#f00 0), color-stop(#ff0 100%));background-image:-moz-linear-gradient(left, #f00 0, #ff0 100%);background-image:linear-gradient(to right, #f00 0, #ff0 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffff0000', endColorstr='#ffffff00', GradientType=1)}
.pick-a-color-markup .hue-spectrum-1{background-image:-webkit-gradient(linear, 0 top, 100% top, from(#ff0), to(#0f0));background-image:-webkit-linear-gradient(left, color-stop(#ff0 0), color-stop(#0f0 100%));background-image:-moz-linear-gradient(left, #ff0 0, #0f0 100%);background-image:linear-gradient(to right, #ff0 0, #0f0 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff00', endColorstr='#ff00ff00', GradientType=1)}
.pick-a-color-markup .hue-spectrum-2{background-image:-webkit-gradient(linear, 0 top, 100% top, from(#0f0), to(#0ff));background-image:-webkit-linear-gradient(left, color-stop(#0f0 0), color-stop(#0ff 100%));background-image:-moz-linear-gradient(left, #0f0 0, #0ff 100%);background-image:linear-gradient(to right, #0f0 0, #0ff 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff00ff00', endColorstr='#ff00ffff', GradientType=1);left:-1px;position:relative}
.pick-a-color-markup .hue-spectrum-3{background-image:-webkit-gradient(linear, 0 top, 100% top, from(#0ff), to(#00f));background-image:-webkit-linear-gradient(left, color-stop(#0ff 0), color-stop(#00f 100%));background-image:-moz-linear-gradient(left, #0ff 0, #00f 100%);background-image:linear-gradient(to right, #0ff 0, #00f 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff00ffff', endColorstr='#ff0000ff', GradientType=1);left:-1px;position:relative}
.pick-a-color-markup .hue-spectrum-4{background-image:-webkit-gradient(linear, 0 top, 100% top, from(#00f), to(#f0f));background-image:-webkit-linear-gradient(left, color-stop(#00f 0), color-stop(#f0f 100%));background-image:-moz-linear-gradient(left, #00f 0, #f0f 100%);background-image:linear-gradient(to right, #00f 0, #f0f 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0000ff', endColorstr='#ffff00ff', GradientType=1);left:-1px;position:relative}
.pick-a-color-markup .hue-spectrum-5{background-image:-webkit-gradient(linear, 0 top, 100% top, from(#f0f), to(#f00));background-image:-webkit-linear-gradient(left, color-stop(#f0f 0), color-stop(#f00 100%));background-image:-moz-linear-gradient(left, #f0f 0, #f00 100%);background-image:linear-gradient(to right, #f0f 0, #f00 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffff00ff', endColorstr='#ffff0000', GradientType=1);left:-2px;position:relative}
.pick-a-color-markup .highlight-band{border:1px solid #222;border-radius:2px;-webkit-box-shadow:1px 1px 1px #333;box-shadow:1px 1px 1px #333;height:19px;width:11px;display:inline-block;cursor:pointer;cursor:-webkit-grab;cursor:-moz-grab;position:absolute;top:-1px;left:94.5px;text-align:center}@media screen and (max-width:991px){.pick-a-color-markup .highlight-band{width:21px;left:69.5px;height:34px}}
.pick-a-color-markup .highlight-band-stripe{min-height:80%;min-width:1px;background-color:#000;opacity:0.40;margin:2px 1px;display:inline-block;-webkit-box-shadow:1px 0 2px 0 #fff;box-shadow:1px 0 2px 0 #fff}@media screen and (max-width:991px){.pick-a-color-markup .highlight-band-stripe{margin:4px 2px}}
.pick-a-color-markup .color-menu-tabs{padding:5px 3px 3px 10px;font-size:12px;color:#333;border-bottom:1px solid #ccc;margin-bottom:5px}.pick-a-color-markup .color-menu-tabs .tab{padding:4px 5px;margin:5px;border-left:1px solid #fff;border-right:1px solid #fff;cursor:pointer;background-color:#fff}.pick-a-color-markup .color-menu-tabs .tab:hover{padding-bottom:6px;border-top:1px solid #ccc;border-right:1px solid #ccc;border-left:1px solid #ccc;border-top-right-radius:4px;border-top-left-radius:4px}
.pick-a-color-markup .color-menu-tabs a{color:#333;text-decoration:none}
.pick-a-color-markup .color-menu-tabs .tab-active{border-bottom:3px solid #fff;padding-bottom:5px;border-top:1px solid #ccc;border-right:1px solid #ccc;border-left:1px solid #ccc;border-top-right-radius:4px;border-top-left-radius:4px}
.pick-a-color-markup .active-content{display:block}
.pick-a-color-markup .inactive-content{display:none}
.pick-a-color-markup .savedColors-content{padding:5px 15px;white-space:normal}.pick-a-color-markup .savedColors-content li.color-item>a{margin-left:7px;padding-left:8px;border-radius:4px}
.pick-a-color-markup .saved-color-col{position:relative;left:-15px;float:left;width:149px}@media screen and (max-width:991px){.pick-a-color-markup .saved-color-col{width:130px}}
.pick-a-color-markup .advanced-content ul{margin-top:10px}
.pick-a-color-markup .advanced-content li{padding:5px 15px 3px 15px;cursor:default;min-height:25px;height:50px;position:relative}@media screen and (max-width:991px){.pick-a-color-markup .advanced-content li{min-height:70px}}
.pick-a-color-markup .advanced-content .color-preview{height:50px;width:300px;float:left;margin:0px 0px 10px 0px;background-color:#f00;text-align:center}.pick-a-color-markup .advanced-content .color-preview .color-select.btn.advanced{margin-top:15px;display:none}@media screen and (max-width:991px){.pick-a-color-markup .advanced-content .color-preview .color-select.btn.advanced{display:inline;margin-top:7px}}
.pick-a-color-markup .advanced-content .color-preview:hover .color-select.btn.advanced{display:inline}
@media screen and (max-width:991px){.pick-a-color-markup .advanced-content .color-preview{width:270px;margin-left:-10px}}
.pick-a-color-markup .advanced-content .spectrum-hue{background-image:-webkit-gradient(linear, left top, right top, color-stop(0, #f00), color-stop(17%, #ff0), color-stop(34%, #0f0), color-stop(51%, #0ff), color-stop(68%, #00f), color-stop(85%, #f0f), color-stop(100%, #f00));background-image:-moz-linear-gradient(left center, #f00 0, #ff0 17%, #0f0 24%, #0ff 51%, #00f 68%, #f0f 85%, #f00 100%);background-image:-webkit-linear-gradient(left, #f00 0, #ff0 17%, #0f0 24%, #0ff 51%, #00f 68%, #f0f 85%, #f00 100%);background-image:-o-linear-gradient(left, #f00 0, #ff0 17%, #0f0 24%, #0ff 51%, #00f 68%, #f0f 85%, #f00 100%);background-image:linear-gradient(to right, #f00 0, #ff0 17%, #0f0 24%, #0ff 51%, #00f 68%, #f0f 85%, #f00 100%);background-repeat:repeat-x}.pick-a-color-markup .advanced-content .spectrum-hue .highlight-band{left:0px}
.pick-a-color-markup .advanced-content .spectrum-lightness{background-image:-webkit-gradient(linear, left top, right top, color-stop(0, #fff), color-stop(.5, #f00), color-stop(1, #000));background-image:-moz-linear-gradient(left center, #fff 0, #f00 50%, #000 100%);background-image:-webkit-linear-gradient(left, #fff 0, #f00 50%, #000 100%);background-image:-o-linear-gradient(left, #fff 0, #f00 50%, #000 100%);background-image:linear-gradient(to right, #fff 0, #f00 50%, #000 100%);background-repeat:repeat-x}
.pick-a-color-markup .advanced-content .spectrum-saturation{background-image:-webkit-gradient(linear, left top, right top, color-stop(0, #808080), color-stop(.5, #f00), color-stop(1, #f00));background-image:-moz-linear-gradient(left center, #808080 0, #f00 50%, #f00 100%);background-image:-webkit-linear-gradient(left, #808080 0, #f00 50%, #f00 100%);background-image:-o-linear-gradient(left, #808080 0, #f00 50%, #f00 100%);background-image:linear-gradient(to right, #808080 0, #f00 50%, #f00 100%);background-repeat:repeat-x}.pick-a-color-markup .advanced-content .spectrum-saturation .highlight-band{left:287px}@media screen and (max-width:991px){.pick-a-color-markup .advanced-content .spectrum-saturation .highlight-band{left:247px}}
.pick-a-color-markup .advanced-content .spectrum-lightness .highlight-band{left:143.5px}@media screen and (max-width:991px){.pick-a-color-markup .advanced-content .spectrum-lightness .highlight-band{left:123.5px}}
.pick-a-color-markup .advanced-content .lightness-text,.pick-a-color-markup .advanced-content .hue-text,.pick-a-color-markup .advanced-content .saturation-text,.pick-a-color-markup .advanced-content .preview-text{vertical-align:middle;text-align:center;display:block}
.pick-a-color-markup .advanced-content .color-box{left:15px;top:25px;width:300px}@media screen and (max-width:991px){.pick-a-color-markup .advanced-content .color-box{width:270px;left:10px}}
.pick-a-color-markup .advanced-content .preview-item{height:80px}
@-moz-document url-prefix(){@media screen and (max-width:991px){div.pick-a-color-markup .color-menu{left:0px}}}

View File

@@ -1,3 +1,21 @@
/*
* ClearURLs
* Copyright (c) 2017-2020 Kevin Röbert
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/*
* Stylesheet for the switch buttons.
*/

View File

@@ -20,7 +20,8 @@
"[^a-zA-Z%0-9]adId=[^\\/|\\?|&]*(\\/|&(amp;)?)?",
"qualifier=[^\\/|\\?|&]*(\\/|&(amp;)?)?",
"_encoding=[^\\/|\\?|&]*(\\/|&(amp;)?)?",
"smid=[^\\/|\\?|&]*(\\/|&(amp;)?)?"
"smid=[^\\/|\\?|&]*(\\/|&(amp;)?)?",
"field-lbr_brands_browse-bin=[^\\/|\\?|&]*(\\/|&(amp;)?)?"
],
"exceptions": [
".*(amazon\\.).*(\\/gp).*\\/redirector.html\\/.*"
@@ -63,7 +64,12 @@
"sa=[^\\/|\\?|&]*(\\/|&(amp;)?)?",
"dpr=[^\\/|\\?|&]*(\\/|&(amp;)?)?",
"hl=[^\\/|\\?|&]*(\\/|&(amp;)?)?",
"btn[a-zA-Z]*=[^\\/|\\?|&]*(\\/|&(amp;)?)?"
"btn[a-zA-Z]*=[^\\/|\\?|&]*(\\/|&(amp;)?)?",
"sa=[^\\/|\\?|&]*(\\/|&(amp;)?)?",
"usg=[^\\/|\\?|&]*(\\/|&(amp;)?)?",
"cd=[^\\/|\\?|&]*(\\/|&(amp;)?)?",
"cad=[^\\/|\\?|&]*(\\/|&(amp;)?)?",
"uact=[^\\/|\\?|&]*(\\/|&(amp;)?)?"
],
"exceptions": [
".*(mail\\.google\\.).*(\\/mail\\/u\\/0).*",
@@ -76,10 +82,13 @@
".*(google\\.).*\\/complete\\/search\\?.*gs_[a-zA-Z]*=[^\\/|\\?|&]*(\\/|&(amp;)?)?",
".*(google\\.).*\\/s\\?tbm=map.*gs_[a-zA-Z]*=[^\\/|\\?|&]*(\\/|&(amp;)?)?",
".*(news\\.google\\.).*\\?hl=.*",
".*(google\\.).*\\/setprefs\\?.*hl=[^\\/|\\?|&]*(\\/|&(amp;)?)?"
".*(google\\.).*\\/setprefs\\?.*hl=[^\\/|\\?|&]*(\\/|&(amp;)?)?",
".*(google\\.).*\\/appsactivity\\/.*",
".*(google\\.).*\\/recaptcha\\/.*"
],
"redirections": [
".*google\\..*\\/.*url\\?.*url=([^&]*)"
".*google\\..*\\/.*url\\?.*url=((https|http)[^&]*)",
".*google\\..*\\/.*url\\?.*q=((https|http)[^&]*)"
]
},
"googlesyndication": {
@@ -115,6 +124,7 @@
"fb_action_types=[^\\/|\\?|&]*(\\/|&(amp;)?)?",
"fb_source=[^\\/|\\?|&]*(\\/|&(amp;)?)?",
"fb_ref=[^\\/|\\?|&]*(\\/|&(amp;)?)?",
"fbclid=[^\\/|\\?|&]*(\\/|&(amp;)?)?",
"action_object_map=[^\\/|\\?|&]*(\\/|&(amp;)?)?",
"action_type_map=[^\\/|\\?|&]*(\\/|&(amp;)?)?",
"action_ref_map=[^\\/|\\?|&]*(\\/|&(amp;)?)?",
@@ -132,7 +142,8 @@
".*([\\.]?prismic\\.io).*",
".*([\\.]?gitlab\\.com).*",
".*([\\.]?gcsip\\.com).*[\\?|&]ref[\\_]?=[^\\/|\\?|&]*.*",
".*([\\.]?cloudflare\\.com).*"
".*([\\.]?cloudflare\\.com).*",
".*([\\.]?tv2\\.no)(\\/api)\\/.*"
],
"redirections": []
},
@@ -186,13 +197,18 @@
"urlPattern": "(https:\\/\\/|http:\\/\\/)([a-zA-Z0-9-]*\\.)?(facebook)(\\.[a-zA-Z]{2,})(.*\\?.*)",
"completeProvider": false,
"rules": [
"hc_[a-zA-Z]*=[^\\/|\\?|&]*(\\/|&(amp;)?)?",
"[a-zA-Z]*ref[a-zA-Z]*=[^\\/|\\?|&]*(\\/|&(amp;)?)?"
"hc_[a-zA-Z_\\[\\]0-9]*=[^\\/|\\?|&]*(\\/|&(amp;)?)?",
"[a-zA-Z]*ref[a-zA-Z]*=[^\\/|\\?|&]*(\\/|&(amp;)?)?",
"__tn__=[^\\/|\\?|&]*(\\/|&(amp;)?)?",
"eid=[^\\/|\\?|&]*(\\/|&(amp;)?)?",
"__xts__%5B[0-9]%5D=[^\\/|\\?|&]*(\\/|&(amp;)?)?"
],
"exceptions": [
".*(facebook\\.)\\w{2,}.*(\\/plugins\\/).*"
],
"redirections": []
"redirections": [
".*l\\.facebook\\..*\\/.*l\\.php\\?.*u=((https%3A%2F%2F|http%3A%2F%2F)[^&]*)"
]
},
"twitter": {
"urlPattern": "(https:\\/\\/|http:\\/\\/)([a-zA-Z0-9-]*\\.)?(twitter)(\\.[a-zA-Z]{2,})(.*\\?.*)",
@@ -230,7 +246,9 @@
"rules": [
"ncid=[^\\/|\\?|&]*(\\/|&(amp;)?)?",
"sr=[^\\/|\\?|&]*(\\/|&(amp;)?)?",
"sr_share=[^\\/|\\?|&]*(\\/|&(amp;)?)?"
"sr_share=[^\\/|\\?|&]*(\\/|&(amp;)?)?",
"guccounter=[^\\/|\\?|&]*(\\/|&(amp;)?)?",
"guce_referrer_[a-z]+=[^\\/|\\?|&]*(\\/|&(amp;)?)?"
],
"exceptions": [],
"redirections": []
@@ -312,7 +330,8 @@
"completeProvider": false,
"rules": [
"_trkparms=[^\\/|\\?|&]*(\\/|&(amp;)?)?",
"_trksid=[^\\/|\\?|&]*(\\/|&(amp;)?)?"
"_trksid=[^\\/|\\?|&]*(\\/|&(amp;)?)?",
"_from=[^\\/|\\?|&]*(\\/|&(amp;)?)?"
],
"exceptions": [],
"redirections": []
@@ -373,6 +392,70 @@
],
"exceptions": [],
"redirections": []
},
"youku.com": {
"urlPattern": "(https:\\/\\/|http:\\/\\/)([a-zA-Z0-9-]*\\.)?(youku\\.com)(.*\\?.*)",
"completeProvider": false,
"rules": [
"spm=[^\\/|\\?|&]*(\\/|&(amp;)?)?",
"tpa=[^\\/|\\?|&]*(\\/|&(amp;)?)?"
],
"exceptions": [],
"redirections": []
},
"nytimes.com": {
"urlPattern": "(https:\\/\\/|http:\\/\\/)([a-zA-Z0-9-]*\\.)?(nytimes\\.com)(.*\\?.*)",
"completeProvider": false,
"rules": [
"smid=[^\\/|\\?|&]*(\\/|&(amp;)?)?"
],
"exceptions": [],
"redirections": []
},
"tchibo.de": {
"urlPattern": "(https:\\/\\/|http:\\/\\/)([a-zA-Z0-9-]*\\.)?(tchibo\\.de)(.*\\?.*)",
"completeProvider": false,
"rules": [
"wbdcd=[^\\/|\\?|&]*(\\/|&(amp;)?)?"
],
"exceptions": [],
"redirections": []
},
"steam": {
"urlPattern": "(https:\\/\\/|http:\\/\\/)([a-zA-Z0-9-]*\\.)?(steampowered\\.com)(.*\\?.*)",
"completeProvider": false,
"rules": [
"snr=[^\\/|\\?|&]*(\\/|&(amp;)?)?"
],
"exceptions": [],
"redirections": []
},
"disq.us": {
"urlPattern": "(https:\\/\\/|http:\\/\\/)([a-zA-Z0-9-]*\\.)?(disq\\.us)(.*\\?.*)",
"completeProvider": false,
"rules": [],
"exceptions": [],
"redirections": [
".*disq\\.us.*\\/.*url\\?.*url=((https%3A%2F%2F|http%3A%2F%2F).*)%3A"
]
},
"mozaws.net": {
"urlPattern": "https?://outgoing\\.prod\\.mozaws\\.net/.*",
"completeProvider": false,
"rules": [],
"exceptions": [],
"redirections": [
"https?://[^/]+/v1/[0-9a-f]{64}/(.*)"
]
},
"shutterstock.com": {
"urlPattern": "https?://([a-zA-Z0-9-]*\\.)?(shutterstock\\.com)(.*\\?.*)",
"completeProvider": false,
"rules": [
"src=[^\\/|\\?|&]*(\\/|&(amp;)?)?"
],
"exceptions": [],
"redirections": []
}
}
}

1214
data/data.min.json Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -1 +1 @@
90817dd44464af4bf7313e987e455e052501fe4e3c8b088934e65e75964f58a5
b0e1fc948f5e391a53a57092b1c29e8cff474402d5411f4045cfb4a7db37d2bc

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,16 @@
/*
* Source: https://github.com/mdn/webextensions-examples/tree/master/context-menu-copy-link-with-types
*/
function copyToClipboard(text) {
function oncopy(event) {
document.removeEventListener("copy", oncopy, true);
event.stopImmediatePropagation();
event.preventDefault();
event.clipboardData.setData("text/plain", text);
}
document.addEventListener("copy", oncopy, true);
document.execCommand("copy");
}

View File

@@ -1,8 +0,0 @@
/*!
DataTables Bootstrap 3 integration
©2011-2015 SpryMedia Ltd - datatables.net/license
*/
(function(b){"function"===typeof define&&define.amd?define(["jquery","datatables.net"],function(a){return b(a,window,document)}):"object"===typeof exports?module.exports=function(a,d){a||(a=window);if(!d||!d.fn.dataTable)d=require("datatables.net")(a,d).$;return b(d,a,a.document)}:b(jQuery,window,document)})(function(b,a,d,m){var f=b.fn.dataTable;b.extend(!0,f.defaults,{dom:"<'row'<'col-sm-6'l><'col-sm-6'f>><'row'<'col-sm-12'tr>><'row'<'col-sm-5'i><'col-sm-7'p>>",renderer:"bootstrap"});b.extend(f.ext.classes,
{sWrapper:"dataTables_wrapper form-inline dt-bootstrap",sFilterInput:"form-control input-sm",sLengthSelect:"form-control input-sm",sProcessing:"dataTables_processing panel panel-default"});f.ext.renderer.pageButton.bootstrap=function(a,h,r,s,j,n){var o=new f.Api(a),t=a.oClasses,k=a.oLanguage.oPaginate,u=a.oLanguage.oAria.paginate||{},e,g,p=0,q=function(d,f){var l,h,i,c,m=function(a){a.preventDefault();!b(a.currentTarget).hasClass("disabled")&&o.page()!=a.data.action&&o.page(a.data.action).draw("page")};
l=0;for(h=f.length;l<h;l++)if(c=f[l],b.isArray(c))q(d,c);else{g=e="";switch(c){case "ellipsis":e="&#x2026;";g="disabled";break;case "first":e=k.sFirst;g=c+(0<j?"":" disabled");break;case "previous":e=k.sPrevious;g=c+(0<j?"":" disabled");break;case "next":e=k.sNext;g=c+(j<n-1?"":" disabled");break;case "last":e=k.sLast;g=c+(j<n-1?"":" disabled");break;default:e=c+1,g=j===c?"active":""}e&&(i=b("<li>",{"class":t.sPageButton+" "+g,id:0===r&&"string"===typeof c?a.sTableId+"_"+c:null}).append(b("<a>",{href:"#",
"aria-controls":a.sTableId,"aria-label":u[c],"data-dt-idx":p,tabindex:a.iTabIndex}).html(e)).appendTo(d),a.oApi._fnBindAction(i,{action:c},m),p++)}},i;try{i=b(h).find(d.activeElement).data("dt-idx")}catch(v){}q(b(h).empty().html('<ul class="pagination"/>').children("ul"),s);i!==m&&b(h).find("[data-dt-idx="+i+"]").focus()};return f});

View File

@@ -1,11 +1,11 @@
{
"sEmptyTable": "Nenhum registro encontrado",
"sEmptyTable": "Nenhum registros encontrado",
"sProcessing": "A processar...",
"sLengthMenu": "Mostrar _MENU_ registos",
"sLengthMenu": "Mostrar _MENU_ registros",
"sZeroRecords": "Não foram encontrados resultados",
"sInfo": "Mostrando de _START_ até _END_ de _TOTAL_ registos",
"sInfoEmpty": "Mostrando de 0 até 0 de 0 registos",
"sInfoFiltered": "(filtrado de _MAX_ registos no total)",
"sInfo": "Mostrando de _START_ até _END_ de _TOTAL_ registros",
"sInfoEmpty": "Mostrando de 0 até 0 de 0 registros",
"sInfoFiltered": "(filtrado de _MAX_ registros no total)",
"sInfoPostFix": "",
"sSearch": "Procurar:",
"sUrl": "",

207
external_js/datatables.min.js vendored Normal file
View File

@@ -0,0 +1,207 @@
/*
* This combined file was created by the DataTables downloader builder:
* https://datatables.net/download
*
* To rebuild or modify this file with the latest versions of the included
* software please visit:
* https://datatables.net/download/#bs4/dt-1.10.20
*
* Included libraries:
* DataTables 1.10.20
*/
/*!
Copyright 2008-2019 SpryMedia Ltd.
This source file is free software, available under the following license:
MIT license - http://datatables.net/license
This source file is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details.
For details please refer to: http://www.datatables.net
DataTables 1.10.20
©2008-2019 SpryMedia Ltd - datatables.net/license
*/
var $jscomp=$jscomp||{};$jscomp.scope={};$jscomp.findInternal=function(f,z,y){f instanceof String&&(f=String(f));for(var p=f.length,H=0;H<p;H++){var L=f[H];if(z.call(y,L,H,f))return{i:H,v:L}}return{i:-1,v:void 0}};$jscomp.ASSUME_ES5=!1;$jscomp.ASSUME_NO_NATIVE_MAP=!1;$jscomp.ASSUME_NO_NATIVE_SET=!1;$jscomp.SIMPLE_FROUND_POLYFILL=!1;
$jscomp.defineProperty=$jscomp.ASSUME_ES5||"function"==typeof Object.defineProperties?Object.defineProperty:function(f,z,y){f!=Array.prototype&&f!=Object.prototype&&(f[z]=y.value)};$jscomp.getGlobal=function(f){return"undefined"!=typeof window&&window===f?f:"undefined"!=typeof global&&null!=global?global:f};$jscomp.global=$jscomp.getGlobal(this);
$jscomp.polyfill=function(f,z,y,p){if(z){y=$jscomp.global;f=f.split(".");for(p=0;p<f.length-1;p++){var H=f[p];H in y||(y[H]={});y=y[H]}f=f[f.length-1];p=y[f];z=z(p);z!=p&&null!=z&&$jscomp.defineProperty(y,f,{configurable:!0,writable:!0,value:z})}};$jscomp.polyfill("Array.prototype.find",function(f){return f?f:function(f,y){return $jscomp.findInternal(this,f,y).v}},"es6","es3");
(function(f){"function"===typeof define&&define.amd?define(["jquery"],function(z){return f(z,window,document)}):"object"===typeof exports?module.exports=function(z,y){z||(z=window);y||(y="undefined"!==typeof window?require("jquery"):require("jquery")(z));return f(y,z,z.document)}:f(jQuery,window,document)})(function(f,z,y,p){function H(a){var b,c,d={};f.each(a,function(e,h){(b=e.match(/^([^A-Z]+?)([A-Z])/))&&-1!=="a aa ai ao as b fn i m o s ".indexOf(b[1]+" ")&&(c=e.replace(b[0],b[2].toLowerCase()),
d[c]=e,"o"===b[1]&&H(a[e]))});a._hungarianMap=d}function L(a,b,c){a._hungarianMap||H(a);var d;f.each(b,function(e,h){d=a._hungarianMap[e];d===p||!c&&b[d]!==p||("o"===d.charAt(0)?(b[d]||(b[d]={}),f.extend(!0,b[d],b[e]),L(a[d],b[d],c)):b[d]=b[e])})}function Ga(a){var b=q.defaults.oLanguage,c=b.sDecimal;c&&Ha(c);if(a){var d=a.sZeroRecords;!a.sEmptyTable&&d&&"No data available in table"===b.sEmptyTable&&M(a,a,"sZeroRecords","sEmptyTable");!a.sLoadingRecords&&d&&"Loading..."===b.sLoadingRecords&&M(a,a,
"sZeroRecords","sLoadingRecords");a.sInfoThousands&&(a.sThousands=a.sInfoThousands);(a=a.sDecimal)&&c!==a&&Ha(a)}}function jb(a){F(a,"ordering","bSort");F(a,"orderMulti","bSortMulti");F(a,"orderClasses","bSortClasses");F(a,"orderCellsTop","bSortCellsTop");F(a,"order","aaSorting");F(a,"orderFixed","aaSortingFixed");F(a,"paging","bPaginate");F(a,"pagingType","sPaginationType");F(a,"pageLength","iDisplayLength");F(a,"searching","bFilter");"boolean"===typeof a.sScrollX&&(a.sScrollX=a.sScrollX?"100%":
"");"boolean"===typeof a.scrollX&&(a.scrollX=a.scrollX?"100%":"");if(a=a.aoSearchCols)for(var b=0,c=a.length;b<c;b++)a[b]&&L(q.models.oSearch,a[b])}function kb(a){F(a,"orderable","bSortable");F(a,"orderData","aDataSort");F(a,"orderSequence","asSorting");F(a,"orderDataType","sortDataType");var b=a.aDataSort;"number"!==typeof b||f.isArray(b)||(a.aDataSort=[b])}function lb(a){if(!q.__browser){var b={};q.__browser=b;var c=f("<div/>").css({position:"fixed",top:0,left:-1*f(z).scrollLeft(),height:1,width:1,
overflow:"hidden"}).append(f("<div/>").css({position:"absolute",top:1,left:1,width:100,overflow:"scroll"}).append(f("<div/>").css({width:"100%",height:10}))).appendTo("body"),d=c.children(),e=d.children();b.barWidth=d[0].offsetWidth-d[0].clientWidth;b.bScrollOversize=100===e[0].offsetWidth&&100!==d[0].clientWidth;b.bScrollbarLeft=1!==Math.round(e.offset().left);b.bBounding=c[0].getBoundingClientRect().width?!0:!1;c.remove()}f.extend(a.oBrowser,q.__browser);a.oScroll.iBarWidth=q.__browser.barWidth}
function mb(a,b,c,d,e,h){var g=!1;if(c!==p){var k=c;g=!0}for(;d!==e;)a.hasOwnProperty(d)&&(k=g?b(k,a[d],d,a):a[d],g=!0,d+=h);return k}function Ia(a,b){var c=q.defaults.column,d=a.aoColumns.length;c=f.extend({},q.models.oColumn,c,{nTh:b?b:y.createElement("th"),sTitle:c.sTitle?c.sTitle:b?b.innerHTML:"",aDataSort:c.aDataSort?c.aDataSort:[d],mData:c.mData?c.mData:d,idx:d});a.aoColumns.push(c);c=a.aoPreSearchCols;c[d]=f.extend({},q.models.oSearch,c[d]);ma(a,d,f(b).data())}function ma(a,b,c){b=a.aoColumns[b];
var d=a.oClasses,e=f(b.nTh);if(!b.sWidthOrig){b.sWidthOrig=e.attr("width")||null;var h=(e.attr("style")||"").match(/width:\s*(\d+[pxem%]+)/);h&&(b.sWidthOrig=h[1])}c!==p&&null!==c&&(kb(c),L(q.defaults.column,c,!0),c.mDataProp===p||c.mData||(c.mData=c.mDataProp),c.sType&&(b._sManualType=c.sType),c.className&&!c.sClass&&(c.sClass=c.className),c.sClass&&e.addClass(c.sClass),f.extend(b,c),M(b,c,"sWidth","sWidthOrig"),c.iDataSort!==p&&(b.aDataSort=[c.iDataSort]),M(b,c,"aDataSort"));var g=b.mData,k=U(g),
l=b.mRender?U(b.mRender):null;c=function(a){return"string"===typeof a&&-1!==a.indexOf("@")};b._bAttrSrc=f.isPlainObject(g)&&(c(g.sort)||c(g.type)||c(g.filter));b._setter=null;b.fnGetData=function(a,b,c){var d=k(a,b,p,c);return l&&b?l(d,b,a,c):d};b.fnSetData=function(a,b,c){return Q(g)(a,b,c)};"number"!==typeof g&&(a._rowReadObject=!0);a.oFeatures.bSort||(b.bSortable=!1,e.addClass(d.sSortableNone));a=-1!==f.inArray("asc",b.asSorting);c=-1!==f.inArray("desc",b.asSorting);b.bSortable&&(a||c)?a&&!c?(b.sSortingClass=
d.sSortableAsc,b.sSortingClassJUI=d.sSortJUIAscAllowed):!a&&c?(b.sSortingClass=d.sSortableDesc,b.sSortingClassJUI=d.sSortJUIDescAllowed):(b.sSortingClass=d.sSortable,b.sSortingClassJUI=d.sSortJUI):(b.sSortingClass=d.sSortableNone,b.sSortingClassJUI="")}function aa(a){if(!1!==a.oFeatures.bAutoWidth){var b=a.aoColumns;Ja(a);for(var c=0,d=b.length;c<d;c++)b[c].nTh.style.width=b[c].sWidth}b=a.oScroll;""===b.sY&&""===b.sX||na(a);A(a,null,"column-sizing",[a])}function ba(a,b){a=oa(a,"bVisible");return"number"===
typeof a[b]?a[b]:null}function ca(a,b){a=oa(a,"bVisible");b=f.inArray(b,a);return-1!==b?b:null}function W(a){var b=0;f.each(a.aoColumns,function(a,d){d.bVisible&&"none"!==f(d.nTh).css("display")&&b++});return b}function oa(a,b){var c=[];f.map(a.aoColumns,function(a,e){a[b]&&c.push(e)});return c}function Ka(a){var b=a.aoColumns,c=a.aoData,d=q.ext.type.detect,e,h,g;var k=0;for(e=b.length;k<e;k++){var f=b[k];var n=[];if(!f.sType&&f._sManualType)f.sType=f._sManualType;else if(!f.sType){var m=0;for(h=
d.length;m<h;m++){var w=0;for(g=c.length;w<g;w++){n[w]===p&&(n[w]=I(a,w,k,"type"));var u=d[m](n[w],a);if(!u&&m!==d.length-1)break;if("html"===u)break}if(u){f.sType=u;break}}f.sType||(f.sType="string")}}}function nb(a,b,c,d){var e,h,g,k=a.aoColumns;if(b)for(e=b.length-1;0<=e;e--){var l=b[e];var n=l.targets!==p?l.targets:l.aTargets;f.isArray(n)||(n=[n]);var m=0;for(h=n.length;m<h;m++)if("number"===typeof n[m]&&0<=n[m]){for(;k.length<=n[m];)Ia(a);d(n[m],l)}else if("number"===typeof n[m]&&0>n[m])d(k.length+
n[m],l);else if("string"===typeof n[m]){var w=0;for(g=k.length;w<g;w++)("_all"==n[m]||f(k[w].nTh).hasClass(n[m]))&&d(w,l)}}if(c)for(e=0,a=c.length;e<a;e++)d(e,c[e])}function R(a,b,c,d){var e=a.aoData.length,h=f.extend(!0,{},q.models.oRow,{src:c?"dom":"data",idx:e});h._aData=b;a.aoData.push(h);for(var g=a.aoColumns,k=0,l=g.length;k<l;k++)g[k].sType=null;a.aiDisplayMaster.push(e);b=a.rowIdFn(b);b!==p&&(a.aIds[b]=h);!c&&a.oFeatures.bDeferRender||La(a,e,c,d);return e}function pa(a,b){var c;b instanceof
f||(b=f(b));return b.map(function(b,e){c=Ma(a,e);return R(a,c.data,e,c.cells)})}function I(a,b,c,d){var e=a.iDraw,h=a.aoColumns[c],g=a.aoData[b]._aData,k=h.sDefaultContent,f=h.fnGetData(g,d,{settings:a,row:b,col:c});if(f===p)return a.iDrawError!=e&&null===k&&(O(a,0,"Requested unknown parameter "+("function"==typeof h.mData?"{function}":"'"+h.mData+"'")+" for row "+b+", column "+c,4),a.iDrawError=e),k;if((f===g||null===f)&&null!==k&&d!==p)f=k;else if("function"===typeof f)return f.call(g);return null===
f&&"display"==d?"":f}function ob(a,b,c,d){a.aoColumns[c].fnSetData(a.aoData[b]._aData,d,{settings:a,row:b,col:c})}function Na(a){return f.map(a.match(/(\\.|[^\.])+/g)||[""],function(a){return a.replace(/\\\./g,".")})}function U(a){if(f.isPlainObject(a)){var b={};f.each(a,function(a,c){c&&(b[a]=U(c))});return function(a,c,h,g){var d=b[c]||b._;return d!==p?d(a,c,h,g):a}}if(null===a)return function(a){return a};if("function"===typeof a)return function(b,c,h,g){return a(b,c,h,g)};if("string"!==typeof a||
-1===a.indexOf(".")&&-1===a.indexOf("[")&&-1===a.indexOf("("))return function(b,c){return b[a]};var c=function(a,b,h){if(""!==h){var d=Na(h);for(var e=0,l=d.length;e<l;e++){h=d[e].match(da);var n=d[e].match(X);if(h){d[e]=d[e].replace(da,"");""!==d[e]&&(a=a[d[e]]);n=[];d.splice(0,e+1);d=d.join(".");if(f.isArray(a))for(e=0,l=a.length;e<l;e++)n.push(c(a[e],b,d));a=h[0].substring(1,h[0].length-1);a=""===a?n:n.join(a);break}else if(n){d[e]=d[e].replace(X,"");a=a[d[e]]();continue}if(null===a||a[d[e]]===
p)return p;a=a[d[e]]}}return a};return function(b,e){return c(b,e,a)}}function Q(a){if(f.isPlainObject(a))return Q(a._);if(null===a)return function(){};if("function"===typeof a)return function(b,d,e){a(b,"set",d,e)};if("string"!==typeof a||-1===a.indexOf(".")&&-1===a.indexOf("[")&&-1===a.indexOf("("))return function(b,d){b[a]=d};var b=function(a,d,e){e=Na(e);var c=e[e.length-1];for(var g,k,l=0,n=e.length-1;l<n;l++){g=e[l].match(da);k=e[l].match(X);if(g){e[l]=e[l].replace(da,"");a[e[l]]=[];c=e.slice();
c.splice(0,l+1);g=c.join(".");if(f.isArray(d))for(k=0,n=d.length;k<n;k++)c={},b(c,d[k],g),a[e[l]].push(c);else a[e[l]]=d;return}k&&(e[l]=e[l].replace(X,""),a=a[e[l]](d));if(null===a[e[l]]||a[e[l]]===p)a[e[l]]={};a=a[e[l]]}if(c.match(X))a[c.replace(X,"")](d);else a[c.replace(da,"")]=d};return function(c,d){return b(c,d,a)}}function Oa(a){return J(a.aoData,"_aData")}function qa(a){a.aoData.length=0;a.aiDisplayMaster.length=0;a.aiDisplay.length=0;a.aIds={}}function ra(a,b,c){for(var d=-1,e=0,h=a.length;e<
h;e++)a[e]==b?d=e:a[e]>b&&a[e]--; -1!=d&&c===p&&a.splice(d,1)}function ea(a,b,c,d){var e=a.aoData[b],h,g=function(c,d){for(;c.childNodes.length;)c.removeChild(c.firstChild);c.innerHTML=I(a,b,d,"display")};if("dom"!==c&&(c&&"auto"!==c||"dom"!==e.src)){var k=e.anCells;if(k)if(d!==p)g(k[d],d);else for(c=0,h=k.length;c<h;c++)g(k[c],c)}else e._aData=Ma(a,e,d,d===p?p:e._aData).data;e._aSortData=null;e._aFilterData=null;g=a.aoColumns;if(d!==p)g[d].sType=null;else{c=0;for(h=g.length;c<h;c++)g[c].sType=null;
Pa(a,e)}}function Ma(a,b,c,d){var e=[],h=b.firstChild,g,k=0,l,n=a.aoColumns,m=a._rowReadObject;d=d!==p?d:m?{}:[];var w=function(a,b){if("string"===typeof a){var c=a.indexOf("@");-1!==c&&(c=a.substring(c+1),Q(a)(d,b.getAttribute(c)))}},u=function(a){if(c===p||c===k)g=n[k],l=f.trim(a.innerHTML),g&&g._bAttrSrc?(Q(g.mData._)(d,l),w(g.mData.sort,a),w(g.mData.type,a),w(g.mData.filter,a)):m?(g._setter||(g._setter=Q(g.mData)),g._setter(d,l)):d[k]=l;k++};if(h)for(;h;){var q=h.nodeName.toUpperCase();if("TD"==
q||"TH"==q)u(h),e.push(h);h=h.nextSibling}else for(e=b.anCells,h=0,q=e.length;h<q;h++)u(e[h]);(b=b.firstChild?b:b.nTr)&&(b=b.getAttribute("id"))&&Q(a.rowId)(d,b);return{data:d,cells:e}}function La(a,b,c,d){var e=a.aoData[b],h=e._aData,g=[],k,l;if(null===e.nTr){var n=c||y.createElement("tr");e.nTr=n;e.anCells=g;n._DT_RowIndex=b;Pa(a,e);var m=0;for(k=a.aoColumns.length;m<k;m++){var w=a.aoColumns[m];var p=(l=c?!1:!0)?y.createElement(w.sCellType):d[m];p._DT_CellIndex={row:b,column:m};g.push(p);if(l||
!(c&&!w.mRender&&w.mData===m||f.isPlainObject(w.mData)&&w.mData._===m+".display"))p.innerHTML=I(a,b,m,"display");w.sClass&&(p.className+=" "+w.sClass);w.bVisible&&!c?n.appendChild(p):!w.bVisible&&c&&p.parentNode.removeChild(p);w.fnCreatedCell&&w.fnCreatedCell.call(a.oInstance,p,I(a,b,m),h,b,m)}A(a,"aoRowCreatedCallback",null,[n,h,b,g])}e.nTr.setAttribute("role","row")}function Pa(a,b){var c=b.nTr,d=b._aData;if(c){if(a=a.rowIdFn(d))c.id=a;d.DT_RowClass&&(a=d.DT_RowClass.split(" "),b.__rowc=b.__rowc?
ta(b.__rowc.concat(a)):a,f(c).removeClass(b.__rowc.join(" ")).addClass(d.DT_RowClass));d.DT_RowAttr&&f(c).attr(d.DT_RowAttr);d.DT_RowData&&f(c).data(d.DT_RowData)}}function pb(a){var b,c,d=a.nTHead,e=a.nTFoot,h=0===f("th, td",d).length,g=a.oClasses,k=a.aoColumns;h&&(c=f("<tr/>").appendTo(d));var l=0;for(b=k.length;l<b;l++){var n=k[l];var m=f(n.nTh).addClass(n.sClass);h&&m.appendTo(c);a.oFeatures.bSort&&(m.addClass(n.sSortingClass),!1!==n.bSortable&&(m.attr("tabindex",a.iTabIndex).attr("aria-controls",
a.sTableId),Qa(a,n.nTh,l)));n.sTitle!=m[0].innerHTML&&m.html(n.sTitle);Ra(a,"header")(a,m,n,g)}h&&fa(a.aoHeader,d);f(d).find(">tr").attr("role","row");f(d).find(">tr>th, >tr>td").addClass(g.sHeaderTH);f(e).find(">tr>th, >tr>td").addClass(g.sFooterTH);if(null!==e)for(a=a.aoFooter[0],l=0,b=a.length;l<b;l++)n=k[l],n.nTf=a[l].cell,n.sClass&&f(n.nTf).addClass(n.sClass)}function ha(a,b,c){var d,e,h=[],g=[],k=a.aoColumns.length;if(b){c===p&&(c=!1);var l=0;for(d=b.length;l<d;l++){h[l]=b[l].slice();h[l].nTr=
b[l].nTr;for(e=k-1;0<=e;e--)a.aoColumns[e].bVisible||c||h[l].splice(e,1);g.push([])}l=0;for(d=h.length;l<d;l++){if(a=h[l].nTr)for(;e=a.firstChild;)a.removeChild(e);e=0;for(b=h[l].length;e<b;e++){var n=k=1;if(g[l][e]===p){a.appendChild(h[l][e].cell);for(g[l][e]=1;h[l+k]!==p&&h[l][e].cell==h[l+k][e].cell;)g[l+k][e]=1,k++;for(;h[l][e+n]!==p&&h[l][e].cell==h[l][e+n].cell;){for(c=0;c<k;c++)g[l+c][e+n]=1;n++}f(h[l][e].cell).attr("rowspan",k).attr("colspan",n)}}}}}function S(a){var b=A(a,"aoPreDrawCallback",
"preDraw",[a]);if(-1!==f.inArray(!1,b))K(a,!1);else{b=[];var c=0,d=a.asStripeClasses,e=d.length,h=a.oLanguage,g=a.iInitDisplayStart,k="ssp"==D(a),l=a.aiDisplay;a.bDrawing=!0;g!==p&&-1!==g&&(a._iDisplayStart=k?g:g>=a.fnRecordsDisplay()?0:g,a.iInitDisplayStart=-1);g=a._iDisplayStart;var n=a.fnDisplayEnd();if(a.bDeferLoading)a.bDeferLoading=!1,a.iDraw++,K(a,!1);else if(!k)a.iDraw++;else if(!a.bDestroying&&!qb(a))return;if(0!==l.length)for(h=k?a.aoData.length:n,k=k?0:g;k<h;k++){var m=l[k],w=a.aoData[m];
null===w.nTr&&La(a,m);var u=w.nTr;if(0!==e){var q=d[c%e];w._sRowStripe!=q&&(f(u).removeClass(w._sRowStripe).addClass(q),w._sRowStripe=q)}A(a,"aoRowCallback",null,[u,w._aData,c,k,m]);b.push(u);c++}else c=h.sZeroRecords,1==a.iDraw&&"ajax"==D(a)?c=h.sLoadingRecords:h.sEmptyTable&&0===a.fnRecordsTotal()&&(c=h.sEmptyTable),b[0]=f("<tr/>",{"class":e?d[0]:""}).append(f("<td />",{valign:"top",colSpan:W(a),"class":a.oClasses.sRowEmpty}).html(c))[0];A(a,"aoHeaderCallback","header",[f(a.nTHead).children("tr")[0],
Oa(a),g,n,l]);A(a,"aoFooterCallback","footer",[f(a.nTFoot).children("tr")[0],Oa(a),g,n,l]);d=f(a.nTBody);d.children().detach();d.append(f(b));A(a,"aoDrawCallback","draw",[a]);a.bSorted=!1;a.bFiltered=!1;a.bDrawing=!1}}function V(a,b){var c=a.oFeatures,d=c.bFilter;c.bSort&&rb(a);d?ia(a,a.oPreviousSearch):a.aiDisplay=a.aiDisplayMaster.slice();!0!==b&&(a._iDisplayStart=0);a._drawHold=b;S(a);a._drawHold=!1}function sb(a){var b=a.oClasses,c=f(a.nTable);c=f("<div/>").insertBefore(c);var d=a.oFeatures,e=
f("<div/>",{id:a.sTableId+"_wrapper","class":b.sWrapper+(a.nTFoot?"":" "+b.sNoFooter)});a.nHolding=c[0];a.nTableWrapper=e[0];a.nTableReinsertBefore=a.nTable.nextSibling;for(var h=a.sDom.split(""),g,k,l,n,m,p,u=0;u<h.length;u++){g=null;k=h[u];if("<"==k){l=f("<div/>")[0];n=h[u+1];if("'"==n||'"'==n){m="";for(p=2;h[u+p]!=n;)m+=h[u+p],p++;"H"==m?m=b.sJUIHeader:"F"==m&&(m=b.sJUIFooter);-1!=m.indexOf(".")?(n=m.split("."),l.id=n[0].substr(1,n[0].length-1),l.className=n[1]):"#"==m.charAt(0)?l.id=m.substr(1,
m.length-1):l.className=m;u+=p}e.append(l);e=f(l)}else if(">"==k)e=e.parent();else if("l"==k&&d.bPaginate&&d.bLengthChange)g=tb(a);else if("f"==k&&d.bFilter)g=ub(a);else if("r"==k&&d.bProcessing)g=vb(a);else if("t"==k)g=wb(a);else if("i"==k&&d.bInfo)g=xb(a);else if("p"==k&&d.bPaginate)g=yb(a);else if(0!==q.ext.feature.length)for(l=q.ext.feature,p=0,n=l.length;p<n;p++)if(k==l[p].cFeature){g=l[p].fnInit(a);break}g&&(l=a.aanFeatures,l[k]||(l[k]=[]),l[k].push(g),e.append(g))}c.replaceWith(e);a.nHolding=
null}function fa(a,b){b=f(b).children("tr");var c,d,e;a.splice(0,a.length);var h=0;for(e=b.length;h<e;h++)a.push([]);h=0;for(e=b.length;h<e;h++){var g=b[h];for(c=g.firstChild;c;){if("TD"==c.nodeName.toUpperCase()||"TH"==c.nodeName.toUpperCase()){var k=1*c.getAttribute("colspan");var l=1*c.getAttribute("rowspan");k=k&&0!==k&&1!==k?k:1;l=l&&0!==l&&1!==l?l:1;var n=0;for(d=a[h];d[n];)n++;var m=n;var p=1===k?!0:!1;for(d=0;d<k;d++)for(n=0;n<l;n++)a[h+n][m+d]={cell:c,unique:p},a[h+n].nTr=g}c=c.nextSibling}}}
function ua(a,b,c){var d=[];c||(c=a.aoHeader,b&&(c=[],fa(c,b)));b=0;for(var e=c.length;b<e;b++)for(var h=0,g=c[b].length;h<g;h++)!c[b][h].unique||d[h]&&a.bSortCellsTop||(d[h]=c[b][h].cell);return d}function va(a,b,c){A(a,"aoServerParams","serverParams",[b]);if(b&&f.isArray(b)){var d={},e=/(.*?)\[\]$/;f.each(b,function(a,b){(a=b.name.match(e))?(a=a[0],d[a]||(d[a]=[]),d[a].push(b.value)):d[b.name]=b.value});b=d}var h=a.ajax,g=a.oInstance,k=function(b){A(a,null,"xhr",[a,b,a.jqXHR]);c(b)};if(f.isPlainObject(h)&&
h.data){var l=h.data;var n="function"===typeof l?l(b,a):l;b="function"===typeof l&&n?n:f.extend(!0,b,n);delete h.data}n={data:b,success:function(b){var c=b.error||b.sError;c&&O(a,0,c);a.json=b;k(b)},dataType:"json",cache:!1,type:a.sServerMethod,error:function(b,c,d){d=A(a,null,"xhr",[a,null,a.jqXHR]);-1===f.inArray(!0,d)&&("parsererror"==c?O(a,0,"Invalid JSON response",1):4===b.readyState&&O(a,0,"Ajax error",7));K(a,!1)}};a.oAjaxData=b;A(a,null,"preXhr",[a,b]);a.fnServerData?a.fnServerData.call(g,
a.sAjaxSource,f.map(b,function(a,b){return{name:b,value:a}}),k,a):a.sAjaxSource||"string"===typeof h?a.jqXHR=f.ajax(f.extend(n,{url:h||a.sAjaxSource})):"function"===typeof h?a.jqXHR=h.call(g,b,k,a):(a.jqXHR=f.ajax(f.extend(n,h)),h.data=l)}function qb(a){return a.bAjaxDataGet?(a.iDraw++,K(a,!0),va(a,zb(a),function(b){Ab(a,b)}),!1):!0}function zb(a){var b=a.aoColumns,c=b.length,d=a.oFeatures,e=a.oPreviousSearch,h=a.aoPreSearchCols,g=[],k=Y(a);var l=a._iDisplayStart;var n=!1!==d.bPaginate?a._iDisplayLength:
-1;var m=function(a,b){g.push({name:a,value:b})};m("sEcho",a.iDraw);m("iColumns",c);m("sColumns",J(b,"sName").join(","));m("iDisplayStart",l);m("iDisplayLength",n);var p={draw:a.iDraw,columns:[],order:[],start:l,length:n,search:{value:e.sSearch,regex:e.bRegex}};for(l=0;l<c;l++){var u=b[l];var sa=h[l];n="function"==typeof u.mData?"function":u.mData;p.columns.push({data:n,name:u.sName,searchable:u.bSearchable,orderable:u.bSortable,search:{value:sa.sSearch,regex:sa.bRegex}});m("mDataProp_"+l,n);d.bFilter&&
(m("sSearch_"+l,sa.sSearch),m("bRegex_"+l,sa.bRegex),m("bSearchable_"+l,u.bSearchable));d.bSort&&m("bSortable_"+l,u.bSortable)}d.bFilter&&(m("sSearch",e.sSearch),m("bRegex",e.bRegex));d.bSort&&(f.each(k,function(a,b){p.order.push({column:b.col,dir:b.dir});m("iSortCol_"+a,b.col);m("sSortDir_"+a,b.dir)}),m("iSortingCols",k.length));b=q.ext.legacy.ajax;return null===b?a.sAjaxSource?g:p:b?g:p}function Ab(a,b){var c=function(a,c){return b[a]!==p?b[a]:b[c]},d=wa(a,b),e=c("sEcho","draw"),h=c("iTotalRecords",
"recordsTotal");c=c("iTotalDisplayRecords","recordsFiltered");if(e){if(1*e<a.iDraw)return;a.iDraw=1*e}qa(a);a._iRecordsTotal=parseInt(h,10);a._iRecordsDisplay=parseInt(c,10);e=0;for(h=d.length;e<h;e++)R(a,d[e]);a.aiDisplay=a.aiDisplayMaster.slice();a.bAjaxDataGet=!1;S(a);a._bInitComplete||xa(a,b);a.bAjaxDataGet=!0;K(a,!1)}function wa(a,b){a=f.isPlainObject(a.ajax)&&a.ajax.dataSrc!==p?a.ajax.dataSrc:a.sAjaxDataProp;return"data"===a?b.aaData||b[a]:""!==a?U(a)(b):b}function ub(a){var b=a.oClasses,c=
a.sTableId,d=a.oLanguage,e=a.oPreviousSearch,h=a.aanFeatures,g='<input type="search" class="'+b.sFilterInput+'"/>',k=d.sSearch;k=k.match(/_INPUT_/)?k.replace("_INPUT_",g):k+g;b=f("<div/>",{id:h.f?null:c+"_filter","class":b.sFilter}).append(f("<label/>").append(k));h=function(){var b=this.value?this.value:"";b!=e.sSearch&&(ia(a,{sSearch:b,bRegex:e.bRegex,bSmart:e.bSmart,bCaseInsensitive:e.bCaseInsensitive}),a._iDisplayStart=0,S(a))};g=null!==a.searchDelay?a.searchDelay:"ssp"===D(a)?400:0;var l=f("input",
b).val(e.sSearch).attr("placeholder",d.sSearchPlaceholder).on("keyup.DT search.DT input.DT paste.DT cut.DT",g?Sa(h,g):h).on("keypress.DT",function(a){if(13==a.keyCode)return!1}).attr("aria-controls",c);f(a.nTable).on("search.dt.DT",function(b,c){if(a===c)try{l[0]!==y.activeElement&&l.val(e.sSearch)}catch(w){}});return b[0]}function ia(a,b,c){var d=a.oPreviousSearch,e=a.aoPreSearchCols,h=function(a){d.sSearch=a.sSearch;d.bRegex=a.bRegex;d.bSmart=a.bSmart;d.bCaseInsensitive=a.bCaseInsensitive},g=function(a){return a.bEscapeRegex!==
p?!a.bEscapeRegex:a.bRegex};Ka(a);if("ssp"!=D(a)){Bb(a,b.sSearch,c,g(b),b.bSmart,b.bCaseInsensitive);h(b);for(b=0;b<e.length;b++)Cb(a,e[b].sSearch,b,g(e[b]),e[b].bSmart,e[b].bCaseInsensitive);Db(a)}else h(b);a.bFiltered=!0;A(a,null,"search",[a])}function Db(a){for(var b=q.ext.search,c=a.aiDisplay,d,e,h=0,g=b.length;h<g;h++){for(var k=[],l=0,n=c.length;l<n;l++)e=c[l],d=a.aoData[e],b[h](a,d._aFilterData,e,d._aData,l)&&k.push(e);c.length=0;f.merge(c,k)}}function Cb(a,b,c,d,e,h){if(""!==b){var g=[],k=
a.aiDisplay;d=Ta(b,d,e,h);for(e=0;e<k.length;e++)b=a.aoData[k[e]]._aFilterData[c],d.test(b)&&g.push(k[e]);a.aiDisplay=g}}function Bb(a,b,c,d,e,h){e=Ta(b,d,e,h);var g=a.oPreviousSearch.sSearch,k=a.aiDisplayMaster;h=[];0!==q.ext.search.length&&(c=!0);var f=Eb(a);if(0>=b.length)a.aiDisplay=k.slice();else{if(f||c||d||g.length>b.length||0!==b.indexOf(g)||a.bSorted)a.aiDisplay=k.slice();b=a.aiDisplay;for(c=0;c<b.length;c++)e.test(a.aoData[b[c]]._sFilterRow)&&h.push(b[c]);a.aiDisplay=h}}function Ta(a,b,
c,d){a=b?a:Ua(a);c&&(a="^(?=.*?"+f.map(a.match(/"[^"]+"|[^ ]+/g)||[""],function(a){if('"'===a.charAt(0)){var b=a.match(/^"(.*)"$/);a=b?b[1]:a}return a.replace('"',"")}).join(")(?=.*?")+").*$");return new RegExp(a,d?"i":"")}function Eb(a){var b=a.aoColumns,c,d,e=q.ext.type.search;var h=!1;var g=0;for(c=a.aoData.length;g<c;g++){var k=a.aoData[g];if(!k._aFilterData){var f=[];var n=0;for(d=b.length;n<d;n++){h=b[n];if(h.bSearchable){var m=I(a,g,n,"filter");e[h.sType]&&(m=e[h.sType](m));null===m&&(m="");
"string"!==typeof m&&m.toString&&(m=m.toString())}else m="";m.indexOf&&-1!==m.indexOf("&")&&(ya.innerHTML=m,m=$b?ya.textContent:ya.innerText);m.replace&&(m=m.replace(/[\r\n\u2028]/g,""));f.push(m)}k._aFilterData=f;k._sFilterRow=f.join(" ");h=!0}}return h}function Fb(a){return{search:a.sSearch,smart:a.bSmart,regex:a.bRegex,caseInsensitive:a.bCaseInsensitive}}function Gb(a){return{sSearch:a.search,bSmart:a.smart,bRegex:a.regex,bCaseInsensitive:a.caseInsensitive}}function xb(a){var b=a.sTableId,c=a.aanFeatures.i,
d=f("<div/>",{"class":a.oClasses.sInfo,id:c?null:b+"_info"});c||(a.aoDrawCallback.push({fn:Hb,sName:"information"}),d.attr("role","status").attr("aria-live","polite"),f(a.nTable).attr("aria-describedby",b+"_info"));return d[0]}function Hb(a){var b=a.aanFeatures.i;if(0!==b.length){var c=a.oLanguage,d=a._iDisplayStart+1,e=a.fnDisplayEnd(),h=a.fnRecordsTotal(),g=a.fnRecordsDisplay(),k=g?c.sInfo:c.sInfoEmpty;g!==h&&(k+=" "+c.sInfoFiltered);k+=c.sInfoPostFix;k=Ib(a,k);c=c.fnInfoCallback;null!==c&&(k=c.call(a.oInstance,
a,d,e,h,g,k));f(b).html(k)}}function Ib(a,b){var c=a.fnFormatNumber,d=a._iDisplayStart+1,e=a._iDisplayLength,h=a.fnRecordsDisplay(),g=-1===e;return b.replace(/_START_/g,c.call(a,d)).replace(/_END_/g,c.call(a,a.fnDisplayEnd())).replace(/_MAX_/g,c.call(a,a.fnRecordsTotal())).replace(/_TOTAL_/g,c.call(a,h)).replace(/_PAGE_/g,c.call(a,g?1:Math.ceil(d/e))).replace(/_PAGES_/g,c.call(a,g?1:Math.ceil(h/e)))}function ja(a){var b=a.iInitDisplayStart,c=a.aoColumns;var d=a.oFeatures;var e=a.bDeferLoading;if(a.bInitialised){sb(a);
pb(a);ha(a,a.aoHeader);ha(a,a.aoFooter);K(a,!0);d.bAutoWidth&&Ja(a);var h=0;for(d=c.length;h<d;h++){var g=c[h];g.sWidth&&(g.nTh.style.width=B(g.sWidth))}A(a,null,"preInit",[a]);V(a);c=D(a);if("ssp"!=c||e)"ajax"==c?va(a,[],function(c){var d=wa(a,c);for(h=0;h<d.length;h++)R(a,d[h]);a.iInitDisplayStart=b;V(a);K(a,!1);xa(a,c)},a):(K(a,!1),xa(a))}else setTimeout(function(){ja(a)},200)}function xa(a,b){a._bInitComplete=!0;(b||a.oInit.aaData)&&aa(a);A(a,null,"plugin-init",[a,b]);A(a,"aoInitComplete","init",
[a,b])}function Va(a,b){b=parseInt(b,10);a._iDisplayLength=b;Wa(a);A(a,null,"length",[a,b])}function tb(a){var b=a.oClasses,c=a.sTableId,d=a.aLengthMenu,e=f.isArray(d[0]),h=e?d[0]:d;d=e?d[1]:d;e=f("<select/>",{name:c+"_length","aria-controls":c,"class":b.sLengthSelect});for(var g=0,k=h.length;g<k;g++)e[0][g]=new Option("number"===typeof d[g]?a.fnFormatNumber(d[g]):d[g],h[g]);var l=f("<div><label/></div>").addClass(b.sLength);a.aanFeatures.l||(l[0].id=c+"_length");l.children().append(a.oLanguage.sLengthMenu.replace("_MENU_",
e[0].outerHTML));f("select",l).val(a._iDisplayLength).on("change.DT",function(b){Va(a,f(this).val());S(a)});f(a.nTable).on("length.dt.DT",function(b,c,d){a===c&&f("select",l).val(d)});return l[0]}function yb(a){var b=a.sPaginationType,c=q.ext.pager[b],d="function"===typeof c,e=function(a){S(a)};b=f("<div/>").addClass(a.oClasses.sPaging+b)[0];var h=a.aanFeatures;d||c.fnInit(a,b,e);h.p||(b.id=a.sTableId+"_paginate",a.aoDrawCallback.push({fn:function(a){if(d){var b=a._iDisplayStart,g=a._iDisplayLength,
f=a.fnRecordsDisplay(),m=-1===g;b=m?0:Math.ceil(b/g);g=m?1:Math.ceil(f/g);f=c(b,g);var p;m=0;for(p=h.p.length;m<p;m++)Ra(a,"pageButton")(a,h.p[m],m,f,b,g)}else c.fnUpdate(a,e)},sName:"pagination"}));return b}function Xa(a,b,c){var d=a._iDisplayStart,e=a._iDisplayLength,h=a.fnRecordsDisplay();0===h||-1===e?d=0:"number"===typeof b?(d=b*e,d>h&&(d=0)):"first"==b?d=0:"previous"==b?(d=0<=e?d-e:0,0>d&&(d=0)):"next"==b?d+e<h&&(d+=e):"last"==b?d=Math.floor((h-1)/e)*e:O(a,0,"Unknown paging action: "+b,5);b=
a._iDisplayStart!==d;a._iDisplayStart=d;b&&(A(a,null,"page",[a]),c&&S(a));return b}function vb(a){return f("<div/>",{id:a.aanFeatures.r?null:a.sTableId+"_processing","class":a.oClasses.sProcessing}).html(a.oLanguage.sProcessing).insertBefore(a.nTable)[0]}function K(a,b){a.oFeatures.bProcessing&&f(a.aanFeatures.r).css("display",b?"block":"none");A(a,null,"processing",[a,b])}function wb(a){var b=f(a.nTable);b.attr("role","grid");var c=a.oScroll;if(""===c.sX&&""===c.sY)return a.nTable;var d=c.sX,e=c.sY,
h=a.oClasses,g=b.children("caption"),k=g.length?g[0]._captionSide:null,l=f(b[0].cloneNode(!1)),n=f(b[0].cloneNode(!1)),m=b.children("tfoot");m.length||(m=null);l=f("<div/>",{"class":h.sScrollWrapper}).append(f("<div/>",{"class":h.sScrollHead}).css({overflow:"hidden",position:"relative",border:0,width:d?d?B(d):null:"100%"}).append(f("<div/>",{"class":h.sScrollHeadInner}).css({"box-sizing":"content-box",width:c.sXInner||"100%"}).append(l.removeAttr("id").css("margin-left",0).append("top"===k?g:null).append(b.children("thead"))))).append(f("<div/>",
{"class":h.sScrollBody}).css({position:"relative",overflow:"auto",width:d?B(d):null}).append(b));m&&l.append(f("<div/>",{"class":h.sScrollFoot}).css({overflow:"hidden",border:0,width:d?d?B(d):null:"100%"}).append(f("<div/>",{"class":h.sScrollFootInner}).append(n.removeAttr("id").css("margin-left",0).append("bottom"===k?g:null).append(b.children("tfoot")))));b=l.children();var p=b[0];h=b[1];var u=m?b[2]:null;if(d)f(h).on("scroll.DT",function(a){a=this.scrollLeft;p.scrollLeft=a;m&&(u.scrollLeft=a)});
f(h).css(e&&c.bCollapse?"max-height":"height",e);a.nScrollHead=p;a.nScrollBody=h;a.nScrollFoot=u;a.aoDrawCallback.push({fn:na,sName:"scrolling"});return l[0]}function na(a){var b=a.oScroll,c=b.sX,d=b.sXInner,e=b.sY;b=b.iBarWidth;var h=f(a.nScrollHead),g=h[0].style,k=h.children("div"),l=k[0].style,n=k.children("table");k=a.nScrollBody;var m=f(k),w=k.style,u=f(a.nScrollFoot).children("div"),q=u.children("table"),t=f(a.nTHead),r=f(a.nTable),v=r[0],za=v.style,T=a.nTFoot?f(a.nTFoot):null,A=a.oBrowser,
x=A.bScrollOversize,ac=J(a.aoColumns,"nTh"),Ya=[],y=[],z=[],C=[],G,H=function(a){a=a.style;a.paddingTop="0";a.paddingBottom="0";a.borderTopWidth="0";a.borderBottomWidth="0";a.height=0};var D=k.scrollHeight>k.clientHeight;if(a.scrollBarVis!==D&&a.scrollBarVis!==p)a.scrollBarVis=D,aa(a);else{a.scrollBarVis=D;r.children("thead, tfoot").remove();if(T){var E=T.clone().prependTo(r);var F=T.find("tr");E=E.find("tr")}var I=t.clone().prependTo(r);t=t.find("tr");D=I.find("tr");I.find("th, td").removeAttr("tabindex");
c||(w.width="100%",h[0].style.width="100%");f.each(ua(a,I),function(b,c){G=ba(a,b);c.style.width=a.aoColumns[G].sWidth});T&&N(function(a){a.style.width=""},E);h=r.outerWidth();""===c?(za.width="100%",x&&(r.find("tbody").height()>k.offsetHeight||"scroll"==m.css("overflow-y"))&&(za.width=B(r.outerWidth()-b)),h=r.outerWidth()):""!==d&&(za.width=B(d),h=r.outerWidth());N(H,D);N(function(a){z.push(a.innerHTML);Ya.push(B(f(a).css("width")))},D);N(function(a,b){-1!==f.inArray(a,ac)&&(a.style.width=Ya[b])},
t);f(D).height(0);T&&(N(H,E),N(function(a){C.push(a.innerHTML);y.push(B(f(a).css("width")))},E),N(function(a,b){a.style.width=y[b]},F),f(E).height(0));N(function(a,b){a.innerHTML='<div class="dataTables_sizing">'+z[b]+"</div>";a.childNodes[0].style.height="0";a.childNodes[0].style.overflow="hidden";a.style.width=Ya[b]},D);T&&N(function(a,b){a.innerHTML='<div class="dataTables_sizing">'+C[b]+"</div>";a.childNodes[0].style.height="0";a.childNodes[0].style.overflow="hidden";a.style.width=y[b]},E);r.outerWidth()<
h?(F=k.scrollHeight>k.offsetHeight||"scroll"==m.css("overflow-y")?h+b:h,x&&(k.scrollHeight>k.offsetHeight||"scroll"==m.css("overflow-y"))&&(za.width=B(F-b)),""!==c&&""===d||O(a,1,"Possible column misalignment",6)):F="100%";w.width=B(F);g.width=B(F);T&&(a.nScrollFoot.style.width=B(F));!e&&x&&(w.height=B(v.offsetHeight+b));c=r.outerWidth();n[0].style.width=B(c);l.width=B(c);d=r.height()>k.clientHeight||"scroll"==m.css("overflow-y");e="padding"+(A.bScrollbarLeft?"Left":"Right");l[e]=d?b+"px":"0px";T&&
(q[0].style.width=B(c),u[0].style.width=B(c),u[0].style[e]=d?b+"px":"0px");r.children("colgroup").insertBefore(r.children("thead"));m.trigger("scroll");!a.bSorted&&!a.bFiltered||a._drawHold||(k.scrollTop=0)}}function N(a,b,c){for(var d=0,e=0,h=b.length,g,k;e<h;){g=b[e].firstChild;for(k=c?c[e].firstChild:null;g;)1===g.nodeType&&(c?a(g,k,d):a(g,d),d++),g=g.nextSibling,k=c?k.nextSibling:null;e++}}function Ja(a){var b=a.nTable,c=a.aoColumns,d=a.oScroll,e=d.sY,h=d.sX,g=d.sXInner,k=c.length,l=oa(a,"bVisible"),
n=f("th",a.nTHead),m=b.getAttribute("width"),p=b.parentNode,u=!1,q,t=a.oBrowser;d=t.bScrollOversize;(q=b.style.width)&&-1!==q.indexOf("%")&&(m=q);for(q=0;q<l.length;q++){var r=c[l[q]];null!==r.sWidth&&(r.sWidth=Jb(r.sWidthOrig,p),u=!0)}if(d||!u&&!h&&!e&&k==W(a)&&k==n.length)for(q=0;q<k;q++)l=ba(a,q),null!==l&&(c[l].sWidth=B(n.eq(q).width()));else{k=f(b).clone().css("visibility","hidden").removeAttr("id");k.find("tbody tr").remove();var v=f("<tr/>").appendTo(k.find("tbody"));k.find("thead, tfoot").remove();
k.append(f(a.nTHead).clone()).append(f(a.nTFoot).clone());k.find("tfoot th, tfoot td").css("width","");n=ua(a,k.find("thead")[0]);for(q=0;q<l.length;q++)r=c[l[q]],n[q].style.width=null!==r.sWidthOrig&&""!==r.sWidthOrig?B(r.sWidthOrig):"",r.sWidthOrig&&h&&f(n[q]).append(f("<div/>").css({width:r.sWidthOrig,margin:0,padding:0,border:0,height:1}));if(a.aoData.length)for(q=0;q<l.length;q++)u=l[q],r=c[u],f(Kb(a,u)).clone(!1).append(r.sContentPadding).appendTo(v);f("[name]",k).removeAttr("name");r=f("<div/>").css(h||
e?{position:"absolute",top:0,left:0,height:1,right:0,overflow:"hidden"}:{}).append(k).appendTo(p);h&&g?k.width(g):h?(k.css("width","auto"),k.removeAttr("width"),k.width()<p.clientWidth&&m&&k.width(p.clientWidth)):e?k.width(p.clientWidth):m&&k.width(m);for(q=e=0;q<l.length;q++)p=f(n[q]),g=p.outerWidth()-p.width(),p=t.bBounding?Math.ceil(n[q].getBoundingClientRect().width):p.outerWidth(),e+=p,c[l[q]].sWidth=B(p-g);b.style.width=B(e);r.remove()}m&&(b.style.width=B(m));!m&&!h||a._reszEvt||(b=function(){f(z).on("resize.DT-"+
a.sInstance,Sa(function(){aa(a)}))},d?setTimeout(b,1E3):b(),a._reszEvt=!0)}function Jb(a,b){if(!a)return 0;a=f("<div/>").css("width",B(a)).appendTo(b||y.body);b=a[0].offsetWidth;a.remove();return b}function Kb(a,b){var c=Lb(a,b);if(0>c)return null;var d=a.aoData[c];return d.nTr?d.anCells[b]:f("<td/>").html(I(a,c,b,"display"))[0]}function Lb(a,b){for(var c,d=-1,e=-1,h=0,g=a.aoData.length;h<g;h++)c=I(a,h,b,"display")+"",c=c.replace(bc,""),c=c.replace(/&nbsp;/g," "),c.length>d&&(d=c.length,e=h);return e}
function B(a){return null===a?"0px":"number"==typeof a?0>a?"0px":a+"px":a.match(/\d$/)?a+"px":a}function Y(a){var b=[],c=a.aoColumns;var d=a.aaSortingFixed;var e=f.isPlainObject(d);var h=[];var g=function(a){a.length&&!f.isArray(a[0])?h.push(a):f.merge(h,a)};f.isArray(d)&&g(d);e&&d.pre&&g(d.pre);g(a.aaSorting);e&&d.post&&g(d.post);for(a=0;a<h.length;a++){var k=h[a][0];g=c[k].aDataSort;d=0;for(e=g.length;d<e;d++){var l=g[d];var n=c[l].sType||"string";h[a]._idx===p&&(h[a]._idx=f.inArray(h[a][1],c[l].asSorting));
b.push({src:k,col:l,dir:h[a][1],index:h[a]._idx,type:n,formatter:q.ext.type.order[n+"-pre"]})}}return b}function rb(a){var b,c=[],d=q.ext.type.order,e=a.aoData,h=0,g=a.aiDisplayMaster;Ka(a);var k=Y(a);var f=0;for(b=k.length;f<b;f++){var n=k[f];n.formatter&&h++;Mb(a,n.col)}if("ssp"!=D(a)&&0!==k.length){f=0;for(b=g.length;f<b;f++)c[g[f]]=f;h===k.length?g.sort(function(a,b){var d,h=k.length,g=e[a]._aSortData,f=e[b]._aSortData;for(d=0;d<h;d++){var l=k[d];var m=g[l.col];var n=f[l.col];m=m<n?-1:m>n?1:0;
if(0!==m)return"asc"===l.dir?m:-m}m=c[a];n=c[b];return m<n?-1:m>n?1:0}):g.sort(function(a,b){var h,g=k.length,f=e[a]._aSortData,l=e[b]._aSortData;for(h=0;h<g;h++){var m=k[h];var n=f[m.col];var p=l[m.col];m=d[m.type+"-"+m.dir]||d["string-"+m.dir];n=m(n,p);if(0!==n)return n}n=c[a];p=c[b];return n<p?-1:n>p?1:0})}a.bSorted=!0}function Nb(a){var b=a.aoColumns,c=Y(a);a=a.oLanguage.oAria;for(var d=0,e=b.length;d<e;d++){var h=b[d];var g=h.asSorting;var k=h.sTitle.replace(/<.*?>/g,"");var f=h.nTh;f.removeAttribute("aria-sort");
h.bSortable&&(0<c.length&&c[0].col==d?(f.setAttribute("aria-sort","asc"==c[0].dir?"ascending":"descending"),h=g[c[0].index+1]||g[0]):h=g[0],k+="asc"===h?a.sSortAscending:a.sSortDescending);f.setAttribute("aria-label",k)}}function Za(a,b,c,d){var e=a.aaSorting,h=a.aoColumns[b].asSorting,g=function(a,b){var c=a._idx;c===p&&(c=f.inArray(a[1],h));return c+1<h.length?c+1:b?null:0};"number"===typeof e[0]&&(e=a.aaSorting=[e]);c&&a.oFeatures.bSortMulti?(c=f.inArray(b,J(e,"0")),-1!==c?(b=g(e[c],!0),null===
b&&1===e.length&&(b=0),null===b?e.splice(c,1):(e[c][1]=h[b],e[c]._idx=b)):(e.push([b,h[0],0]),e[e.length-1]._idx=0)):e.length&&e[0][0]==b?(b=g(e[0]),e.length=1,e[0][1]=h[b],e[0]._idx=b):(e.length=0,e.push([b,h[0]]),e[0]._idx=0);V(a);"function"==typeof d&&d(a)}function Qa(a,b,c,d){var e=a.aoColumns[c];$a(b,{},function(b){!1!==e.bSortable&&(a.oFeatures.bProcessing?(K(a,!0),setTimeout(function(){Za(a,c,b.shiftKey,d);"ssp"!==D(a)&&K(a,!1)},0)):Za(a,c,b.shiftKey,d))})}function Aa(a){var b=a.aLastSort,
c=a.oClasses.sSortColumn,d=Y(a),e=a.oFeatures,h;if(e.bSort&&e.bSortClasses){e=0;for(h=b.length;e<h;e++){var g=b[e].src;f(J(a.aoData,"anCells",g)).removeClass(c+(2>e?e+1:3))}e=0;for(h=d.length;e<h;e++)g=d[e].src,f(J(a.aoData,"anCells",g)).addClass(c+(2>e?e+1:3))}a.aLastSort=d}function Mb(a,b){var c=a.aoColumns[b],d=q.ext.order[c.sSortDataType],e;d&&(e=d.call(a.oInstance,a,b,ca(a,b)));for(var h,g=q.ext.type.order[c.sType+"-pre"],k=0,f=a.aoData.length;k<f;k++)if(c=a.aoData[k],c._aSortData||(c._aSortData=
[]),!c._aSortData[b]||d)h=d?e[k]:I(a,k,b,"sort"),c._aSortData[b]=g?g(h):h}function Ba(a){if(a.oFeatures.bStateSave&&!a.bDestroying){var b={time:+new Date,start:a._iDisplayStart,length:a._iDisplayLength,order:f.extend(!0,[],a.aaSorting),search:Fb(a.oPreviousSearch),columns:f.map(a.aoColumns,function(b,d){return{visible:b.bVisible,search:Fb(a.aoPreSearchCols[d])}})};A(a,"aoStateSaveParams","stateSaveParams",[a,b]);a.oSavedState=b;a.fnStateSaveCallback.call(a.oInstance,a,b)}}function Ob(a,b,c){var d,
e,h=a.aoColumns;b=function(b){if(b&&b.time){var g=A(a,"aoStateLoadParams","stateLoadParams",[a,b]);if(-1===f.inArray(!1,g)&&(g=a.iStateDuration,!(0<g&&b.time<+new Date-1E3*g||b.columns&&h.length!==b.columns.length))){a.oLoadedState=f.extend(!0,{},b);b.start!==p&&(a._iDisplayStart=b.start,a.iInitDisplayStart=b.start);b.length!==p&&(a._iDisplayLength=b.length);b.order!==p&&(a.aaSorting=[],f.each(b.order,function(b,c){a.aaSorting.push(c[0]>=h.length?[0,c[1]]:c)}));b.search!==p&&f.extend(a.oPreviousSearch,
Gb(b.search));if(b.columns)for(d=0,e=b.columns.length;d<e;d++)g=b.columns[d],g.visible!==p&&(h[d].bVisible=g.visible),g.search!==p&&f.extend(a.aoPreSearchCols[d],Gb(g.search));A(a,"aoStateLoaded","stateLoaded",[a,b])}}c()};if(a.oFeatures.bStateSave){var g=a.fnStateLoadCallback.call(a.oInstance,a,b);g!==p&&b(g)}else c()}function Ca(a){var b=q.settings;a=f.inArray(a,J(b,"nTable"));return-1!==a?b[a]:null}function O(a,b,c,d){c="DataTables warning: "+(a?"table id="+a.sTableId+" - ":"")+c;d&&(c+=". For more information about this error, please see http://datatables.net/tn/"+
d);if(b)z.console&&console.log&&console.log(c);else if(b=q.ext,b=b.sErrMode||b.errMode,a&&A(a,null,"error",[a,d,c]),"alert"==b)alert(c);else{if("throw"==b)throw Error(c);"function"==typeof b&&b(a,d,c)}}function M(a,b,c,d){f.isArray(c)?f.each(c,function(c,d){f.isArray(d)?M(a,b,d[0],d[1]):M(a,b,d)}):(d===p&&(d=c),b[c]!==p&&(a[d]=b[c]))}function ab(a,b,c){var d;for(d in b)if(b.hasOwnProperty(d)){var e=b[d];f.isPlainObject(e)?(f.isPlainObject(a[d])||(a[d]={}),f.extend(!0,a[d],e)):c&&"data"!==d&&"aaData"!==
d&&f.isArray(e)?a[d]=e.slice():a[d]=e}return a}function $a(a,b,c){f(a).on("click.DT",b,function(b){f(a).blur();c(b)}).on("keypress.DT",b,function(a){13===a.which&&(a.preventDefault(),c(a))}).on("selectstart.DT",function(){return!1})}function E(a,b,c,d){c&&a[b].push({fn:c,sName:d})}function A(a,b,c,d){var e=[];b&&(e=f.map(a[b].slice().reverse(),function(b,c){return b.fn.apply(a.oInstance,d)}));null!==c&&(b=f.Event(c+".dt"),f(a.nTable).trigger(b,d),e.push(b.result));return e}function Wa(a){var b=a._iDisplayStart,
c=a.fnDisplayEnd(),d=a._iDisplayLength;b>=c&&(b=c-d);b-=b%d;if(-1===d||0>b)b=0;a._iDisplayStart=b}function Ra(a,b){a=a.renderer;var c=q.ext.renderer[b];return f.isPlainObject(a)&&a[b]?c[a[b]]||c._:"string"===typeof a?c[a]||c._:c._}function D(a){return a.oFeatures.bServerSide?"ssp":a.ajax||a.sAjaxSource?"ajax":"dom"}function ka(a,b){var c=Pb.numbers_length,d=Math.floor(c/2);b<=c?a=Z(0,b):a<=d?(a=Z(0,c-2),a.push("ellipsis"),a.push(b-1)):(a>=b-1-d?a=Z(b-(c-2),b):(a=Z(a-d+2,a+d-1),a.push("ellipsis"),
a.push(b-1)),a.splice(0,0,"ellipsis"),a.splice(0,0,0));a.DT_el="span";return a}function Ha(a){f.each({num:function(b){return Da(b,a)},"num-fmt":function(b){return Da(b,a,bb)},"html-num":function(b){return Da(b,a,Ea)},"html-num-fmt":function(b){return Da(b,a,Ea,bb)}},function(b,c){C.type.order[b+a+"-pre"]=c;b.match(/^html\-/)&&(C.type.search[b+a]=C.type.search.html)})}function Qb(a){return function(){var b=[Ca(this[q.ext.iApiIndex])].concat(Array.prototype.slice.call(arguments));return q.ext.internal[a].apply(this,
b)}}var q=function(a){this.$=function(a,b){return this.api(!0).$(a,b)};this._=function(a,b){return this.api(!0).rows(a,b).data()};this.api=function(a){return a?new v(Ca(this[C.iApiIndex])):new v(this)};this.fnAddData=function(a,b){var c=this.api(!0);a=f.isArray(a)&&(f.isArray(a[0])||f.isPlainObject(a[0]))?c.rows.add(a):c.row.add(a);(b===p||b)&&c.draw();return a.flatten().toArray()};this.fnAdjustColumnSizing=function(a){var b=this.api(!0).columns.adjust(),c=b.settings()[0],d=c.oScroll;a===p||a?b.draw(!1):
(""!==d.sX||""!==d.sY)&&na(c)};this.fnClearTable=function(a){var b=this.api(!0).clear();(a===p||a)&&b.draw()};this.fnClose=function(a){this.api(!0).row(a).child.hide()};this.fnDeleteRow=function(a,b,c){var d=this.api(!0);a=d.rows(a);var e=a.settings()[0],h=e.aoData[a[0][0]];a.remove();b&&b.call(this,e,h);(c===p||c)&&d.draw();return h};this.fnDestroy=function(a){this.api(!0).destroy(a)};this.fnDraw=function(a){this.api(!0).draw(a)};this.fnFilter=function(a,b,c,d,e,f){e=this.api(!0);null===b||b===p?
e.search(a,c,d,f):e.column(b).search(a,c,d,f);e.draw()};this.fnGetData=function(a,b){var c=this.api(!0);if(a!==p){var d=a.nodeName?a.nodeName.toLowerCase():"";return b!==p||"td"==d||"th"==d?c.cell(a,b).data():c.row(a).data()||null}return c.data().toArray()};this.fnGetNodes=function(a){var b=this.api(!0);return a!==p?b.row(a).node():b.rows().nodes().flatten().toArray()};this.fnGetPosition=function(a){var b=this.api(!0),c=a.nodeName.toUpperCase();return"TR"==c?b.row(a).index():"TD"==c||"TH"==c?(a=b.cell(a).index(),
[a.row,a.columnVisible,a.column]):null};this.fnIsOpen=function(a){return this.api(!0).row(a).child.isShown()};this.fnOpen=function(a,b,c){return this.api(!0).row(a).child(b,c).show().child()[0]};this.fnPageChange=function(a,b){a=this.api(!0).page(a);(b===p||b)&&a.draw(!1)};this.fnSetColumnVis=function(a,b,c){a=this.api(!0).column(a).visible(b);(c===p||c)&&a.columns.adjust().draw()};this.fnSettings=function(){return Ca(this[C.iApiIndex])};this.fnSort=function(a){this.api(!0).order(a).draw()};this.fnSortListener=
function(a,b,c){this.api(!0).order.listener(a,b,c)};this.fnUpdate=function(a,b,c,d,e){var h=this.api(!0);c===p||null===c?h.row(b).data(a):h.cell(b,c).data(a);(e===p||e)&&h.columns.adjust();(d===p||d)&&h.draw();return 0};this.fnVersionCheck=C.fnVersionCheck;var b=this,c=a===p,d=this.length;c&&(a={});this.oApi=this.internal=C.internal;for(var e in q.ext.internal)e&&(this[e]=Qb(e));this.each(function(){var e={},g=1<d?ab(e,a,!0):a,k=0,l;e=this.getAttribute("id");var n=!1,m=q.defaults,w=f(this);if("table"!=
this.nodeName.toLowerCase())O(null,0,"Non-table node initialisation ("+this.nodeName+")",2);else{jb(m);kb(m.column);L(m,m,!0);L(m.column,m.column,!0);L(m,f.extend(g,w.data()),!0);var u=q.settings;k=0;for(l=u.length;k<l;k++){var t=u[k];if(t.nTable==this||t.nTHead&&t.nTHead.parentNode==this||t.nTFoot&&t.nTFoot.parentNode==this){var v=g.bRetrieve!==p?g.bRetrieve:m.bRetrieve;if(c||v)return t.oInstance;if(g.bDestroy!==p?g.bDestroy:m.bDestroy){t.oInstance.fnDestroy();break}else{O(t,0,"Cannot reinitialise DataTable",
3);return}}if(t.sTableId==this.id){u.splice(k,1);break}}if(null===e||""===e)this.id=e="DataTables_Table_"+q.ext._unique++;var r=f.extend(!0,{},q.models.oSettings,{sDestroyWidth:w[0].style.width,sInstance:e,sTableId:e});r.nTable=this;r.oApi=b.internal;r.oInit=g;u.push(r);r.oInstance=1===b.length?b:w.dataTable();jb(g);Ga(g.oLanguage);g.aLengthMenu&&!g.iDisplayLength&&(g.iDisplayLength=f.isArray(g.aLengthMenu[0])?g.aLengthMenu[0][0]:g.aLengthMenu[0]);g=ab(f.extend(!0,{},m),g);M(r.oFeatures,g,"bPaginate bLengthChange bFilter bSort bSortMulti bInfo bProcessing bAutoWidth bSortClasses bServerSide bDeferRender".split(" "));
M(r,g,["asStripeClasses","ajax","fnServerData","fnFormatNumber","sServerMethod","aaSorting","aaSortingFixed","aLengthMenu","sPaginationType","sAjaxSource","sAjaxDataProp","iStateDuration","sDom","bSortCellsTop","iTabIndex","fnStateLoadCallback","fnStateSaveCallback","renderer","searchDelay","rowId",["iCookieDuration","iStateDuration"],["oSearch","oPreviousSearch"],["aoSearchCols","aoPreSearchCols"],["iDisplayLength","_iDisplayLength"]]);M(r.oScroll,g,[["sScrollX","sX"],["sScrollXInner","sXInner"],
["sScrollY","sY"],["bScrollCollapse","bCollapse"]]);M(r.oLanguage,g,"fnInfoCallback");E(r,"aoDrawCallback",g.fnDrawCallback,"user");E(r,"aoServerParams",g.fnServerParams,"user");E(r,"aoStateSaveParams",g.fnStateSaveParams,"user");E(r,"aoStateLoadParams",g.fnStateLoadParams,"user");E(r,"aoStateLoaded",g.fnStateLoaded,"user");E(r,"aoRowCallback",g.fnRowCallback,"user");E(r,"aoRowCreatedCallback",g.fnCreatedRow,"user");E(r,"aoHeaderCallback",g.fnHeaderCallback,"user");E(r,"aoFooterCallback",g.fnFooterCallback,
"user");E(r,"aoInitComplete",g.fnInitComplete,"user");E(r,"aoPreDrawCallback",g.fnPreDrawCallback,"user");r.rowIdFn=U(g.rowId);lb(r);var x=r.oClasses;f.extend(x,q.ext.classes,g.oClasses);w.addClass(x.sTable);r.iInitDisplayStart===p&&(r.iInitDisplayStart=g.iDisplayStart,r._iDisplayStart=g.iDisplayStart);null!==g.iDeferLoading&&(r.bDeferLoading=!0,e=f.isArray(g.iDeferLoading),r._iRecordsDisplay=e?g.iDeferLoading[0]:g.iDeferLoading,r._iRecordsTotal=e?g.iDeferLoading[1]:g.iDeferLoading);var y=r.oLanguage;
f.extend(!0,y,g.oLanguage);y.sUrl&&(f.ajax({dataType:"json",url:y.sUrl,success:function(a){Ga(a);L(m.oLanguage,a);f.extend(!0,y,a);ja(r)},error:function(){ja(r)}}),n=!0);null===g.asStripeClasses&&(r.asStripeClasses=[x.sStripeOdd,x.sStripeEven]);e=r.asStripeClasses;var z=w.children("tbody").find("tr").eq(0);-1!==f.inArray(!0,f.map(e,function(a,b){return z.hasClass(a)}))&&(f("tbody tr",this).removeClass(e.join(" ")),r.asDestroyStripes=e.slice());e=[];u=this.getElementsByTagName("thead");0!==u.length&&
(fa(r.aoHeader,u[0]),e=ua(r));if(null===g.aoColumns)for(u=[],k=0,l=e.length;k<l;k++)u.push(null);else u=g.aoColumns;k=0;for(l=u.length;k<l;k++)Ia(r,e?e[k]:null);nb(r,g.aoColumnDefs,u,function(a,b){ma(r,a,b)});if(z.length){var B=function(a,b){return null!==a.getAttribute("data-"+b)?b:null};f(z[0]).children("th, td").each(function(a,b){var c=r.aoColumns[a];if(c.mData===a){var d=B(b,"sort")||B(b,"order");b=B(b,"filter")||B(b,"search");if(null!==d||null!==b)c.mData={_:a+".display",sort:null!==d?a+".@data-"+
d:p,type:null!==d?a+".@data-"+d:p,filter:null!==b?a+".@data-"+b:p},ma(r,a)}})}var C=r.oFeatures;e=function(){if(g.aaSorting===p){var a=r.aaSorting;k=0;for(l=a.length;k<l;k++)a[k][1]=r.aoColumns[k].asSorting[0]}Aa(r);C.bSort&&E(r,"aoDrawCallback",function(){if(r.bSorted){var a=Y(r),b={};f.each(a,function(a,c){b[c.src]=c.dir});A(r,null,"order",[r,a,b]);Nb(r)}});E(r,"aoDrawCallback",function(){(r.bSorted||"ssp"===D(r)||C.bDeferRender)&&Aa(r)},"sc");a=w.children("caption").each(function(){this._captionSide=
f(this).css("caption-side")});var b=w.children("thead");0===b.length&&(b=f("<thead/>").appendTo(w));r.nTHead=b[0];b=w.children("tbody");0===b.length&&(b=f("<tbody/>").appendTo(w));r.nTBody=b[0];b=w.children("tfoot");0===b.length&&0<a.length&&(""!==r.oScroll.sX||""!==r.oScroll.sY)&&(b=f("<tfoot/>").appendTo(w));0===b.length||0===b.children().length?w.addClass(x.sNoFooter):0<b.length&&(r.nTFoot=b[0],fa(r.aoFooter,r.nTFoot));if(g.aaData)for(k=0;k<g.aaData.length;k++)R(r,g.aaData[k]);else(r.bDeferLoading||
"dom"==D(r))&&pa(r,f(r.nTBody).children("tr"));r.aiDisplay=r.aiDisplayMaster.slice();r.bInitialised=!0;!1===n&&ja(r)};g.bStateSave?(C.bStateSave=!0,E(r,"aoDrawCallback",Ba,"state_save"),Ob(r,g,e)):e()}});b=null;return this},C,t,x,cb={},Rb=/[\r\n\u2028]/g,Ea=/<.*?>/g,cc=/^\d{2,4}[\.\/\-]\d{1,2}[\.\/\-]\d{1,2}([T ]{1}\d{1,2}[:\.]\d{2}([\.:]\d{2})?)?$/,dc=/(\/|\.|\*|\+|\?|\||\(|\)|\[|\]|\{|\}|\\|\$|\^|\-)/g,bb=/[',$£€¥%\u2009\u202F\u20BD\u20a9\u20BArfkɃΞ]/gi,P=function(a){return a&&!0!==a&&"-"!==a?!1:
!0},Sb=function(a){var b=parseInt(a,10);return!isNaN(b)&&isFinite(a)?b:null},Tb=function(a,b){cb[b]||(cb[b]=new RegExp(Ua(b),"g"));return"string"===typeof a&&"."!==b?a.replace(/\./g,"").replace(cb[b],"."):a},db=function(a,b,c){var d="string"===typeof a;if(P(a))return!0;b&&d&&(a=Tb(a,b));c&&d&&(a=a.replace(bb,""));return!isNaN(parseFloat(a))&&isFinite(a)},Ub=function(a,b,c){return P(a)?!0:P(a)||"string"===typeof a?db(a.replace(Ea,""),b,c)?!0:null:null},J=function(a,b,c){var d=[],e=0,h=a.length;if(c!==
p)for(;e<h;e++)a[e]&&a[e][b]&&d.push(a[e][b][c]);else for(;e<h;e++)a[e]&&d.push(a[e][b]);return d},la=function(a,b,c,d){var e=[],h=0,g=b.length;if(d!==p)for(;h<g;h++)a[b[h]][c]&&e.push(a[b[h]][c][d]);else for(;h<g;h++)e.push(a[b[h]][c]);return e},Z=function(a,b){var c=[];if(b===p){b=0;var d=a}else d=b,b=a;for(a=b;a<d;a++)c.push(a);return c},Vb=function(a){for(var b=[],c=0,d=a.length;c<d;c++)a[c]&&b.push(a[c]);return b},ta=function(a){a:{if(!(2>a.length)){var b=a.slice().sort();for(var c=b[0],d=1,
e=b.length;d<e;d++){if(b[d]===c){b=!1;break a}c=b[d]}}b=!0}if(b)return a.slice();b=[];e=a.length;var h,g=0;d=0;a:for(;d<e;d++){c=a[d];for(h=0;h<g;h++)if(b[h]===c)continue a;b.push(c);g++}return b};q.util={throttle:function(a,b){var c=b!==p?b:200,d,e;return function(){var b=this,g=+new Date,f=arguments;d&&g<d+c?(clearTimeout(e),e=setTimeout(function(){d=p;a.apply(b,f)},c)):(d=g,a.apply(b,f))}},escapeRegex:function(a){return a.replace(dc,"\\$1")}};var F=function(a,b,c){a[b]!==p&&(a[c]=a[b])},da=/\[.*?\]$/,
X=/\(\)$/,Ua=q.util.escapeRegex,ya=f("<div>")[0],$b=ya.textContent!==p,bc=/<.*?>/g,Sa=q.util.throttle,Wb=[],G=Array.prototype,ec=function(a){var b,c=q.settings,d=f.map(c,function(a,b){return a.nTable});if(a){if(a.nTable&&a.oApi)return[a];if(a.nodeName&&"table"===a.nodeName.toLowerCase()){var e=f.inArray(a,d);return-1!==e?[c[e]]:null}if(a&&"function"===typeof a.settings)return a.settings().toArray();"string"===typeof a?b=f(a):a instanceof f&&(b=a)}else return[];if(b)return b.map(function(a){e=f.inArray(this,
d);return-1!==e?c[e]:null}).toArray()};var v=function(a,b){if(!(this instanceof v))return new v(a,b);var c=[],d=function(a){(a=ec(a))&&c.push.apply(c,a)};if(f.isArray(a))for(var e=0,h=a.length;e<h;e++)d(a[e]);else d(a);this.context=ta(c);b&&f.merge(this,b);this.selector={rows:null,cols:null,opts:null};v.extend(this,this,Wb)};q.Api=v;f.extend(v.prototype,{any:function(){return 0!==this.count()},concat:G.concat,context:[],count:function(){return this.flatten().length},each:function(a){for(var b=0,c=
this.length;b<c;b++)a.call(this,this[b],b,this);return this},eq:function(a){var b=this.context;return b.length>a?new v(b[a],this[a]):null},filter:function(a){var b=[];if(G.filter)b=G.filter.call(this,a,this);else for(var c=0,d=this.length;c<d;c++)a.call(this,this[c],c,this)&&b.push(this[c]);return new v(this.context,b)},flatten:function(){var a=[];return new v(this.context,a.concat.apply(a,this.toArray()))},join:G.join,indexOf:G.indexOf||function(a,b){b=b||0;for(var c=this.length;b<c;b++)if(this[b]===
a)return b;return-1},iterator:function(a,b,c,d){var e=[],h,g,f=this.context,l,n=this.selector;"string"===typeof a&&(d=c,c=b,b=a,a=!1);var m=0;for(h=f.length;m<h;m++){var q=new v(f[m]);if("table"===b){var u=c.call(q,f[m],m);u!==p&&e.push(u)}else if("columns"===b||"rows"===b)u=c.call(q,f[m],this[m],m),u!==p&&e.push(u);else if("column"===b||"column-rows"===b||"row"===b||"cell"===b){var t=this[m];"column-rows"===b&&(l=Fa(f[m],n.opts));var x=0;for(g=t.length;x<g;x++)u=t[x],u="cell"===b?c.call(q,f[m],u.row,
u.column,m,x):c.call(q,f[m],u,m,x,l),u!==p&&e.push(u)}}return e.length||d?(a=new v(f,a?e.concat.apply([],e):e),b=a.selector,b.rows=n.rows,b.cols=n.cols,b.opts=n.opts,a):this},lastIndexOf:G.lastIndexOf||function(a,b){return this.indexOf.apply(this.toArray.reverse(),arguments)},length:0,map:function(a){var b=[];if(G.map)b=G.map.call(this,a,this);else for(var c=0,d=this.length;c<d;c++)b.push(a.call(this,this[c],c));return new v(this.context,b)},pluck:function(a){return this.map(function(b){return b[a]})},
pop:G.pop,push:G.push,reduce:G.reduce||function(a,b){return mb(this,a,b,0,this.length,1)},reduceRight:G.reduceRight||function(a,b){return mb(this,a,b,this.length-1,-1,-1)},reverse:G.reverse,selector:null,shift:G.shift,slice:function(){return new v(this.context,this)},sort:G.sort,splice:G.splice,toArray:function(){return G.slice.call(this)},to$:function(){return f(this)},toJQuery:function(){return f(this)},unique:function(){return new v(this.context,ta(this))},unshift:G.unshift});v.extend=function(a,
b,c){if(c.length&&b&&(b instanceof v||b.__dt_wrapper)){var d,e=function(a,b,c){return function(){var d=b.apply(a,arguments);v.extend(d,d,c.methodExt);return d}};var h=0;for(d=c.length;h<d;h++){var g=c[h];b[g.name]="function"===g.type?e(a,g.val,g):"object"===g.type?{}:g.val;b[g.name].__dt_wrapper=!0;v.extend(a,b[g.name],g.propExt)}}};v.register=t=function(a,b){if(f.isArray(a))for(var c=0,d=a.length;c<d;c++)v.register(a[c],b);else{d=a.split(".");var e=Wb,h;a=0;for(c=d.length;a<c;a++){var g=(h=-1!==
d[a].indexOf("()"))?d[a].replace("()",""):d[a];a:{var k=0;for(var l=e.length;k<l;k++)if(e[k].name===g){k=e[k];break a}k=null}k||(k={name:g,val:{},methodExt:[],propExt:[],type:"object"},e.push(k));a===c-1?(k.val=b,k.type="function"===typeof b?"function":f.isPlainObject(b)?"object":"other"):e=h?k.methodExt:k.propExt}}};v.registerPlural=x=function(a,b,c){v.register(a,c);v.register(b,function(){var a=c.apply(this,arguments);return a===this?this:a instanceof v?a.length?f.isArray(a[0])?new v(a.context,
a[0]):a[0]:p:a})};var fc=function(a,b){if("number"===typeof a)return[b[a]];var c=f.map(b,function(a,b){return a.nTable});return f(c).filter(a).map(function(a){a=f.inArray(this,c);return b[a]}).toArray()};t("tables()",function(a){return a?new v(fc(a,this.context)):this});t("table()",function(a){a=this.tables(a);var b=a.context;return b.length?new v(b[0]):a});x("tables().nodes()","table().node()",function(){return this.iterator("table",function(a){return a.nTable},1)});x("tables().body()","table().body()",
function(){return this.iterator("table",function(a){return a.nTBody},1)});x("tables().header()","table().header()",function(){return this.iterator("table",function(a){return a.nTHead},1)});x("tables().footer()","table().footer()",function(){return this.iterator("table",function(a){return a.nTFoot},1)});x("tables().containers()","table().container()",function(){return this.iterator("table",function(a){return a.nTableWrapper},1)});t("draw()",function(a){return this.iterator("table",function(b){"page"===
a?S(b):("string"===typeof a&&(a="full-hold"===a?!1:!0),V(b,!1===a))})});t("page()",function(a){return a===p?this.page.info().page:this.iterator("table",function(b){Xa(b,a)})});t("page.info()",function(a){if(0===this.context.length)return p;a=this.context[0];var b=a._iDisplayStart,c=a.oFeatures.bPaginate?a._iDisplayLength:-1,d=a.fnRecordsDisplay(),e=-1===c;return{page:e?0:Math.floor(b/c),pages:e?1:Math.ceil(d/c),start:b,end:a.fnDisplayEnd(),length:c,recordsTotal:a.fnRecordsTotal(),recordsDisplay:d,
serverSide:"ssp"===D(a)}});t("page.len()",function(a){return a===p?0!==this.context.length?this.context[0]._iDisplayLength:p:this.iterator("table",function(b){Va(b,a)})});var Xb=function(a,b,c){if(c){var d=new v(a);d.one("draw",function(){c(d.ajax.json())})}if("ssp"==D(a))V(a,b);else{K(a,!0);var e=a.jqXHR;e&&4!==e.readyState&&e.abort();va(a,[],function(c){qa(a);c=wa(a,c);for(var d=0,e=c.length;d<e;d++)R(a,c[d]);V(a,b);K(a,!1)})}};t("ajax.json()",function(){var a=this.context;if(0<a.length)return a[0].json});
t("ajax.params()",function(){var a=this.context;if(0<a.length)return a[0].oAjaxData});t("ajax.reload()",function(a,b){return this.iterator("table",function(c){Xb(c,!1===b,a)})});t("ajax.url()",function(a){var b=this.context;if(a===p){if(0===b.length)return p;b=b[0];return b.ajax?f.isPlainObject(b.ajax)?b.ajax.url:b.ajax:b.sAjaxSource}return this.iterator("table",function(b){f.isPlainObject(b.ajax)?b.ajax.url=a:b.ajax=a})});t("ajax.url().load()",function(a,b){return this.iterator("table",function(c){Xb(c,
!1===b,a)})});var eb=function(a,b,c,d,e){var h=[],g,k,l;var n=typeof b;b&&"string"!==n&&"function"!==n&&b.length!==p||(b=[b]);n=0;for(k=b.length;n<k;n++){var m=b[n]&&b[n].split&&!b[n].match(/[\[\(:]/)?b[n].split(","):[b[n]];var q=0;for(l=m.length;q<l;q++)(g=c("string"===typeof m[q]?f.trim(m[q]):m[q]))&&g.length&&(h=h.concat(g))}a=C.selector[a];if(a.length)for(n=0,k=a.length;n<k;n++)h=a[n](d,e,h);return ta(h)},fb=function(a){a||(a={});a.filter&&a.search===p&&(a.search=a.filter);return f.extend({search:"none",
order:"current",page:"all"},a)},gb=function(a){for(var b=0,c=a.length;b<c;b++)if(0<a[b].length)return a[0]=a[b],a[0].length=1,a.length=1,a.context=[a.context[b]],a;a.length=0;return a},Fa=function(a,b){var c=[],d=a.aiDisplay;var e=a.aiDisplayMaster;var h=b.search;var g=b.order;b=b.page;if("ssp"==D(a))return"removed"===h?[]:Z(0,e.length);if("current"==b)for(g=a._iDisplayStart,a=a.fnDisplayEnd();g<a;g++)c.push(d[g]);else if("current"==g||"applied"==g)if("none"==h)c=e.slice();else if("applied"==h)c=
d.slice();else{if("removed"==h){var k={};g=0;for(a=d.length;g<a;g++)k[d[g]]=null;c=f.map(e,function(a){return k.hasOwnProperty(a)?null:a})}}else if("index"==g||"original"==g)for(g=0,a=a.aoData.length;g<a;g++)"none"==h?c.push(g):(e=f.inArray(g,d),(-1===e&&"removed"==h||0<=e&&"applied"==h)&&c.push(g));return c},gc=function(a,b,c){var d;return eb("row",b,function(b){var e=Sb(b),g=a.aoData;if(null!==e&&!c)return[e];d||(d=Fa(a,c));if(null!==e&&-1!==f.inArray(e,d))return[e];if(null===b||b===p||""===b)return d;
if("function"===typeof b)return f.map(d,function(a){var c=g[a];return b(a,c._aData,c.nTr)?a:null});if(b.nodeName){e=b._DT_RowIndex;var k=b._DT_CellIndex;if(e!==p)return g[e]&&g[e].nTr===b?[e]:[];if(k)return g[k.row]&&g[k.row].nTr===b.parentNode?[k.row]:[];e=f(b).closest("*[data-dt-row]");return e.length?[e.data("dt-row")]:[]}if("string"===typeof b&&"#"===b.charAt(0)&&(e=a.aIds[b.replace(/^#/,"")],e!==p))return[e.idx];e=Vb(la(a.aoData,d,"nTr"));return f(e).filter(b).map(function(){return this._DT_RowIndex}).toArray()},
a,c)};t("rows()",function(a,b){a===p?a="":f.isPlainObject(a)&&(b=a,a="");b=fb(b);var c=this.iterator("table",function(c){return gc(c,a,b)},1);c.selector.rows=a;c.selector.opts=b;return c});t("rows().nodes()",function(){return this.iterator("row",function(a,b){return a.aoData[b].nTr||p},1)});t("rows().data()",function(){return this.iterator(!0,"rows",function(a,b){return la(a.aoData,b,"_aData")},1)});x("rows().cache()","row().cache()",function(a){return this.iterator("row",function(b,c){b=b.aoData[c];
return"search"===a?b._aFilterData:b._aSortData},1)});x("rows().invalidate()","row().invalidate()",function(a){return this.iterator("row",function(b,c){ea(b,c,a)})});x("rows().indexes()","row().index()",function(){return this.iterator("row",function(a,b){return b},1)});x("rows().ids()","row().id()",function(a){for(var b=[],c=this.context,d=0,e=c.length;d<e;d++)for(var h=0,g=this[d].length;h<g;h++){var f=c[d].rowIdFn(c[d].aoData[this[d][h]]._aData);b.push((!0===a?"#":"")+f)}return new v(c,b)});x("rows().remove()",
"row().remove()",function(){var a=this;this.iterator("row",function(b,c,d){var e=b.aoData,h=e[c],g,f;e.splice(c,1);var l=0;for(g=e.length;l<g;l++){var n=e[l];var m=n.anCells;null!==n.nTr&&(n.nTr._DT_RowIndex=l);if(null!==m)for(n=0,f=m.length;n<f;n++)m[n]._DT_CellIndex.row=l}ra(b.aiDisplayMaster,c);ra(b.aiDisplay,c);ra(a[d],c,!1);0<b._iRecordsDisplay&&b._iRecordsDisplay--;Wa(b);c=b.rowIdFn(h._aData);c!==p&&delete b.aIds[c]});this.iterator("table",function(a){for(var b=0,d=a.aoData.length;b<d;b++)a.aoData[b].idx=
b});return this});t("rows.add()",function(a){var b=this.iterator("table",function(b){var c,d=[];var g=0;for(c=a.length;g<c;g++){var f=a[g];f.nodeName&&"TR"===f.nodeName.toUpperCase()?d.push(pa(b,f)[0]):d.push(R(b,f))}return d},1),c=this.rows(-1);c.pop();f.merge(c,b);return c});t("row()",function(a,b){return gb(this.rows(a,b))});t("row().data()",function(a){var b=this.context;if(a===p)return b.length&&this.length?b[0].aoData[this[0]]._aData:p;var c=b[0].aoData[this[0]];c._aData=a;f.isArray(a)&&c.nTr.id&&
Q(b[0].rowId)(a,c.nTr.id);ea(b[0],this[0],"data");return this});t("row().node()",function(){var a=this.context;return a.length&&this.length?a[0].aoData[this[0]].nTr||null:null});t("row.add()",function(a){a instanceof f&&a.length&&(a=a[0]);var b=this.iterator("table",function(b){return a.nodeName&&"TR"===a.nodeName.toUpperCase()?pa(b,a)[0]:R(b,a)});return this.row(b[0])});var hc=function(a,b,c,d){var e=[],h=function(b,c){if(f.isArray(b)||b instanceof f)for(var d=0,g=b.length;d<g;d++)h(b[d],c);else b.nodeName&&
"tr"===b.nodeName.toLowerCase()?e.push(b):(d=f("<tr><td/></tr>").addClass(c),f("td",d).addClass(c).html(b)[0].colSpan=W(a),e.push(d[0]))};h(c,d);b._details&&b._details.detach();b._details=f(e);b._detailsShow&&b._details.insertAfter(b.nTr)},hb=function(a,b){var c=a.context;c.length&&(a=c[0].aoData[b!==p?b:a[0]])&&a._details&&(a._details.remove(),a._detailsShow=p,a._details=p)},Yb=function(a,b){var c=a.context;c.length&&a.length&&(a=c[0].aoData[a[0]],a._details&&((a._detailsShow=b)?a._details.insertAfter(a.nTr):
a._details.detach(),ic(c[0])))},ic=function(a){var b=new v(a),c=a.aoData;b.off("draw.dt.DT_details column-visibility.dt.DT_details destroy.dt.DT_details");0<J(c,"_details").length&&(b.on("draw.dt.DT_details",function(d,e){a===e&&b.rows({page:"current"}).eq(0).each(function(a){a=c[a];a._detailsShow&&a._details.insertAfter(a.nTr)})}),b.on("column-visibility.dt.DT_details",function(b,e,f,g){if(a===e)for(e=W(e),f=0,g=c.length;f<g;f++)b=c[f],b._details&&b._details.children("td[colspan]").attr("colspan",
e)}),b.on("destroy.dt.DT_details",function(d,e){if(a===e)for(d=0,e=c.length;d<e;d++)c[d]._details&&hb(b,d)}))};t("row().child()",function(a,b){var c=this.context;if(a===p)return c.length&&this.length?c[0].aoData[this[0]]._details:p;!0===a?this.child.show():!1===a?hb(this):c.length&&this.length&&hc(c[0],c[0].aoData[this[0]],a,b);return this});t(["row().child.show()","row().child().show()"],function(a){Yb(this,!0);return this});t(["row().child.hide()","row().child().hide()"],function(){Yb(this,!1);
return this});t(["row().child.remove()","row().child().remove()"],function(){hb(this);return this});t("row().child.isShown()",function(){var a=this.context;return a.length&&this.length?a[0].aoData[this[0]]._detailsShow||!1:!1});var jc=/^([^:]+):(name|visIdx|visible)$/,Zb=function(a,b,c,d,e){c=[];d=0;for(var f=e.length;d<f;d++)c.push(I(a,e[d],b));return c},kc=function(a,b,c){var d=a.aoColumns,e=J(d,"sName"),h=J(d,"nTh");return eb("column",b,function(b){var g=Sb(b);if(""===b)return Z(d.length);if(null!==
g)return[0<=g?g:d.length+g];if("function"===typeof b){var l=Fa(a,c);return f.map(d,function(c,d){return b(d,Zb(a,d,0,0,l),h[d])?d:null})}var n="string"===typeof b?b.match(jc):"";if(n)switch(n[2]){case "visIdx":case "visible":g=parseInt(n[1],10);if(0>g){var m=f.map(d,function(a,b){return a.bVisible?b:null});return[m[m.length+g]]}return[ba(a,g)];case "name":return f.map(e,function(a,b){return a===n[1]?b:null});default:return[]}if(b.nodeName&&b._DT_CellIndex)return[b._DT_CellIndex.column];g=f(h).filter(b).map(function(){return f.inArray(this,
h)}).toArray();if(g.length||!b.nodeName)return g;g=f(b).closest("*[data-dt-column]");return g.length?[g.data("dt-column")]:[]},a,c)};t("columns()",function(a,b){a===p?a="":f.isPlainObject(a)&&(b=a,a="");b=fb(b);var c=this.iterator("table",function(c){return kc(c,a,b)},1);c.selector.cols=a;c.selector.opts=b;return c});x("columns().header()","column().header()",function(a,b){return this.iterator("column",function(a,b){return a.aoColumns[b].nTh},1)});x("columns().footer()","column().footer()",function(a,
b){return this.iterator("column",function(a,b){return a.aoColumns[b].nTf},1)});x("columns().data()","column().data()",function(){return this.iterator("column-rows",Zb,1)});x("columns().dataSrc()","column().dataSrc()",function(){return this.iterator("column",function(a,b){return a.aoColumns[b].mData},1)});x("columns().cache()","column().cache()",function(a){return this.iterator("column-rows",function(b,c,d,e,f){return la(b.aoData,f,"search"===a?"_aFilterData":"_aSortData",c)},1)});x("columns().nodes()",
"column().nodes()",function(){return this.iterator("column-rows",function(a,b,c,d,e){return la(a.aoData,e,"anCells",b)},1)});x("columns().visible()","column().visible()",function(a,b){var c=this,d=this.iterator("column",function(b,c){if(a===p)return b.aoColumns[c].bVisible;var d=b.aoColumns,e=d[c],h=b.aoData,n;if(a!==p&&e.bVisible!==a){if(a){var m=f.inArray(!0,J(d,"bVisible"),c+1);d=0;for(n=h.length;d<n;d++){var q=h[d].nTr;b=h[d].anCells;q&&q.insertBefore(b[c],b[m]||null)}}else f(J(b.aoData,"anCells",
c)).detach();e.bVisible=a}});a!==p&&this.iterator("table",function(d){ha(d,d.aoHeader);ha(d,d.aoFooter);d.aiDisplay.length||f(d.nTBody).find("td[colspan]").attr("colspan",W(d));Ba(d);c.iterator("column",function(c,d){A(c,null,"column-visibility",[c,d,a,b])});(b===p||b)&&c.columns.adjust()});return d});x("columns().indexes()","column().index()",function(a){return this.iterator("column",function(b,c){return"visible"===a?ca(b,c):c},1)});t("columns.adjust()",function(){return this.iterator("table",function(a){aa(a)},
1)});t("column.index()",function(a,b){if(0!==this.context.length){var c=this.context[0];if("fromVisible"===a||"toData"===a)return ba(c,b);if("fromData"===a||"toVisible"===a)return ca(c,b)}});t("column()",function(a,b){return gb(this.columns(a,b))});var lc=function(a,b,c){var d=a.aoData,e=Fa(a,c),h=Vb(la(d,e,"anCells")),g=f([].concat.apply([],h)),k,l=a.aoColumns.length,n,m,q,u,t,v;return eb("cell",b,function(b){var c="function"===typeof b;if(null===b||b===p||c){n=[];m=0;for(q=e.length;m<q;m++)for(k=
e[m],u=0;u<l;u++)t={row:k,column:u},c?(v=d[k],b(t,I(a,k,u),v.anCells?v.anCells[u]:null)&&n.push(t)):n.push(t);return n}if(f.isPlainObject(b))return b.column!==p&&b.row!==p&&-1!==f.inArray(b.row,e)?[b]:[];c=g.filter(b).map(function(a,b){return{row:b._DT_CellIndex.row,column:b._DT_CellIndex.column}}).toArray();if(c.length||!b.nodeName)return c;v=f(b).closest("*[data-dt-row]");return v.length?[{row:v.data("dt-row"),column:v.data("dt-column")}]:[]},a,c)};t("cells()",function(a,b,c){f.isPlainObject(a)&&
(a.row===p?(c=a,a=null):(c=b,b=null));f.isPlainObject(b)&&(c=b,b=null);if(null===b||b===p)return this.iterator("table",function(b){return lc(b,a,fb(c))});var d=c?{page:c.page,order:c.order,search:c.search}:{},e=this.columns(b,d),h=this.rows(a,d),g,k,l,n;d=this.iterator("table",function(a,b){a=[];g=0;for(k=h[b].length;g<k;g++)for(l=0,n=e[b].length;l<n;l++)a.push({row:h[b][g],column:e[b][l]});return a},1);d=c&&c.selected?this.cells(d,c):d;f.extend(d.selector,{cols:b,rows:a,opts:c});return d});x("cells().nodes()",
"cell().node()",function(){return this.iterator("cell",function(a,b,c){return(a=a.aoData[b])&&a.anCells?a.anCells[c]:p},1)});t("cells().data()",function(){return this.iterator("cell",function(a,b,c){return I(a,b,c)},1)});x("cells().cache()","cell().cache()",function(a){a="search"===a?"_aFilterData":"_aSortData";return this.iterator("cell",function(b,c,d){return b.aoData[c][a][d]},1)});x("cells().render()","cell().render()",function(a){return this.iterator("cell",function(b,c,d){return I(b,c,d,a)},
1)});x("cells().indexes()","cell().index()",function(){return this.iterator("cell",function(a,b,c){return{row:b,column:c,columnVisible:ca(a,c)}},1)});x("cells().invalidate()","cell().invalidate()",function(a){return this.iterator("cell",function(b,c,d){ea(b,c,a,d)})});t("cell()",function(a,b,c){return gb(this.cells(a,b,c))});t("cell().data()",function(a){var b=this.context,c=this[0];if(a===p)return b.length&&c.length?I(b[0],c[0].row,c[0].column):p;ob(b[0],c[0].row,c[0].column,a);ea(b[0],c[0].row,
"data",c[0].column);return this});t("order()",function(a,b){var c=this.context;if(a===p)return 0!==c.length?c[0].aaSorting:p;"number"===typeof a?a=[[a,b]]:a.length&&!f.isArray(a[0])&&(a=Array.prototype.slice.call(arguments));return this.iterator("table",function(b){b.aaSorting=a.slice()})});t("order.listener()",function(a,b,c){return this.iterator("table",function(d){Qa(d,a,b,c)})});t("order.fixed()",function(a){if(!a){var b=this.context;b=b.length?b[0].aaSortingFixed:p;return f.isArray(b)?{pre:b}:
b}return this.iterator("table",function(b){b.aaSortingFixed=f.extend(!0,{},a)})});t(["columns().order()","column().order()"],function(a){var b=this;return this.iterator("table",function(c,d){var e=[];f.each(b[d],function(b,c){e.push([c,a])});c.aaSorting=e})});t("search()",function(a,b,c,d){var e=this.context;return a===p?0!==e.length?e[0].oPreviousSearch.sSearch:p:this.iterator("table",function(e){e.oFeatures.bFilter&&ia(e,f.extend({},e.oPreviousSearch,{sSearch:a+"",bRegex:null===b?!1:b,bSmart:null===
c?!0:c,bCaseInsensitive:null===d?!0:d}),1)})});x("columns().search()","column().search()",function(a,b,c,d){return this.iterator("column",function(e,h){var g=e.aoPreSearchCols;if(a===p)return g[h].sSearch;e.oFeatures.bFilter&&(f.extend(g[h],{sSearch:a+"",bRegex:null===b?!1:b,bSmart:null===c?!0:c,bCaseInsensitive:null===d?!0:d}),ia(e,e.oPreviousSearch,1))})});t("state()",function(){return this.context.length?this.context[0].oSavedState:null});t("state.clear()",function(){return this.iterator("table",
function(a){a.fnStateSaveCallback.call(a.oInstance,a,{})})});t("state.loaded()",function(){return this.context.length?this.context[0].oLoadedState:null});t("state.save()",function(){return this.iterator("table",function(a){Ba(a)})});q.versionCheck=q.fnVersionCheck=function(a){var b=q.version.split(".");a=a.split(".");for(var c,d,e=0,f=a.length;e<f;e++)if(c=parseInt(b[e],10)||0,d=parseInt(a[e],10)||0,c!==d)return c>d;return!0};q.isDataTable=q.fnIsDataTable=function(a){var b=f(a).get(0),c=!1;if(a instanceof
q.Api)return!0;f.each(q.settings,function(a,e){a=e.nScrollHead?f("table",e.nScrollHead)[0]:null;var d=e.nScrollFoot?f("table",e.nScrollFoot)[0]:null;if(e.nTable===b||a===b||d===b)c=!0});return c};q.tables=q.fnTables=function(a){var b=!1;f.isPlainObject(a)&&(b=a.api,a=a.visible);var c=f.map(q.settings,function(b){if(!a||a&&f(b.nTable).is(":visible"))return b.nTable});return b?new v(c):c};q.camelToHungarian=L;t("$()",function(a,b){b=this.rows(b).nodes();b=f(b);return f([].concat(b.filter(a).toArray(),
b.find(a).toArray()))});f.each(["on","one","off"],function(a,b){t(b+"()",function(){var a=Array.prototype.slice.call(arguments);a[0]=f.map(a[0].split(/\s/),function(a){return a.match(/\.dt\b/)?a:a+".dt"}).join(" ");var d=f(this.tables().nodes());d[b].apply(d,a);return this})});t("clear()",function(){return this.iterator("table",function(a){qa(a)})});t("settings()",function(){return new v(this.context,this.context)});t("init()",function(){var a=this.context;return a.length?a[0].oInit:null});t("data()",
function(){return this.iterator("table",function(a){return J(a.aoData,"_aData")}).flatten()});t("destroy()",function(a){a=a||!1;return this.iterator("table",function(b){var c=b.nTableWrapper.parentNode,d=b.oClasses,e=b.nTable,h=b.nTBody,g=b.nTHead,k=b.nTFoot,l=f(e);h=f(h);var n=f(b.nTableWrapper),m=f.map(b.aoData,function(a){return a.nTr}),p;b.bDestroying=!0;A(b,"aoDestroyCallback","destroy",[b]);a||(new v(b)).columns().visible(!0);n.off(".DT").find(":not(tbody *)").off(".DT");f(z).off(".DT-"+b.sInstance);
e!=g.parentNode&&(l.children("thead").detach(),l.append(g));k&&e!=k.parentNode&&(l.children("tfoot").detach(),l.append(k));b.aaSorting=[];b.aaSortingFixed=[];Aa(b);f(m).removeClass(b.asStripeClasses.join(" "));f("th, td",g).removeClass(d.sSortable+" "+d.sSortableAsc+" "+d.sSortableDesc+" "+d.sSortableNone);h.children().detach();h.append(m);g=a?"remove":"detach";l[g]();n[g]();!a&&c&&(c.insertBefore(e,b.nTableReinsertBefore),l.css("width",b.sDestroyWidth).removeClass(d.sTable),(p=b.asDestroyStripes.length)&&
h.children().each(function(a){f(this).addClass(b.asDestroyStripes[a%p])}));c=f.inArray(b,q.settings);-1!==c&&q.settings.splice(c,1)})});f.each(["column","row","cell"],function(a,b){t(b+"s().every()",function(a){var c=this.selector.opts,e=this;return this.iterator(b,function(d,f,k,l,n){a.call(e[b](f,"cell"===b?k:c,"cell"===b?c:p),f,k,l,n)})})});t("i18n()",function(a,b,c){var d=this.context[0];a=U(a)(d.oLanguage);a===p&&(a=b);c!==p&&f.isPlainObject(a)&&(a=a[c]!==p?a[c]:a._);return a.replace("%d",c)});
q.version="1.10.20";q.settings=[];q.models={};q.models.oSearch={bCaseInsensitive:!0,sSearch:"",bRegex:!1,bSmart:!0};q.models.oRow={nTr:null,anCells:null,_aData:[],_aSortData:null,_aFilterData:null,_sFilterRow:null,_sRowStripe:"",src:null,idx:-1};q.models.oColumn={idx:null,aDataSort:null,asSorting:null,bSearchable:null,bSortable:null,bVisible:null,_sManualType:null,_bAttrSrc:!1,fnCreatedCell:null,fnGetData:null,fnSetData:null,mData:null,mRender:null,nTh:null,nTf:null,sClass:null,sContentPadding:null,
sDefaultContent:null,sName:null,sSortDataType:"std",sSortingClass:null,sSortingClassJUI:null,sTitle:null,sType:null,sWidth:null,sWidthOrig:null};q.defaults={aaData:null,aaSorting:[[0,"asc"]],aaSortingFixed:[],ajax:null,aLengthMenu:[10,25,50,100],aoColumns:null,aoColumnDefs:null,aoSearchCols:[],asStripeClasses:null,bAutoWidth:!0,bDeferRender:!1,bDestroy:!1,bFilter:!0,bInfo:!0,bLengthChange:!0,bPaginate:!0,bProcessing:!1,bRetrieve:!1,bScrollCollapse:!1,bServerSide:!1,bSort:!0,bSortMulti:!0,bSortCellsTop:!1,
bSortClasses:!0,bStateSave:!1,fnCreatedRow:null,fnDrawCallback:null,fnFooterCallback:null,fnFormatNumber:function(a){return a.toString().replace(/\B(?=(\d{3})+(?!\d))/g,this.oLanguage.sThousands)},fnHeaderCallback:null,fnInfoCallback:null,fnInitComplete:null,fnPreDrawCallback:null,fnRowCallback:null,fnServerData:null,fnServerParams:null,fnStateLoadCallback:function(a){try{return JSON.parse((-1===a.iStateDuration?sessionStorage:localStorage).getItem("DataTables_"+a.sInstance+"_"+location.pathname))}catch(b){}},
fnStateLoadParams:null,fnStateLoaded:null,fnStateSaveCallback:function(a,b){try{(-1===a.iStateDuration?sessionStorage:localStorage).setItem("DataTables_"+a.sInstance+"_"+location.pathname,JSON.stringify(b))}catch(c){}},fnStateSaveParams:null,iStateDuration:7200,iDeferLoading:null,iDisplayLength:10,iDisplayStart:0,iTabIndex:0,oClasses:{},oLanguage:{oAria:{sSortAscending:": activate to sort column ascending",sSortDescending:": activate to sort column descending"},oPaginate:{sFirst:"First",sLast:"Last",
sNext:"Next",sPrevious:"Previous"},sEmptyTable:"No data available in table",sInfo:"Showing _START_ to _END_ of _TOTAL_ entries",sInfoEmpty:"Showing 0 to 0 of 0 entries",sInfoFiltered:"(filtered from _MAX_ total entries)",sInfoPostFix:"",sDecimal:"",sThousands:",",sLengthMenu:"Show _MENU_ entries",sLoadingRecords:"Loading...",sProcessing:"Processing...",sSearch:"Search:",sSearchPlaceholder:"",sUrl:"",sZeroRecords:"No matching records found"},oSearch:f.extend({},q.models.oSearch),sAjaxDataProp:"data",
sAjaxSource:null,sDom:"lfrtip",searchDelay:null,sPaginationType:"simple_numbers",sScrollX:"",sScrollXInner:"",sScrollY:"",sServerMethod:"GET",renderer:null,rowId:"DT_RowId"};H(q.defaults);q.defaults.column={aDataSort:null,iDataSort:-1,asSorting:["asc","desc"],bSearchable:!0,bSortable:!0,bVisible:!0,fnCreatedCell:null,mData:null,mRender:null,sCellType:"td",sClass:"",sContentPadding:"",sDefaultContent:null,sName:"",sSortDataType:"std",sTitle:null,sType:null,sWidth:null};H(q.defaults.column);q.models.oSettings=
{oFeatures:{bAutoWidth:null,bDeferRender:null,bFilter:null,bInfo:null,bLengthChange:null,bPaginate:null,bProcessing:null,bServerSide:null,bSort:null,bSortMulti:null,bSortClasses:null,bStateSave:null},oScroll:{bCollapse:null,iBarWidth:0,sX:null,sXInner:null,sY:null},oLanguage:{fnInfoCallback:null},oBrowser:{bScrollOversize:!1,bScrollbarLeft:!1,bBounding:!1,barWidth:0},ajax:null,aanFeatures:[],aoData:[],aiDisplay:[],aiDisplayMaster:[],aIds:{},aoColumns:[],aoHeader:[],aoFooter:[],oPreviousSearch:{},
aoPreSearchCols:[],aaSorting:null,aaSortingFixed:[],asStripeClasses:null,asDestroyStripes:[],sDestroyWidth:0,aoRowCallback:[],aoHeaderCallback:[],aoFooterCallback:[],aoDrawCallback:[],aoRowCreatedCallback:[],aoPreDrawCallback:[],aoInitComplete:[],aoStateSaveParams:[],aoStateLoadParams:[],aoStateLoaded:[],sTableId:"",nTable:null,nTHead:null,nTFoot:null,nTBody:null,nTableWrapper:null,bDeferLoading:!1,bInitialised:!1,aoOpenRows:[],sDom:null,searchDelay:null,sPaginationType:"two_button",iStateDuration:0,
aoStateSave:[],aoStateLoad:[],oSavedState:null,oLoadedState:null,sAjaxSource:null,sAjaxDataProp:null,bAjaxDataGet:!0,jqXHR:null,json:p,oAjaxData:p,fnServerData:null,aoServerParams:[],sServerMethod:null,fnFormatNumber:null,aLengthMenu:null,iDraw:0,bDrawing:!1,iDrawError:-1,_iDisplayLength:10,_iDisplayStart:0,_iRecordsTotal:0,_iRecordsDisplay:0,oClasses:{},bFiltered:!1,bSorted:!1,bSortCellsTop:null,oInit:null,aoDestroyCallback:[],fnRecordsTotal:function(){return"ssp"==D(this)?1*this._iRecordsTotal:
this.aiDisplayMaster.length},fnRecordsDisplay:function(){return"ssp"==D(this)?1*this._iRecordsDisplay:this.aiDisplay.length},fnDisplayEnd:function(){var a=this._iDisplayLength,b=this._iDisplayStart,c=b+a,d=this.aiDisplay.length,e=this.oFeatures,f=e.bPaginate;return e.bServerSide?!1===f||-1===a?b+d:Math.min(b+a,this._iRecordsDisplay):!f||c>d||-1===a?d:c},oInstance:null,sInstance:null,iTabIndex:0,nScrollHead:null,nScrollFoot:null,aLastSort:[],oPlugins:{},rowIdFn:null,rowId:null};q.ext=C={buttons:{},
classes:{},build:"bs4/dt-1.10.20",errMode:"alert",feature:[],search:[],selector:{cell:[],column:[],row:[]},internal:{},legacy:{ajax:null},pager:{},renderer:{pageButton:{},header:{}},order:{},type:{detect:[],search:{},order:{}},_unique:0,fnVersionCheck:q.fnVersionCheck,iApiIndex:0,oJUIClasses:{},sVersion:q.version};f.extend(C,{afnFiltering:C.search,aTypes:C.type.detect,ofnSearch:C.type.search,oSort:C.type.order,afnSortData:C.order,aoFeatures:C.feature,oApi:C.internal,oStdClasses:C.classes,oPagination:C.pager});
f.extend(q.ext.classes,{sTable:"dataTable",sNoFooter:"no-footer",sPageButton:"paginate_button",sPageButtonActive:"current",sPageButtonDisabled:"disabled",sStripeOdd:"odd",sStripeEven:"even",sRowEmpty:"dataTables_empty",sWrapper:"dataTables_wrapper",sFilter:"dataTables_filter",sInfo:"dataTables_info",sPaging:"dataTables_paginate paging_",sLength:"dataTables_length",sProcessing:"dataTables_processing",sSortAsc:"sorting_asc",sSortDesc:"sorting_desc",sSortable:"sorting",sSortableAsc:"sorting_asc_disabled",
sSortableDesc:"sorting_desc_disabled",sSortableNone:"sorting_disabled",sSortColumn:"sorting_",sFilterInput:"",sLengthSelect:"",sScrollWrapper:"dataTables_scroll",sScrollHead:"dataTables_scrollHead",sScrollHeadInner:"dataTables_scrollHeadInner",sScrollBody:"dataTables_scrollBody",sScrollFoot:"dataTables_scrollFoot",sScrollFootInner:"dataTables_scrollFootInner",sHeaderTH:"",sFooterTH:"",sSortJUIAsc:"",sSortJUIDesc:"",sSortJUI:"",sSortJUIAscAllowed:"",sSortJUIDescAllowed:"",sSortJUIWrapper:"",sSortIcon:"",
sJUIHeader:"",sJUIFooter:""});var Pb=q.ext.pager;f.extend(Pb,{simple:function(a,b){return["previous","next"]},full:function(a,b){return["first","previous","next","last"]},numbers:function(a,b){return[ka(a,b)]},simple_numbers:function(a,b){return["previous",ka(a,b),"next"]},full_numbers:function(a,b){return["first","previous",ka(a,b),"next","last"]},first_last_numbers:function(a,b){return["first",ka(a,b),"last"]},_numbers:ka,numbers_length:7});f.extend(!0,q.ext.renderer,{pageButton:{_:function(a,b,
c,d,e,h){var g=a.oClasses,k=a.oLanguage.oPaginate,l=a.oLanguage.oAria.paginate||{},n,m,q=0,t=function(b,d){var p,r=g.sPageButtonDisabled,u=function(b){Xa(a,b.data.action,!0)};var w=0;for(p=d.length;w<p;w++){var v=d[w];if(f.isArray(v)){var x=f("<"+(v.DT_el||"div")+"/>").appendTo(b);t(x,v)}else{n=null;m=v;x=a.iTabIndex;switch(v){case "ellipsis":b.append('<span class="ellipsis">&#x2026;</span>');break;case "first":n=k.sFirst;0===e&&(x=-1,m+=" "+r);break;case "previous":n=k.sPrevious;0===e&&(x=-1,m+=
" "+r);break;case "next":n=k.sNext;e===h-1&&(x=-1,m+=" "+r);break;case "last":n=k.sLast;e===h-1&&(x=-1,m+=" "+r);break;default:n=v+1,m=e===v?g.sPageButtonActive:""}null!==n&&(x=f("<a>",{"class":g.sPageButton+" "+m,"aria-controls":a.sTableId,"aria-label":l[v],"data-dt-idx":q,tabindex:x,id:0===c&&"string"===typeof v?a.sTableId+"_"+v:null}).html(n).appendTo(b),$a(x,{action:v},u),q++)}}};try{var v=f(b).find(y.activeElement).data("dt-idx")}catch(mc){}t(f(b).empty(),d);v!==p&&f(b).find("[data-dt-idx="+
v+"]").focus()}}});f.extend(q.ext.type.detect,[function(a,b){b=b.oLanguage.sDecimal;return db(a,b)?"num"+b:null},function(a,b){if(a&&!(a instanceof Date)&&!cc.test(a))return null;b=Date.parse(a);return null!==b&&!isNaN(b)||P(a)?"date":null},function(a,b){b=b.oLanguage.sDecimal;return db(a,b,!0)?"num-fmt"+b:null},function(a,b){b=b.oLanguage.sDecimal;return Ub(a,b)?"html-num"+b:null},function(a,b){b=b.oLanguage.sDecimal;return Ub(a,b,!0)?"html-num-fmt"+b:null},function(a,b){return P(a)||"string"===
typeof a&&-1!==a.indexOf("<")?"html":null}]);f.extend(q.ext.type.search,{html:function(a){return P(a)?a:"string"===typeof a?a.replace(Rb," ").replace(Ea,""):""},string:function(a){return P(a)?a:"string"===typeof a?a.replace(Rb," "):a}});var Da=function(a,b,c,d){if(0!==a&&(!a||"-"===a))return-Infinity;b&&(a=Tb(a,b));a.replace&&(c&&(a=a.replace(c,"")),d&&(a=a.replace(d,"")));return 1*a};f.extend(C.type.order,{"date-pre":function(a){a=Date.parse(a);return isNaN(a)?-Infinity:a},"html-pre":function(a){return P(a)?
"":a.replace?a.replace(/<.*?>/g,"").toLowerCase():a+""},"string-pre":function(a){return P(a)?"":"string"===typeof a?a.toLowerCase():a.toString?a.toString():""},"string-asc":function(a,b){return a<b?-1:a>b?1:0},"string-desc":function(a,b){return a<b?1:a>b?-1:0}});Ha("");f.extend(!0,q.ext.renderer,{header:{_:function(a,b,c,d){f(a.nTable).on("order.dt.DT",function(e,f,g,k){a===f&&(e=c.idx,b.removeClass(c.sSortingClass+" "+d.sSortAsc+" "+d.sSortDesc).addClass("asc"==k[e]?d.sSortAsc:"desc"==k[e]?d.sSortDesc:
c.sSortingClass))})},jqueryui:function(a,b,c,d){f("<div/>").addClass(d.sSortJUIWrapper).append(b.contents()).append(f("<span/>").addClass(d.sSortIcon+" "+c.sSortingClassJUI)).appendTo(b);f(a.nTable).on("order.dt.DT",function(e,f,g,k){a===f&&(e=c.idx,b.removeClass(d.sSortAsc+" "+d.sSortDesc).addClass("asc"==k[e]?d.sSortAsc:"desc"==k[e]?d.sSortDesc:c.sSortingClass),b.find("span."+d.sSortIcon).removeClass(d.sSortJUIAsc+" "+d.sSortJUIDesc+" "+d.sSortJUI+" "+d.sSortJUIAscAllowed+" "+d.sSortJUIDescAllowed).addClass("asc"==
k[e]?d.sSortJUIAsc:"desc"==k[e]?d.sSortJUIDesc:c.sSortingClassJUI))})}}});var ib=function(a){return"string"===typeof a?a.replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;"):a};q.render={number:function(a,b,c,d,e){return{display:function(f){if("number"!==typeof f&&"string"!==typeof f)return f;var g=0>f?"-":"",h=parseFloat(f);if(isNaN(h))return ib(f);h=h.toFixed(c);f=Math.abs(h);h=parseInt(f,10);f=c?b+(f-h).toFixed(c).substring(2):"";return g+(d||"")+h.toString().replace(/\B(?=(\d{3})+(?!\d))/g,
a)+f+(e||"")}}},text:function(){return{display:ib,filter:ib}}};f.extend(q.ext.internal,{_fnExternApiFunc:Qb,_fnBuildAjax:va,_fnAjaxUpdate:qb,_fnAjaxParameters:zb,_fnAjaxUpdateDraw:Ab,_fnAjaxDataSrc:wa,_fnAddColumn:Ia,_fnColumnOptions:ma,_fnAdjustColumnSizing:aa,_fnVisibleToColumnIndex:ba,_fnColumnIndexToVisible:ca,_fnVisbleColumns:W,_fnGetColumns:oa,_fnColumnTypes:Ka,_fnApplyColumnDefs:nb,_fnHungarianMap:H,_fnCamelToHungarian:L,_fnLanguageCompat:Ga,_fnBrowserDetect:lb,_fnAddData:R,_fnAddTr:pa,_fnNodeToDataIndex:function(a,
b){return b._DT_RowIndex!==p?b._DT_RowIndex:null},_fnNodeToColumnIndex:function(a,b,c){return f.inArray(c,a.aoData[b].anCells)},_fnGetCellData:I,_fnSetCellData:ob,_fnSplitObjNotation:Na,_fnGetObjectDataFn:U,_fnSetObjectDataFn:Q,_fnGetDataMaster:Oa,_fnClearTable:qa,_fnDeleteIndex:ra,_fnInvalidate:ea,_fnGetRowElements:Ma,_fnCreateTr:La,_fnBuildHead:pb,_fnDrawHead:ha,_fnDraw:S,_fnReDraw:V,_fnAddOptionsHtml:sb,_fnDetectHeader:fa,_fnGetUniqueThs:ua,_fnFeatureHtmlFilter:ub,_fnFilterComplete:ia,_fnFilterCustom:Db,
_fnFilterColumn:Cb,_fnFilter:Bb,_fnFilterCreateSearch:Ta,_fnEscapeRegex:Ua,_fnFilterData:Eb,_fnFeatureHtmlInfo:xb,_fnUpdateInfo:Hb,_fnInfoMacros:Ib,_fnInitialise:ja,_fnInitComplete:xa,_fnLengthChange:Va,_fnFeatureHtmlLength:tb,_fnFeatureHtmlPaginate:yb,_fnPageChange:Xa,_fnFeatureHtmlProcessing:vb,_fnProcessingDisplay:K,_fnFeatureHtmlTable:wb,_fnScrollDraw:na,_fnApplyToChildren:N,_fnCalculateColumnWidths:Ja,_fnThrottle:Sa,_fnConvertToWidth:Jb,_fnGetWidestNode:Kb,_fnGetMaxLenString:Lb,_fnStringToCss:B,
_fnSortFlatten:Y,_fnSort:rb,_fnSortAria:Nb,_fnSortListener:Za,_fnSortAttachListener:Qa,_fnSortingClasses:Aa,_fnSortData:Mb,_fnSaveState:Ba,_fnLoadState:Ob,_fnSettingsFromNode:Ca,_fnLog:O,_fnMap:M,_fnBindAction:$a,_fnCallbackReg:E,_fnCallbackFire:A,_fnLengthOverflow:Wa,_fnRenderer:Ra,_fnDataSource:D,_fnRowAttributes:Pa,_fnExtend:ab,_fnCalculateEnd:function(){}});f.fn.dataTable=q;q.$=f;f.fn.dataTableSettings=q.settings;f.fn.dataTableExt=q.ext;f.fn.DataTable=function(a){return f(this).dataTable(a).api()};
f.each(q,function(a,b){f.fn.DataTable[a]=b});return f.fn.dataTable});
/*!
DataTables Bootstrap 4 integration
©2011-2017 SpryMedia Ltd - datatables.net/license
*/
var $jscomp=$jscomp||{};$jscomp.scope={};$jscomp.findInternal=function(a,b,c){a instanceof String&&(a=String(a));for(var e=a.length,d=0;d<e;d++){var k=a[d];if(b.call(c,k,d,a))return{i:d,v:k}}return{i:-1,v:void 0}};$jscomp.ASSUME_ES5=!1;$jscomp.ASSUME_NO_NATIVE_MAP=!1;$jscomp.ASSUME_NO_NATIVE_SET=!1;$jscomp.SIMPLE_FROUND_POLYFILL=!1;
$jscomp.defineProperty=$jscomp.ASSUME_ES5||"function"==typeof Object.defineProperties?Object.defineProperty:function(a,b,c){a!=Array.prototype&&a!=Object.prototype&&(a[b]=c.value)};$jscomp.getGlobal=function(a){return"undefined"!=typeof window&&window===a?a:"undefined"!=typeof global&&null!=global?global:a};$jscomp.global=$jscomp.getGlobal(this);
$jscomp.polyfill=function(a,b,c,e){if(b){c=$jscomp.global;a=a.split(".");for(e=0;e<a.length-1;e++){var d=a[e];d in c||(c[d]={});c=c[d]}a=a[a.length-1];e=c[a];b=b(e);b!=e&&null!=b&&$jscomp.defineProperty(c,a,{configurable:!0,writable:!0,value:b})}};$jscomp.polyfill("Array.prototype.find",function(a){return a?a:function(a,c){return $jscomp.findInternal(this,a,c).v}},"es6","es3");
(function(a){"function"===typeof define&&define.amd?define(["jquery","datatables.net"],function(b){return a(b,window,document)}):"object"===typeof exports?module.exports=function(b,c){b||(b=window);c&&c.fn.dataTable||(c=require("datatables.net")(b,c).$);return a(c,b,b.document)}:a(jQuery,window,document)})(function(a,b,c,e){var d=a.fn.dataTable;a.extend(!0,d.defaults,{dom:"<'row'<'col-sm-12 col-md-6'l><'col-sm-12 col-md-6'f>><'row'<'col-sm-12'tr>><'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>",
renderer:"bootstrap"});a.extend(d.ext.classes,{sWrapper:"dataTables_wrapper dt-bootstrap4",sFilterInput:"form-control form-control-sm",sLengthSelect:"custom-select custom-select-sm form-control form-control-sm",sProcessing:"dataTables_processing card",sPageButton:"paginate_button page-item"});d.ext.renderer.pageButton.bootstrap=function(b,l,v,w,m,r){var k=new d.Api(b),x=b.oClasses,n=b.oLanguage.oPaginate,y=b.oLanguage.oAria.paginate||{},g,h,t=0,u=function(c,d){var e,l=function(b){b.preventDefault();
a(b.currentTarget).hasClass("disabled")||k.page()==b.data.action||k.page(b.data.action).draw("page")};var q=0;for(e=d.length;q<e;q++){var f=d[q];if(a.isArray(f))u(c,f);else{h=g="";switch(f){case "ellipsis":g="&#x2026;";h="disabled";break;case "first":g=n.sFirst;h=f+(0<m?"":" disabled");break;case "previous":g=n.sPrevious;h=f+(0<m?"":" disabled");break;case "next":g=n.sNext;h=f+(m<r-1?"":" disabled");break;case "last":g=n.sLast;h=f+(m<r-1?"":" disabled");break;default:g=f+1,h=m===f?"active":""}if(g){var p=
a("<li>",{"class":x.sPageButton+" "+h,id:0===v&&"string"===typeof f?b.sTableId+"_"+f:null}).append(a("<a>",{href:"#","aria-controls":b.sTableId,"aria-label":y[f],"data-dt-idx":t,tabindex:b.iTabIndex,"class":"page-link"}).html(g)).appendTo(c);b.oApi._fnBindAction(p,{action:f},l);t++}}}};try{var p=a(l).find(c.activeElement).data("dt-idx")}catch(z){}u(a(l).empty().html('<ul class="pagination"/>').children("ul"),w);p!==e&&a(l).find("[data-dt-idx="+p+"]").focus()};return d});

5
external_js/fontawesome/all.min.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,750 @@
/**
* MIT License
*
* Copyright (c) 2018 Daniel Compton
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*
* https://github.com/danielcompton/ip-range-check
*
* Build with: Browserify
*/
var ipRangeCheck;
(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
ipRangeCheck = require("ip-range-check");
},{"ip-range-check":2}],2:[function(require,module,exports){
var ipaddr = require("ipaddr.js");
module.exports = check_many_cidrs;
function check_many_cidrs(addr, range) {
if (typeof (range) === "string") {
return check_single_cidr(addr, range)
}
else if (typeof (range) === "object") //list
{
var ip_is_in_range = false;
for (var i = 0; i < range.length; i++) {
if (check_single_cidr(addr, range[i])) {
ip_is_in_range = true;
break;
}
}
return ip_is_in_range;
}
}
function check_single_cidr(addr, cidr) {
try {
var parsed_addr = ipaddr.process(addr);
if (cidr.indexOf('/') === -1) {
var parsed_cidr_as_ip = ipaddr.process(cidr);
if ((parsed_addr.kind() === "ipv6") && (parsed_cidr_as_ip.kind() === "ipv6")){
return (parsed_addr.toNormalizedString() === parsed_cidr_as_ip.toNormalizedString())
}
return (parsed_addr.toString() == parsed_cidr_as_ip.toString())
}
else {
var parsed_range = ipaddr.parseCIDR(cidr);
return parsed_addr.match(parsed_range)
}
}
catch (e) {
return false
}
}
},{"ipaddr.js":3}],3:[function(require,module,exports){
(function() {
var expandIPv6, ipaddr, ipv4Part, ipv4Regexes, ipv6Part, ipv6Regexes, matchCIDR, root, zoneIndex;
ipaddr = {};
root = this;
if ((typeof module !== "undefined" && module !== null) && module.exports) {
module.exports = ipaddr;
} else {
root['ipaddr'] = ipaddr;
}
matchCIDR = function(first, second, partSize, cidrBits) {
var part, shift;
if (first.length !== second.length) {
throw new Error("ipaddr: cannot match CIDR for objects with different lengths");
}
part = 0;
while (cidrBits > 0) {
shift = partSize - cidrBits;
if (shift < 0) {
shift = 0;
}
if (first[part] >> shift !== second[part] >> shift) {
return false;
}
cidrBits -= partSize;
part += 1;
}
return true;
};
ipaddr.subnetMatch = function(address, rangeList, defaultName) {
var k, len, rangeName, rangeSubnets, subnet;
if (defaultName == null) {
defaultName = 'unicast';
}
for (rangeName in rangeList) {
rangeSubnets = rangeList[rangeName];
if (rangeSubnets[0] && !(rangeSubnets[0] instanceof Array)) {
rangeSubnets = [rangeSubnets];
}
for (k = 0, len = rangeSubnets.length; k < len; k++) {
subnet = rangeSubnets[k];
if (address.kind() === subnet[0].kind()) {
if (address.match.apply(address, subnet)) {
return rangeName;
}
}
}
}
return defaultName;
};
ipaddr.IPv4 = (function() {
function IPv4(octets) {
var k, len, octet;
if (octets.length !== 4) {
throw new Error("ipaddr: ipv4 octet count should be 4");
}
for (k = 0, len = octets.length; k < len; k++) {
octet = octets[k];
if (!((0 <= octet && octet <= 255))) {
throw new Error("ipaddr: ipv4 octet should fit in 8 bits");
}
}
this.octets = octets;
}
IPv4.prototype.kind = function() {
return 'ipv4';
};
IPv4.prototype.toString = function() {
return this.octets.join(".");
};
IPv4.prototype.toNormalizedString = function() {
return this.toString();
};
IPv4.prototype.toByteArray = function() {
return this.octets.slice(0);
};
IPv4.prototype.match = function(other, cidrRange) {
var ref;
if (cidrRange === void 0) {
ref = other, other = ref[0], cidrRange = ref[1];
}
if (other.kind() !== 'ipv4') {
throw new Error("ipaddr: cannot match ipv4 address with non-ipv4 one");
}
return matchCIDR(this.octets, other.octets, 8, cidrRange);
};
IPv4.prototype.SpecialRanges = {
unspecified: [[new IPv4([0, 0, 0, 0]), 8]],
broadcast: [[new IPv4([255, 255, 255, 255]), 32]],
multicast: [[new IPv4([224, 0, 0, 0]), 4]],
linkLocal: [[new IPv4([169, 254, 0, 0]), 16]],
loopback: [[new IPv4([127, 0, 0, 0]), 8]],
carrierGradeNat: [[new IPv4([100, 64, 0, 0]), 10]],
"private": [[new IPv4([10, 0, 0, 0]), 8], [new IPv4([172, 16, 0, 0]), 12], [new IPv4([192, 168, 0, 0]), 16]],
reserved: [[new IPv4([192, 0, 0, 0]), 24], [new IPv4([192, 0, 2, 0]), 24], [new IPv4([192, 88, 99, 0]), 24], [new IPv4([198, 51, 100, 0]), 24], [new IPv4([203, 0, 113, 0]), 24], [new IPv4([240, 0, 0, 0]), 4]]
};
IPv4.prototype.range = function() {
return ipaddr.subnetMatch(this, this.SpecialRanges);
};
IPv4.prototype.toIPv4MappedAddress = function() {
return ipaddr.IPv6.parse("::ffff:" + (this.toString()));
};
IPv4.prototype.prefixLengthFromSubnetMask = function() {
var cidr, i, k, octet, stop, zeros, zerotable;
zerotable = {
0: 8,
128: 7,
192: 6,
224: 5,
240: 4,
248: 3,
252: 2,
254: 1,
255: 0
};
cidr = 0;
stop = false;
for (i = k = 3; k >= 0; i = k += -1) {
octet = this.octets[i];
if (octet in zerotable) {
zeros = zerotable[octet];
if (stop && zeros !== 0) {
return null;
}
if (zeros !== 8) {
stop = true;
}
cidr += zeros;
} else {
return null;
}
}
return 32 - cidr;
};
return IPv4;
})();
ipv4Part = "(0?\\d+|0x[a-f0-9]+)";
ipv4Regexes = {
fourOctet: new RegExp("^" + ipv4Part + "\\." + ipv4Part + "\\." + ipv4Part + "\\." + ipv4Part + "$", 'i'),
longValue: new RegExp("^" + ipv4Part + "$", 'i')
};
ipaddr.IPv4.parser = function(string) {
var match, parseIntAuto, part, shift, value;
parseIntAuto = function(string) {
if (string[0] === "0" && string[1] !== "x") {
return parseInt(string, 8);
} else {
return parseInt(string);
}
};
if (match = string.match(ipv4Regexes.fourOctet)) {
return (function() {
var k, len, ref, results;
ref = match.slice(1, 6);
results = [];
for (k = 0, len = ref.length; k < len; k++) {
part = ref[k];
results.push(parseIntAuto(part));
}
return results;
})();
} else if (match = string.match(ipv4Regexes.longValue)) {
value = parseIntAuto(match[1]);
if (value > 0xffffffff || value < 0) {
throw new Error("ipaddr: address outside defined range");
}
return ((function() {
var k, results;
results = [];
for (shift = k = 0; k <= 24; shift = k += 8) {
results.push((value >> shift) & 0xff);
}
return results;
})()).reverse();
} else {
return null;
}
};
ipaddr.IPv6 = (function() {
function IPv6(parts, zoneId) {
var i, k, l, len, part, ref;
if (parts.length === 16) {
this.parts = [];
for (i = k = 0; k <= 14; i = k += 2) {
this.parts.push((parts[i] << 8) | parts[i + 1]);
}
} else if (parts.length === 8) {
this.parts = parts;
} else {
throw new Error("ipaddr: ipv6 part count should be 8 or 16");
}
ref = this.parts;
for (l = 0, len = ref.length; l < len; l++) {
part = ref[l];
if (!((0 <= part && part <= 0xffff))) {
throw new Error("ipaddr: ipv6 part should fit in 16 bits");
}
}
if (zoneId) {
this.zoneId = zoneId;
}
}
IPv6.prototype.kind = function() {
return 'ipv6';
};
IPv6.prototype.toString = function() {
return this.toNormalizedString().replace(/((^|:)(0(:|$))+)/, '::');
};
IPv6.prototype.toRFC5952String = function() {
var bestMatchIndex, bestMatchLength, match, regex, string;
regex = /((^|:)(0(:|$)){2,})/g;
string = this.toNormalizedString();
bestMatchIndex = 0;
bestMatchLength = -1;
while ((match = regex.exec(string))) {
if (match[0].length > bestMatchLength) {
bestMatchIndex = match.index;
bestMatchLength = match[0].length;
}
}
if (bestMatchLength < 0) {
return string;
}
return string.substring(0, bestMatchIndex) + '::' + string.substring(bestMatchIndex + bestMatchLength);
};
IPv6.prototype.toByteArray = function() {
var bytes, k, len, part, ref;
bytes = [];
ref = this.parts;
for (k = 0, len = ref.length; k < len; k++) {
part = ref[k];
bytes.push(part >> 8);
bytes.push(part & 0xff);
}
return bytes;
};
IPv6.prototype.toNormalizedString = function() {
var addr, part, suffix;
addr = ((function() {
var k, len, ref, results;
ref = this.parts;
results = [];
for (k = 0, len = ref.length; k < len; k++) {
part = ref[k];
results.push(part.toString(16));
}
return results;
}).call(this)).join(":");
suffix = '';
if (this.zoneId) {
suffix = '%' + this.zoneId;
}
return addr + suffix;
};
IPv6.prototype.toFixedLengthString = function() {
var addr, part, suffix;
addr = ((function() {
var k, len, ref, results;
ref = this.parts;
results = [];
for (k = 0, len = ref.length; k < len; k++) {
part = ref[k];
results.push(part.toString(16).padStart(4, '0'));
}
return results;
}).call(this)).join(":");
suffix = '';
if (this.zoneId) {
suffix = '%' + this.zoneId;
}
return addr + suffix;
};
IPv6.prototype.match = function(other, cidrRange) {
var ref;
if (cidrRange === void 0) {
ref = other, other = ref[0], cidrRange = ref[1];
}
if (other.kind() !== 'ipv6') {
throw new Error("ipaddr: cannot match ipv6 address with non-ipv6 one");
}
return matchCIDR(this.parts, other.parts, 16, cidrRange);
};
IPv6.prototype.SpecialRanges = {
unspecified: [new IPv6([0, 0, 0, 0, 0, 0, 0, 0]), 128],
linkLocal: [new IPv6([0xfe80, 0, 0, 0, 0, 0, 0, 0]), 10],
multicast: [new IPv6([0xff00, 0, 0, 0, 0, 0, 0, 0]), 8],
loopback: [new IPv6([0, 0, 0, 0, 0, 0, 0, 1]), 128],
uniqueLocal: [new IPv6([0xfc00, 0, 0, 0, 0, 0, 0, 0]), 7],
ipv4Mapped: [new IPv6([0, 0, 0, 0, 0, 0xffff, 0, 0]), 96],
rfc6145: [new IPv6([0, 0, 0, 0, 0xffff, 0, 0, 0]), 96],
rfc6052: [new IPv6([0x64, 0xff9b, 0, 0, 0, 0, 0, 0]), 96],
'6to4': [new IPv6([0x2002, 0, 0, 0, 0, 0, 0, 0]), 16],
teredo: [new IPv6([0x2001, 0, 0, 0, 0, 0, 0, 0]), 32],
reserved: [[new IPv6([0x2001, 0xdb8, 0, 0, 0, 0, 0, 0]), 32]]
};
IPv6.prototype.range = function() {
return ipaddr.subnetMatch(this, this.SpecialRanges);
};
IPv6.prototype.isIPv4MappedAddress = function() {
return this.range() === 'ipv4Mapped';
};
IPv6.prototype.toIPv4Address = function() {
var high, low, ref;
if (!this.isIPv4MappedAddress()) {
throw new Error("ipaddr: trying to convert a generic ipv6 address to ipv4");
}
ref = this.parts.slice(-2), high = ref[0], low = ref[1];
return new ipaddr.IPv4([high >> 8, high & 0xff, low >> 8, low & 0xff]);
};
IPv6.prototype.prefixLengthFromSubnetMask = function() {
var cidr, i, k, part, stop, zeros, zerotable;
zerotable = {
0: 16,
32768: 15,
49152: 14,
57344: 13,
61440: 12,
63488: 11,
64512: 10,
65024: 9,
65280: 8,
65408: 7,
65472: 6,
65504: 5,
65520: 4,
65528: 3,
65532: 2,
65534: 1,
65535: 0
};
cidr = 0;
stop = false;
for (i = k = 7; k >= 0; i = k += -1) {
part = this.parts[i];
if (part in zerotable) {
zeros = zerotable[part];
if (stop && zeros !== 0) {
return null;
}
if (zeros !== 16) {
stop = true;
}
cidr += zeros;
} else {
return null;
}
}
return 128 - cidr;
};
return IPv6;
})();
ipv6Part = "(?:[0-9a-f]+::?)+";
zoneIndex = "%[0-9a-z]{1,}";
ipv6Regexes = {
zoneIndex: new RegExp(zoneIndex, 'i'),
"native": new RegExp("^(::)?(" + ipv6Part + ")?([0-9a-f]+)?(::)?(" + zoneIndex + ")?$", 'i'),
transitional: new RegExp(("^((?:" + ipv6Part + ")|(?:::)(?:" + ipv6Part + ")?)") + (ipv4Part + "\\." + ipv4Part + "\\." + ipv4Part + "\\." + ipv4Part) + ("(" + zoneIndex + ")?$"), 'i')
};
expandIPv6 = function(string, parts) {
var colonCount, lastColon, part, replacement, replacementCount, zoneId;
if (string.indexOf('::') !== string.lastIndexOf('::')) {
return null;
}
zoneId = (string.match(ipv6Regexes['zoneIndex']) || [])[0];
if (zoneId) {
zoneId = zoneId.substring(1);
string = string.replace(/%.+$/, '');
}
colonCount = 0;
lastColon = -1;
while ((lastColon = string.indexOf(':', lastColon + 1)) >= 0) {
colonCount++;
}
if (string.substr(0, 2) === '::') {
colonCount--;
}
if (string.substr(-2, 2) === '::') {
colonCount--;
}
if (colonCount > parts) {
return null;
}
replacementCount = parts - colonCount;
replacement = ':';
while (replacementCount--) {
replacement += '0:';
}
string = string.replace('::', replacement);
if (string[0] === ':') {
string = string.slice(1);
}
if (string[string.length - 1] === ':') {
string = string.slice(0, -1);
}
parts = (function() {
var k, len, ref, results;
ref = string.split(":");
results = [];
for (k = 0, len = ref.length; k < len; k++) {
part = ref[k];
results.push(parseInt(part, 16));
}
return results;
})();
return {
parts: parts,
zoneId: zoneId
};
};
ipaddr.IPv6.parser = function(string) {
var addr, k, len, match, octet, octets, zoneId;
if (ipv6Regexes['native'].test(string)) {
return expandIPv6(string, 8);
} else if (match = string.match(ipv6Regexes['transitional'])) {
zoneId = match[6] || '';
addr = expandIPv6(match[1].slice(0, -1) + zoneId, 6);
if (addr.parts) {
octets = [parseInt(match[2]), parseInt(match[3]), parseInt(match[4]), parseInt(match[5])];
for (k = 0, len = octets.length; k < len; k++) {
octet = octets[k];
if (!((0 <= octet && octet <= 255))) {
return null;
}
}
addr.parts.push(octets[0] << 8 | octets[1]);
addr.parts.push(octets[2] << 8 | octets[3]);
return {
parts: addr.parts,
zoneId: addr.zoneId
};
}
}
return null;
};
ipaddr.IPv4.isIPv4 = ipaddr.IPv6.isIPv6 = function(string) {
return this.parser(string) !== null;
};
ipaddr.IPv4.isValid = function(string) {
var e;
try {
new this(this.parser(string));
return true;
} catch (error1) {
e = error1;
return false;
}
};
ipaddr.IPv4.isValidFourPartDecimal = function(string) {
if (ipaddr.IPv4.isValid(string) && string.match(/^(0|[1-9]\d*)(\.(0|[1-9]\d*)){3}$/)) {
return true;
} else {
return false;
}
};
ipaddr.IPv6.isValid = function(string) {
var addr, e;
if (typeof string === "string" && string.indexOf(":") === -1) {
return false;
}
try {
addr = this.parser(string);
new this(addr.parts, addr.zoneId);
return true;
} catch (error1) {
e = error1;
return false;
}
};
ipaddr.IPv4.parse = function(string) {
var parts;
parts = this.parser(string);
if (parts === null) {
throw new Error("ipaddr: string is not formatted like ip address");
}
return new this(parts);
};
ipaddr.IPv6.parse = function(string) {
var addr;
addr = this.parser(string);
if (addr.parts === null) {
throw new Error("ipaddr: string is not formatted like ip address");
}
return new this(addr.parts, addr.zoneId);
};
ipaddr.IPv4.parseCIDR = function(string) {
var maskLength, match, parsed;
if (match = string.match(/^(.+)\/(\d+)$/)) {
maskLength = parseInt(match[2]);
if (maskLength >= 0 && maskLength <= 32) {
parsed = [this.parse(match[1]), maskLength];
Object.defineProperty(parsed, 'toString', {
value: function() {
return this.join('/');
}
});
return parsed;
}
}
throw new Error("ipaddr: string is not formatted like an IPv4 CIDR range");
};
ipaddr.IPv4.subnetMaskFromPrefixLength = function(prefix) {
var filledOctetCount, j, octets;
prefix = parseInt(prefix);
if (prefix < 0 || prefix > 32) {
throw new Error('ipaddr: invalid IPv4 prefix length');
}
octets = [0, 0, 0, 0];
j = 0;
filledOctetCount = Math.floor(prefix / 8);
while (j < filledOctetCount) {
octets[j] = 255;
j++;
}
if (filledOctetCount < 4) {
octets[filledOctetCount] = Math.pow(2, prefix % 8) - 1 << 8 - (prefix % 8);
}
return new this(octets);
};
ipaddr.IPv4.broadcastAddressFromCIDR = function(string) {
var cidr, error, i, ipInterfaceOctets, octets, subnetMaskOctets;
try {
cidr = this.parseCIDR(string);
ipInterfaceOctets = cidr[0].toByteArray();
subnetMaskOctets = this.subnetMaskFromPrefixLength(cidr[1]).toByteArray();
octets = [];
i = 0;
while (i < 4) {
octets.push(parseInt(ipInterfaceOctets[i], 10) | parseInt(subnetMaskOctets[i], 10) ^ 255);
i++;
}
return new this(octets);
} catch (error1) {
error = error1;
throw new Error('ipaddr: the address does not have IPv4 CIDR format');
}
};
ipaddr.IPv4.networkAddressFromCIDR = function(string) {
var cidr, error, i, ipInterfaceOctets, octets, subnetMaskOctets;
try {
cidr = this.parseCIDR(string);
ipInterfaceOctets = cidr[0].toByteArray();
subnetMaskOctets = this.subnetMaskFromPrefixLength(cidr[1]).toByteArray();
octets = [];
i = 0;
while (i < 4) {
octets.push(parseInt(ipInterfaceOctets[i], 10) & parseInt(subnetMaskOctets[i], 10));
i++;
}
return new this(octets);
} catch (error1) {
error = error1;
throw new Error('ipaddr: the address does not have IPv4 CIDR format');
}
};
ipaddr.IPv6.parseCIDR = function(string) {
var maskLength, match, parsed;
if (match = string.match(/^(.+)\/(\d+)$/)) {
maskLength = parseInt(match[2]);
if (maskLength >= 0 && maskLength <= 128) {
parsed = [this.parse(match[1]), maskLength];
Object.defineProperty(parsed, 'toString', {
value: function() {
return this.join('/');
}
});
return parsed;
}
}
throw new Error("ipaddr: string is not formatted like an IPv6 CIDR range");
};
ipaddr.isValid = function(string) {
return ipaddr.IPv6.isValid(string) || ipaddr.IPv4.isValid(string);
};
ipaddr.parse = function(string) {
if (ipaddr.IPv6.isValid(string)) {
return ipaddr.IPv6.parse(string);
} else if (ipaddr.IPv4.isValid(string)) {
return ipaddr.IPv4.parse(string);
} else {
throw new Error("ipaddr: the address has neither IPv6 nor IPv4 format");
}
};
ipaddr.parseCIDR = function(string) {
var e;
try {
return ipaddr.IPv6.parseCIDR(string);
} catch (error1) {
e = error1;
try {
return ipaddr.IPv4.parseCIDR(string);
} catch (error1) {
e = error1;
throw new Error("ipaddr: the address has neither IPv6 nor IPv4 CIDR format");
}
}
};
ipaddr.fromByteArray = function(bytes) {
var length;
length = bytes.length;
if (length === 4) {
return new ipaddr.IPv4(bytes);
} else if (length === 16) {
return new ipaddr.IPv6(bytes);
} else {
throw new Error("ipaddr: the binary input is neither an IPv6 nor IPv4 address");
}
};
ipaddr.process = function(string) {
var addr;
addr = this.parse(string);
if (addr.kind() === 'ipv6' && addr.isIPv4MappedAddress()) {
return addr.toIPv4Address();
} else {
return addr;
}
};
}).call(this);
},{}]},{},[1]);

File diff suppressed because one or more lines are too long

2
external_js/jquery-3.4.1.min.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@@ -1,164 +0,0 @@
/*!
DataTables 1.10.16
©2008-2017 SpryMedia Ltd - datatables.net/license
*/
(function(h){"function"===typeof define&&define.amd?define(["jquery"],function(E){return h(E,window,document)}):"object"===typeof exports?module.exports=function(E,G){E||(E=window);G||(G="undefined"!==typeof window?require("jquery"):require("jquery")(E));return h(G,E,E.document)}:h(jQuery,window,document)})(function(h,E,G,k){function X(a){var b,c,d={};h.each(a,function(e){if((b=e.match(/^([^A-Z]+?)([A-Z])/))&&-1!=="a aa ai ao as b fn i m o s ".indexOf(b[1]+" "))c=e.replace(b[0],b[2].toLowerCase()),
d[c]=e,"o"===b[1]&&X(a[e])});a._hungarianMap=d}function I(a,b,c){a._hungarianMap||X(a);var d;h.each(b,function(e){d=a._hungarianMap[e];if(d!==k&&(c||b[d]===k))"o"===d.charAt(0)?(b[d]||(b[d]={}),h.extend(!0,b[d],b[e]),I(a[d],b[d],c)):b[d]=b[e]})}function Ca(a){var b=m.defaults.oLanguage,c=a.sZeroRecords;!a.sEmptyTable&&(c&&"No data available in table"===b.sEmptyTable)&&F(a,a,"sZeroRecords","sEmptyTable");!a.sLoadingRecords&&(c&&"Loading..."===b.sLoadingRecords)&&F(a,a,"sZeroRecords","sLoadingRecords");
a.sInfoThousands&&(a.sThousands=a.sInfoThousands);(a=a.sDecimal)&&cb(a)}function db(a){A(a,"ordering","bSort");A(a,"orderMulti","bSortMulti");A(a,"orderClasses","bSortClasses");A(a,"orderCellsTop","bSortCellsTop");A(a,"order","aaSorting");A(a,"orderFixed","aaSortingFixed");A(a,"paging","bPaginate");A(a,"pagingType","sPaginationType");A(a,"pageLength","iDisplayLength");A(a,"searching","bFilter");"boolean"===typeof a.sScrollX&&(a.sScrollX=a.sScrollX?"100%":"");"boolean"===typeof a.scrollX&&(a.scrollX=
a.scrollX?"100%":"");if(a=a.aoSearchCols)for(var b=0,c=a.length;b<c;b++)a[b]&&I(m.models.oSearch,a[b])}function eb(a){A(a,"orderable","bSortable");A(a,"orderData","aDataSort");A(a,"orderSequence","asSorting");A(a,"orderDataType","sortDataType");var b=a.aDataSort;"number"===typeof b&&!h.isArray(b)&&(a.aDataSort=[b])}function fb(a){if(!m.__browser){var b={};m.__browser=b;var c=h("<div/>").css({position:"fixed",top:0,left:-1*h(E).scrollLeft(),height:1,width:1,overflow:"hidden"}).append(h("<div/>").css({position:"absolute",
top:1,left:1,width:100,overflow:"scroll"}).append(h("<div/>").css({width:"100%",height:10}))).appendTo("body"),d=c.children(),e=d.children();b.barWidth=d[0].offsetWidth-d[0].clientWidth;b.bScrollOversize=100===e[0].offsetWidth&&100!==d[0].clientWidth;b.bScrollbarLeft=1!==Math.round(e.offset().left);b.bBounding=c[0].getBoundingClientRect().width?!0:!1;c.remove()}h.extend(a.oBrowser,m.__browser);a.oScroll.iBarWidth=m.__browser.barWidth}function gb(a,b,c,d,e,f){var g,j=!1;c!==k&&(g=c,j=!0);for(;d!==
e;)a.hasOwnProperty(d)&&(g=j?b(g,a[d],d,a):a[d],j=!0,d+=f);return g}function Da(a,b){var c=m.defaults.column,d=a.aoColumns.length,c=h.extend({},m.models.oColumn,c,{nTh:b?b:G.createElement("th"),sTitle:c.sTitle?c.sTitle:b?b.innerHTML:"",aDataSort:c.aDataSort?c.aDataSort:[d],mData:c.mData?c.mData:d,idx:d});a.aoColumns.push(c);c=a.aoPreSearchCols;c[d]=h.extend({},m.models.oSearch,c[d]);ja(a,d,h(b).data())}function ja(a,b,c){var b=a.aoColumns[b],d=a.oClasses,e=h(b.nTh);if(!b.sWidthOrig){b.sWidthOrig=
e.attr("width")||null;var f=(e.attr("style")||"").match(/width:\s*(\d+[pxem%]+)/);f&&(b.sWidthOrig=f[1])}c!==k&&null!==c&&(eb(c),I(m.defaults.column,c),c.mDataProp!==k&&!c.mData&&(c.mData=c.mDataProp),c.sType&&(b._sManualType=c.sType),c.className&&!c.sClass&&(c.sClass=c.className),c.sClass&&e.addClass(c.sClass),h.extend(b,c),F(b,c,"sWidth","sWidthOrig"),c.iDataSort!==k&&(b.aDataSort=[c.iDataSort]),F(b,c,"aDataSort"));var g=b.mData,j=Q(g),i=b.mRender?Q(b.mRender):null,c=function(a){return"string"===
typeof a&&-1!==a.indexOf("@")};b._bAttrSrc=h.isPlainObject(g)&&(c(g.sort)||c(g.type)||c(g.filter));b._setter=null;b.fnGetData=function(a,b,c){var d=j(a,b,k,c);return i&&b?i(d,b,a,c):d};b.fnSetData=function(a,b,c){return R(g)(a,b,c)};"number"!==typeof g&&(a._rowReadObject=!0);a.oFeatures.bSort||(b.bSortable=!1,e.addClass(d.sSortableNone));a=-1!==h.inArray("asc",b.asSorting);c=-1!==h.inArray("desc",b.asSorting);!b.bSortable||!a&&!c?(b.sSortingClass=d.sSortableNone,b.sSortingClassJUI=""):a&&!c?(b.sSortingClass=
d.sSortableAsc,b.sSortingClassJUI=d.sSortJUIAscAllowed):!a&&c?(b.sSortingClass=d.sSortableDesc,b.sSortingClassJUI=d.sSortJUIDescAllowed):(b.sSortingClass=d.sSortable,b.sSortingClassJUI=d.sSortJUI)}function Y(a){if(!1!==a.oFeatures.bAutoWidth){var b=a.aoColumns;Ea(a);for(var c=0,d=b.length;c<d;c++)b[c].nTh.style.width=b[c].sWidth}b=a.oScroll;(""!==b.sY||""!==b.sX)&&ka(a);r(a,null,"column-sizing",[a])}function Z(a,b){var c=la(a,"bVisible");return"number"===typeof c[b]?c[b]:null}function $(a,b){var c=
la(a,"bVisible"),c=h.inArray(b,c);return-1!==c?c:null}function aa(a){var b=0;h.each(a.aoColumns,function(a,d){d.bVisible&&"none"!==h(d.nTh).css("display")&&b++});return b}function la(a,b){var c=[];h.map(a.aoColumns,function(a,e){a[b]&&c.push(e)});return c}function Fa(a){var b=a.aoColumns,c=a.aoData,d=m.ext.type.detect,e,f,g,j,i,h,l,q,t;e=0;for(f=b.length;e<f;e++)if(l=b[e],t=[],!l.sType&&l._sManualType)l.sType=l._sManualType;else if(!l.sType){g=0;for(j=d.length;g<j;g++){i=0;for(h=c.length;i<h;i++){t[i]===
k&&(t[i]=B(a,i,e,"type"));q=d[g](t[i],a);if(!q&&g!==d.length-1)break;if("html"===q)break}if(q){l.sType=q;break}}l.sType||(l.sType="string")}}function hb(a,b,c,d){var e,f,g,j,i,n,l=a.aoColumns;if(b)for(e=b.length-1;0<=e;e--){n=b[e];var q=n.targets!==k?n.targets:n.aTargets;h.isArray(q)||(q=[q]);f=0;for(g=q.length;f<g;f++)if("number"===typeof q[f]&&0<=q[f]){for(;l.length<=q[f];)Da(a);d(q[f],n)}else if("number"===typeof q[f]&&0>q[f])d(l.length+q[f],n);else if("string"===typeof q[f]){j=0;for(i=l.length;j<
i;j++)("_all"==q[f]||h(l[j].nTh).hasClass(q[f]))&&d(j,n)}}if(c){e=0;for(a=c.length;e<a;e++)d(e,c[e])}}function M(a,b,c,d){var e=a.aoData.length,f=h.extend(!0,{},m.models.oRow,{src:c?"dom":"data",idx:e});f._aData=b;a.aoData.push(f);for(var g=a.aoColumns,j=0,i=g.length;j<i;j++)g[j].sType=null;a.aiDisplayMaster.push(e);b=a.rowIdFn(b);b!==k&&(a.aIds[b]=f);(c||!a.oFeatures.bDeferRender)&&Ga(a,e,c,d);return e}function ma(a,b){var c;b instanceof h||(b=h(b));return b.map(function(b,e){c=Ha(a,e);return M(a,
c.data,e,c.cells)})}function B(a,b,c,d){var e=a.iDraw,f=a.aoColumns[c],g=a.aoData[b]._aData,j=f.sDefaultContent,i=f.fnGetData(g,d,{settings:a,row:b,col:c});if(i===k)return a.iDrawError!=e&&null===j&&(J(a,0,"Requested unknown parameter "+("function"==typeof f.mData?"{function}":"'"+f.mData+"'")+" for row "+b+", column "+c,4),a.iDrawError=e),j;if((i===g||null===i)&&null!==j&&d!==k)i=j;else if("function"===typeof i)return i.call(g);return null===i&&"display"==d?"":i}function ib(a,b,c,d){a.aoColumns[c].fnSetData(a.aoData[b]._aData,
d,{settings:a,row:b,col:c})}function Ia(a){return h.map(a.match(/(\\.|[^\.])+/g)||[""],function(a){return a.replace(/\\\./g,".")})}function Q(a){if(h.isPlainObject(a)){var b={};h.each(a,function(a,c){c&&(b[a]=Q(c))});return function(a,c,f,g){var j=b[c]||b._;return j!==k?j(a,c,f,g):a}}if(null===a)return function(a){return a};if("function"===typeof a)return function(b,c,f,g){return a(b,c,f,g)};if("string"===typeof a&&(-1!==a.indexOf(".")||-1!==a.indexOf("[")||-1!==a.indexOf("("))){var c=function(a,
b,f){var g,j;if(""!==f){j=Ia(f);for(var i=0,n=j.length;i<n;i++){f=j[i].match(ba);g=j[i].match(U);if(f){j[i]=j[i].replace(ba,"");""!==j[i]&&(a=a[j[i]]);g=[];j.splice(0,i+1);j=j.join(".");if(h.isArray(a)){i=0;for(n=a.length;i<n;i++)g.push(c(a[i],b,j))}a=f[0].substring(1,f[0].length-1);a=""===a?g:g.join(a);break}else if(g){j[i]=j[i].replace(U,"");a=a[j[i]]();continue}if(null===a||a[j[i]]===k)return k;a=a[j[i]]}}return a};return function(b,e){return c(b,e,a)}}return function(b){return b[a]}}function R(a){if(h.isPlainObject(a))return R(a._);
if(null===a)return function(){};if("function"===typeof a)return function(b,d,e){a(b,"set",d,e)};if("string"===typeof a&&(-1!==a.indexOf(".")||-1!==a.indexOf("[")||-1!==a.indexOf("("))){var b=function(a,d,e){var e=Ia(e),f;f=e[e.length-1];for(var g,j,i=0,n=e.length-1;i<n;i++){g=e[i].match(ba);j=e[i].match(U);if(g){e[i]=e[i].replace(ba,"");a[e[i]]=[];f=e.slice();f.splice(0,i+1);g=f.join(".");if(h.isArray(d)){j=0;for(n=d.length;j<n;j++)f={},b(f,d[j],g),a[e[i]].push(f)}else a[e[i]]=d;return}j&&(e[i]=e[i].replace(U,
""),a=a[e[i]](d));if(null===a[e[i]]||a[e[i]]===k)a[e[i]]={};a=a[e[i]]}if(f.match(U))a[f.replace(U,"")](d);else a[f.replace(ba,"")]=d};return function(c,d){return b(c,d,a)}}return function(b,d){b[a]=d}}function Ja(a){return D(a.aoData,"_aData")}function na(a){a.aoData.length=0;a.aiDisplayMaster.length=0;a.aiDisplay.length=0;a.aIds={}}function oa(a,b,c){for(var d=-1,e=0,f=a.length;e<f;e++)a[e]==b?d=e:a[e]>b&&a[e]--; -1!=d&&c===k&&a.splice(d,1)}function ca(a,b,c,d){var e=a.aoData[b],f,g=function(c,d){for(;c.childNodes.length;)c.removeChild(c.firstChild);
c.innerHTML=B(a,b,d,"display")};if("dom"===c||(!c||"auto"===c)&&"dom"===e.src)e._aData=Ha(a,e,d,d===k?k:e._aData).data;else{var j=e.anCells;if(j)if(d!==k)g(j[d],d);else{c=0;for(f=j.length;c<f;c++)g(j[c],c)}}e._aSortData=null;e._aFilterData=null;g=a.aoColumns;if(d!==k)g[d].sType=null;else{c=0;for(f=g.length;c<f;c++)g[c].sType=null;Ka(a,e)}}function Ha(a,b,c,d){var e=[],f=b.firstChild,g,j,i=0,n,l=a.aoColumns,q=a._rowReadObject,d=d!==k?d:q?{}:[],t=function(a,b){if("string"===typeof a){var c=a.indexOf("@");
-1!==c&&(c=a.substring(c+1),R(a)(d,b.getAttribute(c)))}},m=function(a){if(c===k||c===i)j=l[i],n=h.trim(a.innerHTML),j&&j._bAttrSrc?(R(j.mData._)(d,n),t(j.mData.sort,a),t(j.mData.type,a),t(j.mData.filter,a)):q?(j._setter||(j._setter=R(j.mData)),j._setter(d,n)):d[i]=n;i++};if(f)for(;f;){g=f.nodeName.toUpperCase();if("TD"==g||"TH"==g)m(f),e.push(f);f=f.nextSibling}else{e=b.anCells;f=0;for(g=e.length;f<g;f++)m(e[f])}if(b=b.firstChild?b:b.nTr)(b=b.getAttribute("id"))&&R(a.rowId)(d,b);return{data:d,cells:e}}
function Ga(a,b,c,d){var e=a.aoData[b],f=e._aData,g=[],j,i,n,l,q;if(null===e.nTr){j=c||G.createElement("tr");e.nTr=j;e.anCells=g;j._DT_RowIndex=b;Ka(a,e);l=0;for(q=a.aoColumns.length;l<q;l++){n=a.aoColumns[l];i=c?d[l]:G.createElement(n.sCellType);i._DT_CellIndex={row:b,column:l};g.push(i);if((!c||n.mRender||n.mData!==l)&&(!h.isPlainObject(n.mData)||n.mData._!==l+".display"))i.innerHTML=B(a,b,l,"display");n.sClass&&(i.className+=" "+n.sClass);n.bVisible&&!c?j.appendChild(i):!n.bVisible&&c&&i.parentNode.removeChild(i);
n.fnCreatedCell&&n.fnCreatedCell.call(a.oInstance,i,B(a,b,l),f,b,l)}r(a,"aoRowCreatedCallback",null,[j,f,b])}e.nTr.setAttribute("role","row")}function Ka(a,b){var c=b.nTr,d=b._aData;if(c){var e=a.rowIdFn(d);e&&(c.id=e);d.DT_RowClass&&(e=d.DT_RowClass.split(" "),b.__rowc=b.__rowc?qa(b.__rowc.concat(e)):e,h(c).removeClass(b.__rowc.join(" ")).addClass(d.DT_RowClass));d.DT_RowAttr&&h(c).attr(d.DT_RowAttr);d.DT_RowData&&h(c).data(d.DT_RowData)}}function jb(a){var b,c,d,e,f,g=a.nTHead,j=a.nTFoot,i=0===
h("th, td",g).length,n=a.oClasses,l=a.aoColumns;i&&(e=h("<tr/>").appendTo(g));b=0;for(c=l.length;b<c;b++)f=l[b],d=h(f.nTh).addClass(f.sClass),i&&d.appendTo(e),a.oFeatures.bSort&&(d.addClass(f.sSortingClass),!1!==f.bSortable&&(d.attr("tabindex",a.iTabIndex).attr("aria-controls",a.sTableId),La(a,f.nTh,b))),f.sTitle!=d[0].innerHTML&&d.html(f.sTitle),Ma(a,"header")(a,d,f,n);i&&da(a.aoHeader,g);h(g).find(">tr").attr("role","row");h(g).find(">tr>th, >tr>td").addClass(n.sHeaderTH);h(j).find(">tr>th, >tr>td").addClass(n.sFooterTH);
if(null!==j){a=a.aoFooter[0];b=0;for(c=a.length;b<c;b++)f=l[b],f.nTf=a[b].cell,f.sClass&&h(f.nTf).addClass(f.sClass)}}function ea(a,b,c){var d,e,f,g=[],j=[],i=a.aoColumns.length,n;if(b){c===k&&(c=!1);d=0;for(e=b.length;d<e;d++){g[d]=b[d].slice();g[d].nTr=b[d].nTr;for(f=i-1;0<=f;f--)!a.aoColumns[f].bVisible&&!c&&g[d].splice(f,1);j.push([])}d=0;for(e=g.length;d<e;d++){if(a=g[d].nTr)for(;f=a.firstChild;)a.removeChild(f);f=0;for(b=g[d].length;f<b;f++)if(n=i=1,j[d][f]===k){a.appendChild(g[d][f].cell);
for(j[d][f]=1;g[d+i]!==k&&g[d][f].cell==g[d+i][f].cell;)j[d+i][f]=1,i++;for(;g[d][f+n]!==k&&g[d][f].cell==g[d][f+n].cell;){for(c=0;c<i;c++)j[d+c][f+n]=1;n++}h(g[d][f].cell).attr("rowspan",i).attr("colspan",n)}}}}function N(a){var b=r(a,"aoPreDrawCallback","preDraw",[a]);if(-1!==h.inArray(!1,b))C(a,!1);else{var b=[],c=0,d=a.asStripeClasses,e=d.length,f=a.oLanguage,g=a.iInitDisplayStart,j="ssp"==y(a),i=a.aiDisplay;a.bDrawing=!0;g!==k&&-1!==g&&(a._iDisplayStart=j?g:g>=a.fnRecordsDisplay()?0:g,a.iInitDisplayStart=
-1);var g=a._iDisplayStart,n=a.fnDisplayEnd();if(a.bDeferLoading)a.bDeferLoading=!1,a.iDraw++,C(a,!1);else if(j){if(!a.bDestroying&&!kb(a))return}else a.iDraw++;if(0!==i.length){f=j?a.aoData.length:n;for(j=j?0:g;j<f;j++){var l=i[j],q=a.aoData[l];null===q.nTr&&Ga(a,l);l=q.nTr;if(0!==e){var t=d[c%e];q._sRowStripe!=t&&(h(l).removeClass(q._sRowStripe).addClass(t),q._sRowStripe=t)}r(a,"aoRowCallback",null,[l,q._aData,c,j]);b.push(l);c++}}else c=f.sZeroRecords,1==a.iDraw&&"ajax"==y(a)?c=f.sLoadingRecords:
f.sEmptyTable&&0===a.fnRecordsTotal()&&(c=f.sEmptyTable),b[0]=h("<tr/>",{"class":e?d[0]:""}).append(h("<td />",{valign:"top",colSpan:aa(a),"class":a.oClasses.sRowEmpty}).html(c))[0];r(a,"aoHeaderCallback","header",[h(a.nTHead).children("tr")[0],Ja(a),g,n,i]);r(a,"aoFooterCallback","footer",[h(a.nTFoot).children("tr")[0],Ja(a),g,n,i]);d=h(a.nTBody);d.children().detach();d.append(h(b));r(a,"aoDrawCallback","draw",[a]);a.bSorted=!1;a.bFiltered=!1;a.bDrawing=!1}}function S(a,b){var c=a.oFeatures,d=c.bFilter;
c.bSort&&lb(a);d?fa(a,a.oPreviousSearch):a.aiDisplay=a.aiDisplayMaster.slice();!0!==b&&(a._iDisplayStart=0);a._drawHold=b;N(a);a._drawHold=!1}function mb(a){var b=a.oClasses,c=h(a.nTable),c=h("<div/>").insertBefore(c),d=a.oFeatures,e=h("<div/>",{id:a.sTableId+"_wrapper","class":b.sWrapper+(a.nTFoot?"":" "+b.sNoFooter)});a.nHolding=c[0];a.nTableWrapper=e[0];a.nTableReinsertBefore=a.nTable.nextSibling;for(var f=a.sDom.split(""),g,j,i,n,l,q,k=0;k<f.length;k++){g=null;j=f[k];if("<"==j){i=h("<div/>")[0];
n=f[k+1];if("'"==n||'"'==n){l="";for(q=2;f[k+q]!=n;)l+=f[k+q],q++;"H"==l?l=b.sJUIHeader:"F"==l&&(l=b.sJUIFooter);-1!=l.indexOf(".")?(n=l.split("."),i.id=n[0].substr(1,n[0].length-1),i.className=n[1]):"#"==l.charAt(0)?i.id=l.substr(1,l.length-1):i.className=l;k+=q}e.append(i);e=h(i)}else if(">"==j)e=e.parent();else if("l"==j&&d.bPaginate&&d.bLengthChange)g=nb(a);else if("f"==j&&d.bFilter)g=ob(a);else if("r"==j&&d.bProcessing)g=pb(a);else if("t"==j)g=qb(a);else if("i"==j&&d.bInfo)g=rb(a);else if("p"==
j&&d.bPaginate)g=sb(a);else if(0!==m.ext.feature.length){i=m.ext.feature;q=0;for(n=i.length;q<n;q++)if(j==i[q].cFeature){g=i[q].fnInit(a);break}}g&&(i=a.aanFeatures,i[j]||(i[j]=[]),i[j].push(g),e.append(g))}c.replaceWith(e);a.nHolding=null}function da(a,b){var c=h(b).children("tr"),d,e,f,g,j,i,n,l,q,k;a.splice(0,a.length);f=0;for(i=c.length;f<i;f++)a.push([]);f=0;for(i=c.length;f<i;f++){d=c[f];for(e=d.firstChild;e;){if("TD"==e.nodeName.toUpperCase()||"TH"==e.nodeName.toUpperCase()){l=1*e.getAttribute("colspan");
q=1*e.getAttribute("rowspan");l=!l||0===l||1===l?1:l;q=!q||0===q||1===q?1:q;g=0;for(j=a[f];j[g];)g++;n=g;k=1===l?!0:!1;for(j=0;j<l;j++)for(g=0;g<q;g++)a[f+g][n+j]={cell:e,unique:k},a[f+g].nTr=d}e=e.nextSibling}}}function ra(a,b,c){var d=[];c||(c=a.aoHeader,b&&(c=[],da(c,b)));for(var b=0,e=c.length;b<e;b++)for(var f=0,g=c[b].length;f<g;f++)if(c[b][f].unique&&(!d[f]||!a.bSortCellsTop))d[f]=c[b][f].cell;return d}function sa(a,b,c){r(a,"aoServerParams","serverParams",[b]);if(b&&h.isArray(b)){var d={},
e=/(.*?)\[\]$/;h.each(b,function(a,b){var c=b.name.match(e);c?(c=c[0],d[c]||(d[c]=[]),d[c].push(b.value)):d[b.name]=b.value});b=d}var f,g=a.ajax,j=a.oInstance,i=function(b){r(a,null,"xhr",[a,b,a.jqXHR]);c(b)};if(h.isPlainObject(g)&&g.data){f=g.data;var n=h.isFunction(f)?f(b,a):f,b=h.isFunction(f)&&n?n:h.extend(!0,b,n);delete g.data}n={data:b,success:function(b){var c=b.error||b.sError;c&&J(a,0,c);a.json=b;i(b)},dataType:"json",cache:!1,type:a.sServerMethod,error:function(b,c){var d=r(a,null,"xhr",
[a,null,a.jqXHR]);-1===h.inArray(!0,d)&&("parsererror"==c?J(a,0,"Invalid JSON response",1):4===b.readyState&&J(a,0,"Ajax error",7));C(a,!1)}};a.oAjaxData=b;r(a,null,"preXhr",[a,b]);a.fnServerData?a.fnServerData.call(j,a.sAjaxSource,h.map(b,function(a,b){return{name:b,value:a}}),i,a):a.sAjaxSource||"string"===typeof g?a.jqXHR=h.ajax(h.extend(n,{url:g||a.sAjaxSource})):h.isFunction(g)?a.jqXHR=g.call(j,b,i,a):(a.jqXHR=h.ajax(h.extend(n,g)),g.data=f)}function kb(a){return a.bAjaxDataGet?(a.iDraw++,C(a,
!0),sa(a,tb(a),function(b){ub(a,b)}),!1):!0}function tb(a){var b=a.aoColumns,c=b.length,d=a.oFeatures,e=a.oPreviousSearch,f=a.aoPreSearchCols,g,j=[],i,n,l,k=V(a);g=a._iDisplayStart;i=!1!==d.bPaginate?a._iDisplayLength:-1;var t=function(a,b){j.push({name:a,value:b})};t("sEcho",a.iDraw);t("iColumns",c);t("sColumns",D(b,"sName").join(","));t("iDisplayStart",g);t("iDisplayLength",i);var pa={draw:a.iDraw,columns:[],order:[],start:g,length:i,search:{value:e.sSearch,regex:e.bRegex}};for(g=0;g<c;g++)n=b[g],
l=f[g],i="function"==typeof n.mData?"function":n.mData,pa.columns.push({data:i,name:n.sName,searchable:n.bSearchable,orderable:n.bSortable,search:{value:l.sSearch,regex:l.bRegex}}),t("mDataProp_"+g,i),d.bFilter&&(t("sSearch_"+g,l.sSearch),t("bRegex_"+g,l.bRegex),t("bSearchable_"+g,n.bSearchable)),d.bSort&&t("bSortable_"+g,n.bSortable);d.bFilter&&(t("sSearch",e.sSearch),t("bRegex",e.bRegex));d.bSort&&(h.each(k,function(a,b){pa.order.push({column:b.col,dir:b.dir});t("iSortCol_"+a,b.col);t("sSortDir_"+
a,b.dir)}),t("iSortingCols",k.length));b=m.ext.legacy.ajax;return null===b?a.sAjaxSource?j:pa:b?j:pa}function ub(a,b){var c=ta(a,b),d=b.sEcho!==k?b.sEcho:b.draw,e=b.iTotalRecords!==k?b.iTotalRecords:b.recordsTotal,f=b.iTotalDisplayRecords!==k?b.iTotalDisplayRecords:b.recordsFiltered;if(d){if(1*d<a.iDraw)return;a.iDraw=1*d}na(a);a._iRecordsTotal=parseInt(e,10);a._iRecordsDisplay=parseInt(f,10);d=0;for(e=c.length;d<e;d++)M(a,c[d]);a.aiDisplay=a.aiDisplayMaster.slice();a.bAjaxDataGet=!1;N(a);a._bInitComplete||
ua(a,b);a.bAjaxDataGet=!0;C(a,!1)}function ta(a,b){var c=h.isPlainObject(a.ajax)&&a.ajax.dataSrc!==k?a.ajax.dataSrc:a.sAjaxDataProp;return"data"===c?b.aaData||b[c]:""!==c?Q(c)(b):b}function ob(a){var b=a.oClasses,c=a.sTableId,d=a.oLanguage,e=a.oPreviousSearch,f=a.aanFeatures,g='<input type="search" class="'+b.sFilterInput+'"/>',j=d.sSearch,j=j.match(/_INPUT_/)?j.replace("_INPUT_",g):j+g,b=h("<div/>",{id:!f.f?c+"_filter":null,"class":b.sFilter}).append(h("<label/>").append(j)),f=function(){var b=!this.value?
"":this.value;b!=e.sSearch&&(fa(a,{sSearch:b,bRegex:e.bRegex,bSmart:e.bSmart,bCaseInsensitive:e.bCaseInsensitive}),a._iDisplayStart=0,N(a))},g=null!==a.searchDelay?a.searchDelay:"ssp"===y(a)?400:0,i=h("input",b).val(e.sSearch).attr("placeholder",d.sSearchPlaceholder).on("keyup.DT search.DT input.DT paste.DT cut.DT",g?Na(f,g):f).on("keypress.DT",function(a){if(13==a.keyCode)return!1}).attr("aria-controls",c);h(a.nTable).on("search.dt.DT",function(b,c){if(a===c)try{i[0]!==G.activeElement&&i.val(e.sSearch)}catch(d){}});
return b[0]}function fa(a,b,c){var d=a.oPreviousSearch,e=a.aoPreSearchCols,f=function(a){d.sSearch=a.sSearch;d.bRegex=a.bRegex;d.bSmart=a.bSmart;d.bCaseInsensitive=a.bCaseInsensitive};Fa(a);if("ssp"!=y(a)){vb(a,b.sSearch,c,b.bEscapeRegex!==k?!b.bEscapeRegex:b.bRegex,b.bSmart,b.bCaseInsensitive);f(b);for(b=0;b<e.length;b++)wb(a,e[b].sSearch,b,e[b].bEscapeRegex!==k?!e[b].bEscapeRegex:e[b].bRegex,e[b].bSmart,e[b].bCaseInsensitive);xb(a)}else f(b);a.bFiltered=!0;r(a,null,"search",[a])}function xb(a){for(var b=
m.ext.search,c=a.aiDisplay,d,e,f=0,g=b.length;f<g;f++){for(var j=[],i=0,n=c.length;i<n;i++)e=c[i],d=a.aoData[e],b[f](a,d._aFilterData,e,d._aData,i)&&j.push(e);c.length=0;h.merge(c,j)}}function wb(a,b,c,d,e,f){if(""!==b){for(var g=[],j=a.aiDisplay,d=Oa(b,d,e,f),e=0;e<j.length;e++)b=a.aoData[j[e]]._aFilterData[c],d.test(b)&&g.push(j[e]);a.aiDisplay=g}}function vb(a,b,c,d,e,f){var d=Oa(b,d,e,f),f=a.oPreviousSearch.sSearch,g=a.aiDisplayMaster,j,e=[];0!==m.ext.search.length&&(c=!0);j=yb(a);if(0>=b.length)a.aiDisplay=
g.slice();else{if(j||c||f.length>b.length||0!==b.indexOf(f)||a.bSorted)a.aiDisplay=g.slice();b=a.aiDisplay;for(c=0;c<b.length;c++)d.test(a.aoData[b[c]]._sFilterRow)&&e.push(b[c]);a.aiDisplay=e}}function Oa(a,b,c,d){a=b?a:Pa(a);c&&(a="^(?=.*?"+h.map(a.match(/"[^"]+"|[^ ]+/g)||[""],function(a){if('"'===a.charAt(0))var b=a.match(/^"(.*)"$/),a=b?b[1]:a;return a.replace('"',"")}).join(")(?=.*?")+").*$");return RegExp(a,d?"i":"")}function yb(a){var b=a.aoColumns,c,d,e,f,g,j,i,h,l=m.ext.type.search;c=!1;
d=0;for(f=a.aoData.length;d<f;d++)if(h=a.aoData[d],!h._aFilterData){j=[];e=0;for(g=b.length;e<g;e++)c=b[e],c.bSearchable?(i=B(a,d,e,"filter"),l[c.sType]&&(i=l[c.sType](i)),null===i&&(i=""),"string"!==typeof i&&i.toString&&(i=i.toString())):i="",i.indexOf&&-1!==i.indexOf("&")&&(va.innerHTML=i,i=Wb?va.textContent:va.innerText),i.replace&&(i=i.replace(/[\r\n]/g,"")),j.push(i);h._aFilterData=j;h._sFilterRow=j.join(" ");c=!0}return c}function zb(a){return{search:a.sSearch,smart:a.bSmart,regex:a.bRegex,
caseInsensitive:a.bCaseInsensitive}}function Ab(a){return{sSearch:a.search,bSmart:a.smart,bRegex:a.regex,bCaseInsensitive:a.caseInsensitive}}function rb(a){var b=a.sTableId,c=a.aanFeatures.i,d=h("<div/>",{"class":a.oClasses.sInfo,id:!c?b+"_info":null});c||(a.aoDrawCallback.push({fn:Bb,sName:"information"}),d.attr("role","status").attr("aria-live","polite"),h(a.nTable).attr("aria-describedby",b+"_info"));return d[0]}function Bb(a){var b=a.aanFeatures.i;if(0!==b.length){var c=a.oLanguage,d=a._iDisplayStart+
1,e=a.fnDisplayEnd(),f=a.fnRecordsTotal(),g=a.fnRecordsDisplay(),j=g?c.sInfo:c.sInfoEmpty;g!==f&&(j+=" "+c.sInfoFiltered);j+=c.sInfoPostFix;j=Cb(a,j);c=c.fnInfoCallback;null!==c&&(j=c.call(a.oInstance,a,d,e,f,g,j));h(b).html(j)}}function Cb(a,b){var c=a.fnFormatNumber,d=a._iDisplayStart+1,e=a._iDisplayLength,f=a.fnRecordsDisplay(),g=-1===e;return b.replace(/_START_/g,c.call(a,d)).replace(/_END_/g,c.call(a,a.fnDisplayEnd())).replace(/_MAX_/g,c.call(a,a.fnRecordsTotal())).replace(/_TOTAL_/g,c.call(a,
f)).replace(/_PAGE_/g,c.call(a,g?1:Math.ceil(d/e))).replace(/_PAGES_/g,c.call(a,g?1:Math.ceil(f/e)))}function ga(a){var b,c,d=a.iInitDisplayStart,e=a.aoColumns,f;c=a.oFeatures;var g=a.bDeferLoading;if(a.bInitialised){mb(a);jb(a);ea(a,a.aoHeader);ea(a,a.aoFooter);C(a,!0);c.bAutoWidth&&Ea(a);b=0;for(c=e.length;b<c;b++)f=e[b],f.sWidth&&(f.nTh.style.width=v(f.sWidth));r(a,null,"preInit",[a]);S(a);e=y(a);if("ssp"!=e||g)"ajax"==e?sa(a,[],function(c){var f=ta(a,c);for(b=0;b<f.length;b++)M(a,f[b]);a.iInitDisplayStart=
d;S(a);C(a,!1);ua(a,c)},a):(C(a,!1),ua(a))}else setTimeout(function(){ga(a)},200)}function ua(a,b){a._bInitComplete=!0;(b||a.oInit.aaData)&&Y(a);r(a,null,"plugin-init",[a,b]);r(a,"aoInitComplete","init",[a,b])}function Qa(a,b){var c=parseInt(b,10);a._iDisplayLength=c;Ra(a);r(a,null,"length",[a,c])}function nb(a){for(var b=a.oClasses,c=a.sTableId,d=a.aLengthMenu,e=h.isArray(d[0]),f=e?d[0]:d,d=e?d[1]:d,e=h("<select/>",{name:c+"_length","aria-controls":c,"class":b.sLengthSelect}),g=0,j=f.length;g<j;g++)e[0][g]=
new Option("number"===typeof d[g]?a.fnFormatNumber(d[g]):d[g],f[g]);var i=h("<div><label/></div>").addClass(b.sLength);a.aanFeatures.l||(i[0].id=c+"_length");i.children().append(a.oLanguage.sLengthMenu.replace("_MENU_",e[0].outerHTML));h("select",i).val(a._iDisplayLength).on("change.DT",function(){Qa(a,h(this).val());N(a)});h(a.nTable).on("length.dt.DT",function(b,c,d){a===c&&h("select",i).val(d)});return i[0]}function sb(a){var b=a.sPaginationType,c=m.ext.pager[b],d="function"===typeof c,e=function(a){N(a)},
b=h("<div/>").addClass(a.oClasses.sPaging+b)[0],f=a.aanFeatures;d||c.fnInit(a,b,e);f.p||(b.id=a.sTableId+"_paginate",a.aoDrawCallback.push({fn:function(a){if(d){var b=a._iDisplayStart,i=a._iDisplayLength,h=a.fnRecordsDisplay(),l=-1===i,b=l?0:Math.ceil(b/i),i=l?1:Math.ceil(h/i),h=c(b,i),k,l=0;for(k=f.p.length;l<k;l++)Ma(a,"pageButton")(a,f.p[l],l,h,b,i)}else c.fnUpdate(a,e)},sName:"pagination"}));return b}function Sa(a,b,c){var d=a._iDisplayStart,e=a._iDisplayLength,f=a.fnRecordsDisplay();0===f||-1===
e?d=0:"number"===typeof b?(d=b*e,d>f&&(d=0)):"first"==b?d=0:"previous"==b?(d=0<=e?d-e:0,0>d&&(d=0)):"next"==b?d+e<f&&(d+=e):"last"==b?d=Math.floor((f-1)/e)*e:J(a,0,"Unknown paging action: "+b,5);b=a._iDisplayStart!==d;a._iDisplayStart=d;b&&(r(a,null,"page",[a]),c&&N(a));return b}function pb(a){return h("<div/>",{id:!a.aanFeatures.r?a.sTableId+"_processing":null,"class":a.oClasses.sProcessing}).html(a.oLanguage.sProcessing).insertBefore(a.nTable)[0]}function C(a,b){a.oFeatures.bProcessing&&h(a.aanFeatures.r).css("display",
b?"block":"none");r(a,null,"processing",[a,b])}function qb(a){var b=h(a.nTable);b.attr("role","grid");var c=a.oScroll;if(""===c.sX&&""===c.sY)return a.nTable;var d=c.sX,e=c.sY,f=a.oClasses,g=b.children("caption"),j=g.length?g[0]._captionSide:null,i=h(b[0].cloneNode(!1)),n=h(b[0].cloneNode(!1)),l=b.children("tfoot");l.length||(l=null);i=h("<div/>",{"class":f.sScrollWrapper}).append(h("<div/>",{"class":f.sScrollHead}).css({overflow:"hidden",position:"relative",border:0,width:d?!d?null:v(d):"100%"}).append(h("<div/>",
{"class":f.sScrollHeadInner}).css({"box-sizing":"content-box",width:c.sXInner||"100%"}).append(i.removeAttr("id").css("margin-left",0).append("top"===j?g:null).append(b.children("thead"))))).append(h("<div/>",{"class":f.sScrollBody}).css({position:"relative",overflow:"auto",width:!d?null:v(d)}).append(b));l&&i.append(h("<div/>",{"class":f.sScrollFoot}).css({overflow:"hidden",border:0,width:d?!d?null:v(d):"100%"}).append(h("<div/>",{"class":f.sScrollFootInner}).append(n.removeAttr("id").css("margin-left",
0).append("bottom"===j?g:null).append(b.children("tfoot")))));var b=i.children(),k=b[0],f=b[1],t=l?b[2]:null;if(d)h(f).on("scroll.DT",function(){var a=this.scrollLeft;k.scrollLeft=a;l&&(t.scrollLeft=a)});h(f).css(e&&c.bCollapse?"max-height":"height",e);a.nScrollHead=k;a.nScrollBody=f;a.nScrollFoot=t;a.aoDrawCallback.push({fn:ka,sName:"scrolling"});return i[0]}function ka(a){var b=a.oScroll,c=b.sX,d=b.sXInner,e=b.sY,b=b.iBarWidth,f=h(a.nScrollHead),g=f[0].style,j=f.children("div"),i=j[0].style,n=j.children("table"),
j=a.nScrollBody,l=h(j),q=j.style,t=h(a.nScrollFoot).children("div"),m=t.children("table"),o=h(a.nTHead),p=h(a.nTable),s=p[0],r=s.style,u=a.nTFoot?h(a.nTFoot):null,x=a.oBrowser,T=x.bScrollOversize,Xb=D(a.aoColumns,"nTh"),O,K,P,w,Ta=[],y=[],z=[],A=[],B,C=function(a){a=a.style;a.paddingTop="0";a.paddingBottom="0";a.borderTopWidth="0";a.borderBottomWidth="0";a.height=0};K=j.scrollHeight>j.clientHeight;if(a.scrollBarVis!==K&&a.scrollBarVis!==k)a.scrollBarVis=K,Y(a);else{a.scrollBarVis=K;p.children("thead, tfoot").remove();
u&&(P=u.clone().prependTo(p),O=u.find("tr"),P=P.find("tr"));w=o.clone().prependTo(p);o=o.find("tr");K=w.find("tr");w.find("th, td").removeAttr("tabindex");c||(q.width="100%",f[0].style.width="100%");h.each(ra(a,w),function(b,c){B=Z(a,b);c.style.width=a.aoColumns[B].sWidth});u&&H(function(a){a.style.width=""},P);f=p.outerWidth();if(""===c){r.width="100%";if(T&&(p.find("tbody").height()>j.offsetHeight||"scroll"==l.css("overflow-y")))r.width=v(p.outerWidth()-b);f=p.outerWidth()}else""!==d&&(r.width=
v(d),f=p.outerWidth());H(C,K);H(function(a){z.push(a.innerHTML);Ta.push(v(h(a).css("width")))},K);H(function(a,b){if(h.inArray(a,Xb)!==-1)a.style.width=Ta[b]},o);h(K).height(0);u&&(H(C,P),H(function(a){A.push(a.innerHTML);y.push(v(h(a).css("width")))},P),H(function(a,b){a.style.width=y[b]},O),h(P).height(0));H(function(a,b){a.innerHTML='<div class="dataTables_sizing" style="height:0;overflow:hidden;">'+z[b]+"</div>";a.style.width=Ta[b]},K);u&&H(function(a,b){a.innerHTML='<div class="dataTables_sizing" style="height:0;overflow:hidden;">'+
A[b]+"</div>";a.style.width=y[b]},P);if(p.outerWidth()<f){O=j.scrollHeight>j.offsetHeight||"scroll"==l.css("overflow-y")?f+b:f;if(T&&(j.scrollHeight>j.offsetHeight||"scroll"==l.css("overflow-y")))r.width=v(O-b);(""===c||""!==d)&&J(a,1,"Possible column misalignment",6)}else O="100%";q.width=v(O);g.width=v(O);u&&(a.nScrollFoot.style.width=v(O));!e&&T&&(q.height=v(s.offsetHeight+b));c=p.outerWidth();n[0].style.width=v(c);i.width=v(c);d=p.height()>j.clientHeight||"scroll"==l.css("overflow-y");e="padding"+
(x.bScrollbarLeft?"Left":"Right");i[e]=d?b+"px":"0px";u&&(m[0].style.width=v(c),t[0].style.width=v(c),t[0].style[e]=d?b+"px":"0px");p.children("colgroup").insertBefore(p.children("thead"));l.scroll();if((a.bSorted||a.bFiltered)&&!a._drawHold)j.scrollTop=0}}function H(a,b,c){for(var d=0,e=0,f=b.length,g,j;e<f;){g=b[e].firstChild;for(j=c?c[e].firstChild:null;g;)1===g.nodeType&&(c?a(g,j,d):a(g,d),d++),g=g.nextSibling,j=c?j.nextSibling:null;e++}}function Ea(a){var b=a.nTable,c=a.aoColumns,d=a.oScroll,
e=d.sY,f=d.sX,g=d.sXInner,j=c.length,i=la(a,"bVisible"),n=h("th",a.nTHead),l=b.getAttribute("width"),k=b.parentNode,t=!1,m,o,p=a.oBrowser,d=p.bScrollOversize;(m=b.style.width)&&-1!==m.indexOf("%")&&(l=m);for(m=0;m<i.length;m++)o=c[i[m]],null!==o.sWidth&&(o.sWidth=Db(o.sWidthOrig,k),t=!0);if(d||!t&&!f&&!e&&j==aa(a)&&j==n.length)for(m=0;m<j;m++)i=Z(a,m),null!==i&&(c[i].sWidth=v(n.eq(m).width()));else{j=h(b).clone().css("visibility","hidden").removeAttr("id");j.find("tbody tr").remove();var s=h("<tr/>").appendTo(j.find("tbody"));
j.find("thead, tfoot").remove();j.append(h(a.nTHead).clone()).append(h(a.nTFoot).clone());j.find("tfoot th, tfoot td").css("width","");n=ra(a,j.find("thead")[0]);for(m=0;m<i.length;m++)o=c[i[m]],n[m].style.width=null!==o.sWidthOrig&&""!==o.sWidthOrig?v(o.sWidthOrig):"",o.sWidthOrig&&f&&h(n[m]).append(h("<div/>").css({width:o.sWidthOrig,margin:0,padding:0,border:0,height:1}));if(a.aoData.length)for(m=0;m<i.length;m++)t=i[m],o=c[t],h(Eb(a,t)).clone(!1).append(o.sContentPadding).appendTo(s);h("[name]",
j).removeAttr("name");o=h("<div/>").css(f||e?{position:"absolute",top:0,left:0,height:1,right:0,overflow:"hidden"}:{}).append(j).appendTo(k);f&&g?j.width(g):f?(j.css("width","auto"),j.removeAttr("width"),j.width()<k.clientWidth&&l&&j.width(k.clientWidth)):e?j.width(k.clientWidth):l&&j.width(l);for(m=e=0;m<i.length;m++)k=h(n[m]),g=k.outerWidth()-k.width(),k=p.bBounding?Math.ceil(n[m].getBoundingClientRect().width):k.outerWidth(),e+=k,c[i[m]].sWidth=v(k-g);b.style.width=v(e);o.remove()}l&&(b.style.width=
v(l));if((l||f)&&!a._reszEvt)b=function(){h(E).on("resize.DT-"+a.sInstance,Na(function(){Y(a)}))},d?setTimeout(b,1E3):b(),a._reszEvt=!0}function Db(a,b){if(!a)return 0;var c=h("<div/>").css("width",v(a)).appendTo(b||G.body),d=c[0].offsetWidth;c.remove();return d}function Eb(a,b){var c=Fb(a,b);if(0>c)return null;var d=a.aoData[c];return!d.nTr?h("<td/>").html(B(a,c,b,"display"))[0]:d.anCells[b]}function Fb(a,b){for(var c,d=-1,e=-1,f=0,g=a.aoData.length;f<g;f++)c=B(a,f,b,"display")+"",c=c.replace(Yb,
""),c=c.replace(/&nbsp;/g," "),c.length>d&&(d=c.length,e=f);return e}function v(a){return null===a?"0px":"number"==typeof a?0>a?"0px":a+"px":a.match(/\d$/)?a+"px":a}function V(a){var b,c,d=[],e=a.aoColumns,f,g,j,i;b=a.aaSortingFixed;c=h.isPlainObject(b);var n=[];f=function(a){a.length&&!h.isArray(a[0])?n.push(a):h.merge(n,a)};h.isArray(b)&&f(b);c&&b.pre&&f(b.pre);f(a.aaSorting);c&&b.post&&f(b.post);for(a=0;a<n.length;a++){i=n[a][0];f=e[i].aDataSort;b=0;for(c=f.length;b<c;b++)g=f[b],j=e[g].sType||
"string",n[a]._idx===k&&(n[a]._idx=h.inArray(n[a][1],e[g].asSorting)),d.push({src:i,col:g,dir:n[a][1],index:n[a]._idx,type:j,formatter:m.ext.type.order[j+"-pre"]})}return d}function lb(a){var b,c,d=[],e=m.ext.type.order,f=a.aoData,g=0,j,i=a.aiDisplayMaster,h;Fa(a);h=V(a);b=0;for(c=h.length;b<c;b++)j=h[b],j.formatter&&g++,Gb(a,j.col);if("ssp"!=y(a)&&0!==h.length){b=0;for(c=i.length;b<c;b++)d[i[b]]=b;g===h.length?i.sort(function(a,b){var c,e,g,j,i=h.length,k=f[a]._aSortData,m=f[b]._aSortData;for(g=
0;g<i;g++)if(j=h[g],c=k[j.col],e=m[j.col],c=c<e?-1:c>e?1:0,0!==c)return"asc"===j.dir?c:-c;c=d[a];e=d[b];return c<e?-1:c>e?1:0}):i.sort(function(a,b){var c,g,j,i,k=h.length,m=f[a]._aSortData,o=f[b]._aSortData;for(j=0;j<k;j++)if(i=h[j],c=m[i.col],g=o[i.col],i=e[i.type+"-"+i.dir]||e["string-"+i.dir],c=i(c,g),0!==c)return c;c=d[a];g=d[b];return c<g?-1:c>g?1:0})}a.bSorted=!0}function Hb(a){for(var b,c,d=a.aoColumns,e=V(a),a=a.oLanguage.oAria,f=0,g=d.length;f<g;f++){c=d[f];var j=c.asSorting;b=c.sTitle.replace(/<.*?>/g,
"");var i=c.nTh;i.removeAttribute("aria-sort");c.bSortable&&(0<e.length&&e[0].col==f?(i.setAttribute("aria-sort","asc"==e[0].dir?"ascending":"descending"),c=j[e[0].index+1]||j[0]):c=j[0],b+="asc"===c?a.sSortAscending:a.sSortDescending);i.setAttribute("aria-label",b)}}function Ua(a,b,c,d){var e=a.aaSorting,f=a.aoColumns[b].asSorting,g=function(a,b){var c=a._idx;c===k&&(c=h.inArray(a[1],f));return c+1<f.length?c+1:b?null:0};"number"===typeof e[0]&&(e=a.aaSorting=[e]);c&&a.oFeatures.bSortMulti?(c=h.inArray(b,
D(e,"0")),-1!==c?(b=g(e[c],!0),null===b&&1===e.length&&(b=0),null===b?e.splice(c,1):(e[c][1]=f[b],e[c]._idx=b)):(e.push([b,f[0],0]),e[e.length-1]._idx=0)):e.length&&e[0][0]==b?(b=g(e[0]),e.length=1,e[0][1]=f[b],e[0]._idx=b):(e.length=0,e.push([b,f[0]]),e[0]._idx=0);S(a);"function"==typeof d&&d(a)}function La(a,b,c,d){var e=a.aoColumns[c];Va(b,{},function(b){!1!==e.bSortable&&(a.oFeatures.bProcessing?(C(a,!0),setTimeout(function(){Ua(a,c,b.shiftKey,d);"ssp"!==y(a)&&C(a,!1)},0)):Ua(a,c,b.shiftKey,d))})}
function wa(a){var b=a.aLastSort,c=a.oClasses.sSortColumn,d=V(a),e=a.oFeatures,f,g;if(e.bSort&&e.bSortClasses){e=0;for(f=b.length;e<f;e++)g=b[e].src,h(D(a.aoData,"anCells",g)).removeClass(c+(2>e?e+1:3));e=0;for(f=d.length;e<f;e++)g=d[e].src,h(D(a.aoData,"anCells",g)).addClass(c+(2>e?e+1:3))}a.aLastSort=d}function Gb(a,b){var c=a.aoColumns[b],d=m.ext.order[c.sSortDataType],e;d&&(e=d.call(a.oInstance,a,b,$(a,b)));for(var f,g=m.ext.type.order[c.sType+"-pre"],j=0,i=a.aoData.length;j<i;j++)if(c=a.aoData[j],
c._aSortData||(c._aSortData=[]),!c._aSortData[b]||d)f=d?e[j]:B(a,j,b,"sort"),c._aSortData[b]=g?g(f):f}function xa(a){if(a.oFeatures.bStateSave&&!a.bDestroying){var b={time:+new Date,start:a._iDisplayStart,length:a._iDisplayLength,order:h.extend(!0,[],a.aaSorting),search:zb(a.oPreviousSearch),columns:h.map(a.aoColumns,function(b,d){return{visible:b.bVisible,search:zb(a.aoPreSearchCols[d])}})};r(a,"aoStateSaveParams","stateSaveParams",[a,b]);a.oSavedState=b;a.fnStateSaveCallback.call(a.oInstance,a,
b)}}function Ib(a,b,c){var d,e,f=a.aoColumns,b=function(b){if(b&&b.time){var g=r(a,"aoStateLoadParams","stateLoadParams",[a,b]);if(-1===h.inArray(!1,g)&&(g=a.iStateDuration,!(0<g&&b.time<+new Date-1E3*g)&&!(b.columns&&f.length!==b.columns.length))){a.oLoadedState=h.extend(!0,{},b);b.start!==k&&(a._iDisplayStart=b.start,a.iInitDisplayStart=b.start);b.length!==k&&(a._iDisplayLength=b.length);b.order!==k&&(a.aaSorting=[],h.each(b.order,function(b,c){a.aaSorting.push(c[0]>=f.length?[0,c[1]]:c)}));b.search!==
k&&h.extend(a.oPreviousSearch,Ab(b.search));if(b.columns){d=0;for(e=b.columns.length;d<e;d++)g=b.columns[d],g.visible!==k&&(f[d].bVisible=g.visible),g.search!==k&&h.extend(a.aoPreSearchCols[d],Ab(g.search))}r(a,"aoStateLoaded","stateLoaded",[a,b])}}c()};if(a.oFeatures.bStateSave){var g=a.fnStateLoadCallback.call(a.oInstance,a,b);g!==k&&b(g)}else c()}function ya(a){var b=m.settings,a=h.inArray(a,D(b,"nTable"));return-1!==a?b[a]:null}function J(a,b,c,d){c="DataTables warning: "+(a?"table id="+a.sTableId+
" - ":"")+c;d&&(c+=". For more information about this error, please see http://datatables.net/tn/"+d);if(b)E.console&&console.log&&console.log(c);else if(b=m.ext,b=b.sErrMode||b.errMode,a&&r(a,null,"error",[a,d,c]),"alert"==b)alert(c);else{if("throw"==b)throw Error(c);"function"==typeof b&&b(a,d,c)}}function F(a,b,c,d){h.isArray(c)?h.each(c,function(c,d){h.isArray(d)?F(a,b,d[0],d[1]):F(a,b,d)}):(d===k&&(d=c),b[c]!==k&&(a[d]=b[c]))}function Jb(a,b,c){var d,e;for(e in b)b.hasOwnProperty(e)&&(d=b[e],
h.isPlainObject(d)?(h.isPlainObject(a[e])||(a[e]={}),h.extend(!0,a[e],d)):a[e]=c&&"data"!==e&&"aaData"!==e&&h.isArray(d)?d.slice():d);return a}function Va(a,b,c){h(a).on("click.DT",b,function(b){a.blur();c(b)}).on("keypress.DT",b,function(a){13===a.which&&(a.preventDefault(),c(a))}).on("selectstart.DT",function(){return!1})}function z(a,b,c,d){c&&a[b].push({fn:c,sName:d})}function r(a,b,c,d){var e=[];b&&(e=h.map(a[b].slice().reverse(),function(b){return b.fn.apply(a.oInstance,d)}));null!==c&&(b=h.Event(c+
".dt"),h(a.nTable).trigger(b,d),e.push(b.result));return e}function Ra(a){var b=a._iDisplayStart,c=a.fnDisplayEnd(),d=a._iDisplayLength;b>=c&&(b=c-d);b-=b%d;if(-1===d||0>b)b=0;a._iDisplayStart=b}function Ma(a,b){var c=a.renderer,d=m.ext.renderer[b];return h.isPlainObject(c)&&c[b]?d[c[b]]||d._:"string"===typeof c?d[c]||d._:d._}function y(a){return a.oFeatures.bServerSide?"ssp":a.ajax||a.sAjaxSource?"ajax":"dom"}function ha(a,b){var c=[],c=Kb.numbers_length,d=Math.floor(c/2);b<=c?c=W(0,b):a<=d?(c=W(0,
c-2),c.push("ellipsis"),c.push(b-1)):(a>=b-1-d?c=W(b-(c-2),b):(c=W(a-d+2,a+d-1),c.push("ellipsis"),c.push(b-1)),c.splice(0,0,"ellipsis"),c.splice(0,0,0));c.DT_el="span";return c}function cb(a){h.each({num:function(b){return za(b,a)},"num-fmt":function(b){return za(b,a,Wa)},"html-num":function(b){return za(b,a,Aa)},"html-num-fmt":function(b){return za(b,a,Aa,Wa)}},function(b,c){x.type.order[b+a+"-pre"]=c;b.match(/^html\-/)&&(x.type.search[b+a]=x.type.search.html)})}function Lb(a){return function(){var b=
[ya(this[m.ext.iApiIndex])].concat(Array.prototype.slice.call(arguments));return m.ext.internal[a].apply(this,b)}}var m=function(a){this.$=function(a,b){return this.api(!0).$(a,b)};this._=function(a,b){return this.api(!0).rows(a,b).data()};this.api=function(a){return a?new s(ya(this[x.iApiIndex])):new s(this)};this.fnAddData=function(a,b){var c=this.api(!0),d=h.isArray(a)&&(h.isArray(a[0])||h.isPlainObject(a[0]))?c.rows.add(a):c.row.add(a);(b===k||b)&&c.draw();return d.flatten().toArray()};this.fnAdjustColumnSizing=
function(a){var b=this.api(!0).columns.adjust(),c=b.settings()[0],d=c.oScroll;a===k||a?b.draw(!1):(""!==d.sX||""!==d.sY)&&ka(c)};this.fnClearTable=function(a){var b=this.api(!0).clear();(a===k||a)&&b.draw()};this.fnClose=function(a){this.api(!0).row(a).child.hide()};this.fnDeleteRow=function(a,b,c){var d=this.api(!0),a=d.rows(a),e=a.settings()[0],h=e.aoData[a[0][0]];a.remove();b&&b.call(this,e,h);(c===k||c)&&d.draw();return h};this.fnDestroy=function(a){this.api(!0).destroy(a)};this.fnDraw=function(a){this.api(!0).draw(a)};
this.fnFilter=function(a,b,c,d,e,h){e=this.api(!0);null===b||b===k?e.search(a,c,d,h):e.column(b).search(a,c,d,h);e.draw()};this.fnGetData=function(a,b){var c=this.api(!0);if(a!==k){var d=a.nodeName?a.nodeName.toLowerCase():"";return b!==k||"td"==d||"th"==d?c.cell(a,b).data():c.row(a).data()||null}return c.data().toArray()};this.fnGetNodes=function(a){var b=this.api(!0);return a!==k?b.row(a).node():b.rows().nodes().flatten().toArray()};this.fnGetPosition=function(a){var b=this.api(!0),c=a.nodeName.toUpperCase();
return"TR"==c?b.row(a).index():"TD"==c||"TH"==c?(a=b.cell(a).index(),[a.row,a.columnVisible,a.column]):null};this.fnIsOpen=function(a){return this.api(!0).row(a).child.isShown()};this.fnOpen=function(a,b,c){return this.api(!0).row(a).child(b,c).show().child()[0]};this.fnPageChange=function(a,b){var c=this.api(!0).page(a);(b===k||b)&&c.draw(!1)};this.fnSetColumnVis=function(a,b,c){a=this.api(!0).column(a).visible(b);(c===k||c)&&a.columns.adjust().draw()};this.fnSettings=function(){return ya(this[x.iApiIndex])};
this.fnSort=function(a){this.api(!0).order(a).draw()};this.fnSortListener=function(a,b,c){this.api(!0).order.listener(a,b,c)};this.fnUpdate=function(a,b,c,d,e){var h=this.api(!0);c===k||null===c?h.row(b).data(a):h.cell(b,c).data(a);(e===k||e)&&h.columns.adjust();(d===k||d)&&h.draw();return 0};this.fnVersionCheck=x.fnVersionCheck;var b=this,c=a===k,d=this.length;c&&(a={});this.oApi=this.internal=x.internal;for(var e in m.ext.internal)e&&(this[e]=Lb(e));this.each(function(){var e={},g=1<d?Jb(e,a,!0):
a,j=0,i,e=this.getAttribute("id"),n=!1,l=m.defaults,q=h(this);if("table"!=this.nodeName.toLowerCase())J(null,0,"Non-table node initialisation ("+this.nodeName+")",2);else{db(l);eb(l.column);I(l,l,!0);I(l.column,l.column,!0);I(l,h.extend(g,q.data()));var t=m.settings,j=0;for(i=t.length;j<i;j++){var o=t[j];if(o.nTable==this||o.nTHead.parentNode==this||o.nTFoot&&o.nTFoot.parentNode==this){var s=g.bRetrieve!==k?g.bRetrieve:l.bRetrieve;if(c||s)return o.oInstance;if(g.bDestroy!==k?g.bDestroy:l.bDestroy){o.oInstance.fnDestroy();
break}else{J(o,0,"Cannot reinitialise DataTable",3);return}}if(o.sTableId==this.id){t.splice(j,1);break}}if(null===e||""===e)this.id=e="DataTables_Table_"+m.ext._unique++;var p=h.extend(!0,{},m.models.oSettings,{sDestroyWidth:q[0].style.width,sInstance:e,sTableId:e});p.nTable=this;p.oApi=b.internal;p.oInit=g;t.push(p);p.oInstance=1===b.length?b:q.dataTable();db(g);g.oLanguage&&Ca(g.oLanguage);g.aLengthMenu&&!g.iDisplayLength&&(g.iDisplayLength=h.isArray(g.aLengthMenu[0])?g.aLengthMenu[0][0]:g.aLengthMenu[0]);
g=Jb(h.extend(!0,{},l),g);F(p.oFeatures,g,"bPaginate bLengthChange bFilter bSort bSortMulti bInfo bProcessing bAutoWidth bSortClasses bServerSide bDeferRender".split(" "));F(p,g,["asStripeClasses","ajax","fnServerData","fnFormatNumber","sServerMethod","aaSorting","aaSortingFixed","aLengthMenu","sPaginationType","sAjaxSource","sAjaxDataProp","iStateDuration","sDom","bSortCellsTop","iTabIndex","fnStateLoadCallback","fnStateSaveCallback","renderer","searchDelay","rowId",["iCookieDuration","iStateDuration"],
["oSearch","oPreviousSearch"],["aoSearchCols","aoPreSearchCols"],["iDisplayLength","_iDisplayLength"]]);F(p.oScroll,g,[["sScrollX","sX"],["sScrollXInner","sXInner"],["sScrollY","sY"],["bScrollCollapse","bCollapse"]]);F(p.oLanguage,g,"fnInfoCallback");z(p,"aoDrawCallback",g.fnDrawCallback,"user");z(p,"aoServerParams",g.fnServerParams,"user");z(p,"aoStateSaveParams",g.fnStateSaveParams,"user");z(p,"aoStateLoadParams",g.fnStateLoadParams,"user");z(p,"aoStateLoaded",g.fnStateLoaded,"user");z(p,"aoRowCallback",
g.fnRowCallback,"user");z(p,"aoRowCreatedCallback",g.fnCreatedRow,"user");z(p,"aoHeaderCallback",g.fnHeaderCallback,"user");z(p,"aoFooterCallback",g.fnFooterCallback,"user");z(p,"aoInitComplete",g.fnInitComplete,"user");z(p,"aoPreDrawCallback",g.fnPreDrawCallback,"user");p.rowIdFn=Q(g.rowId);fb(p);var u=p.oClasses;h.extend(u,m.ext.classes,g.oClasses);q.addClass(u.sTable);p.iInitDisplayStart===k&&(p.iInitDisplayStart=g.iDisplayStart,p._iDisplayStart=g.iDisplayStart);null!==g.iDeferLoading&&(p.bDeferLoading=
!0,e=h.isArray(g.iDeferLoading),p._iRecordsDisplay=e?g.iDeferLoading[0]:g.iDeferLoading,p._iRecordsTotal=e?g.iDeferLoading[1]:g.iDeferLoading);var v=p.oLanguage;h.extend(!0,v,g.oLanguage);v.sUrl&&(h.ajax({dataType:"json",url:v.sUrl,success:function(a){Ca(a);I(l.oLanguage,a);h.extend(true,v,a);ga(p)},error:function(){ga(p)}}),n=!0);null===g.asStripeClasses&&(p.asStripeClasses=[u.sStripeOdd,u.sStripeEven]);var e=p.asStripeClasses,x=q.children("tbody").find("tr").eq(0);-1!==h.inArray(!0,h.map(e,function(a){return x.hasClass(a)}))&&
(h("tbody tr",this).removeClass(e.join(" ")),p.asDestroyStripes=e.slice());e=[];t=this.getElementsByTagName("thead");0!==t.length&&(da(p.aoHeader,t[0]),e=ra(p));if(null===g.aoColumns){t=[];j=0;for(i=e.length;j<i;j++)t.push(null)}else t=g.aoColumns;j=0;for(i=t.length;j<i;j++)Da(p,e?e[j]:null);hb(p,g.aoColumnDefs,t,function(a,b){ja(p,a,b)});if(x.length){var w=function(a,b){return a.getAttribute("data-"+b)!==null?b:null};h(x[0]).children("th, td").each(function(a,b){var c=p.aoColumns[a];if(c.mData===
a){var d=w(b,"sort")||w(b,"order"),e=w(b,"filter")||w(b,"search");if(d!==null||e!==null){c.mData={_:a+".display",sort:d!==null?a+".@data-"+d:k,type:d!==null?a+".@data-"+d:k,filter:e!==null?a+".@data-"+e:k};ja(p,a)}}})}var T=p.oFeatures,e=function(){if(g.aaSorting===k){var a=p.aaSorting;j=0;for(i=a.length;j<i;j++)a[j][1]=p.aoColumns[j].asSorting[0]}wa(p);T.bSort&&z(p,"aoDrawCallback",function(){if(p.bSorted){var a=V(p),b={};h.each(a,function(a,c){b[c.src]=c.dir});r(p,null,"order",[p,a,b]);Hb(p)}});
z(p,"aoDrawCallback",function(){(p.bSorted||y(p)==="ssp"||T.bDeferRender)&&wa(p)},"sc");var a=q.children("caption").each(function(){this._captionSide=h(this).css("caption-side")}),b=q.children("thead");b.length===0&&(b=h("<thead/>").appendTo(q));p.nTHead=b[0];b=q.children("tbody");b.length===0&&(b=h("<tbody/>").appendTo(q));p.nTBody=b[0];b=q.children("tfoot");if(b.length===0&&a.length>0&&(p.oScroll.sX!==""||p.oScroll.sY!==""))b=h("<tfoot/>").appendTo(q);if(b.length===0||b.children().length===0)q.addClass(u.sNoFooter);
else if(b.length>0){p.nTFoot=b[0];da(p.aoFooter,p.nTFoot)}if(g.aaData)for(j=0;j<g.aaData.length;j++)M(p,g.aaData[j]);else(p.bDeferLoading||y(p)=="dom")&&ma(p,h(p.nTBody).children("tr"));p.aiDisplay=p.aiDisplayMaster.slice();p.bInitialised=true;n===false&&ga(p)};g.bStateSave?(T.bStateSave=!0,z(p,"aoDrawCallback",xa,"state_save"),Ib(p,g,e)):e()}});b=null;return this},x,s,o,u,Xa={},Mb=/[\r\n]/g,Aa=/<.*?>/g,Zb=/^\d{2,4}[\.\/\-]\d{1,2}[\.\/\-]\d{1,2}([T ]{1}\d{1,2}[:\.]\d{2}([\.:]\d{2})?)?$/,$b=RegExp("(\\/|\\.|\\*|\\+|\\?|\\||\\(|\\)|\\[|\\]|\\{|\\}|\\\\|\\$|\\^|\\-)",
"g"),Wa=/[',$£€¥%\u2009\u202F\u20BD\u20a9\u20BArfk]/gi,L=function(a){return!a||!0===a||"-"===a?!0:!1},Nb=function(a){var b=parseInt(a,10);return!isNaN(b)&&isFinite(a)?b:null},Ob=function(a,b){Xa[b]||(Xa[b]=RegExp(Pa(b),"g"));return"string"===typeof a&&"."!==b?a.replace(/\./g,"").replace(Xa[b],"."):a},Ya=function(a,b,c){var d="string"===typeof a;if(L(a))return!0;b&&d&&(a=Ob(a,b));c&&d&&(a=a.replace(Wa,""));return!isNaN(parseFloat(a))&&isFinite(a)},Pb=function(a,b,c){return L(a)?!0:!(L(a)||"string"===
typeof a)?null:Ya(a.replace(Aa,""),b,c)?!0:null},D=function(a,b,c){var d=[],e=0,f=a.length;if(c!==k)for(;e<f;e++)a[e]&&a[e][b]&&d.push(a[e][b][c]);else for(;e<f;e++)a[e]&&d.push(a[e][b]);return d},ia=function(a,b,c,d){var e=[],f=0,g=b.length;if(d!==k)for(;f<g;f++)a[b[f]][c]&&e.push(a[b[f]][c][d]);else for(;f<g;f++)e.push(a[b[f]][c]);return e},W=function(a,b){var c=[],d;b===k?(b=0,d=a):(d=b,b=a);for(var e=b;e<d;e++)c.push(e);return c},Qb=function(a){for(var b=[],c=0,d=a.length;c<d;c++)a[c]&&b.push(a[c]);
return b},qa=function(a){var b;a:{if(!(2>a.length)){b=a.slice().sort();for(var c=b[0],d=1,e=b.length;d<e;d++){if(b[d]===c){b=!1;break a}c=b[d]}}b=!0}if(b)return a.slice();b=[];var e=a.length,f,g=0,d=0;a:for(;d<e;d++){c=a[d];for(f=0;f<g;f++)if(b[f]===c)continue a;b.push(c);g++}return b};m.util={throttle:function(a,b){var c=b!==k?b:200,d,e;return function(){var b=this,g=+new Date,j=arguments;d&&g<d+c?(clearTimeout(e),e=setTimeout(function(){d=k;a.apply(b,j)},c)):(d=g,a.apply(b,j))}},escapeRegex:function(a){return a.replace($b,
"\\$1")}};var A=function(a,b,c){a[b]!==k&&(a[c]=a[b])},ba=/\[.*?\]$/,U=/\(\)$/,Pa=m.util.escapeRegex,va=h("<div>")[0],Wb=va.textContent!==k,Yb=/<.*?>/g,Na=m.util.throttle,Rb=[],w=Array.prototype,ac=function(a){var b,c,d=m.settings,e=h.map(d,function(a){return a.nTable});if(a){if(a.nTable&&a.oApi)return[a];if(a.nodeName&&"table"===a.nodeName.toLowerCase())return b=h.inArray(a,e),-1!==b?[d[b]]:null;if(a&&"function"===typeof a.settings)return a.settings().toArray();"string"===typeof a?c=h(a):a instanceof
h&&(c=a)}else return[];if(c)return c.map(function(){b=h.inArray(this,e);return-1!==b?d[b]:null}).toArray()};s=function(a,b){if(!(this instanceof s))return new s(a,b);var c=[],d=function(a){(a=ac(a))&&(c=c.concat(a))};if(h.isArray(a))for(var e=0,f=a.length;e<f;e++)d(a[e]);else d(a);this.context=qa(c);b&&h.merge(this,b);this.selector={rows:null,cols:null,opts:null};s.extend(this,this,Rb)};m.Api=s;h.extend(s.prototype,{any:function(){return 0!==this.count()},concat:w.concat,context:[],count:function(){return this.flatten().length},
each:function(a){for(var b=0,c=this.length;b<c;b++)a.call(this,this[b],b,this);return this},eq:function(a){var b=this.context;return b.length>a?new s(b[a],this[a]):null},filter:function(a){var b=[];if(w.filter)b=w.filter.call(this,a,this);else for(var c=0,d=this.length;c<d;c++)a.call(this,this[c],c,this)&&b.push(this[c]);return new s(this.context,b)},flatten:function(){var a=[];return new s(this.context,a.concat.apply(a,this.toArray()))},join:w.join,indexOf:w.indexOf||function(a,b){for(var c=b||0,
d=this.length;c<d;c++)if(this[c]===a)return c;return-1},iterator:function(a,b,c,d){var e=[],f,g,j,h,n,l=this.context,m,o,u=this.selector;"string"===typeof a&&(d=c,c=b,b=a,a=!1);g=0;for(j=l.length;g<j;g++){var r=new s(l[g]);if("table"===b)f=c.call(r,l[g],g),f!==k&&e.push(f);else if("columns"===b||"rows"===b)f=c.call(r,l[g],this[g],g),f!==k&&e.push(f);else if("column"===b||"column-rows"===b||"row"===b||"cell"===b){o=this[g];"column-rows"===b&&(m=Ba(l[g],u.opts));h=0;for(n=o.length;h<n;h++)f=o[h],f=
"cell"===b?c.call(r,l[g],f.row,f.column,g,h):c.call(r,l[g],f,g,h,m),f!==k&&e.push(f)}}return e.length||d?(a=new s(l,a?e.concat.apply([],e):e),b=a.selector,b.rows=u.rows,b.cols=u.cols,b.opts=u.opts,a):this},lastIndexOf:w.lastIndexOf||function(a,b){return this.indexOf.apply(this.toArray.reverse(),arguments)},length:0,map:function(a){var b=[];if(w.map)b=w.map.call(this,a,this);else for(var c=0,d=this.length;c<d;c++)b.push(a.call(this,this[c],c));return new s(this.context,b)},pluck:function(a){return this.map(function(b){return b[a]})},
pop:w.pop,push:w.push,reduce:w.reduce||function(a,b){return gb(this,a,b,0,this.length,1)},reduceRight:w.reduceRight||function(a,b){return gb(this,a,b,this.length-1,-1,-1)},reverse:w.reverse,selector:null,shift:w.shift,slice:function(){return new s(this.context,this)},sort:w.sort,splice:w.splice,toArray:function(){return w.slice.call(this)},to$:function(){return h(this)},toJQuery:function(){return h(this)},unique:function(){return new s(this.context,qa(this))},unshift:w.unshift});s.extend=function(a,
b,c){if(c.length&&b&&(b instanceof s||b.__dt_wrapper)){var d,e,f,g=function(a,b,c){return function(){var d=b.apply(a,arguments);s.extend(d,d,c.methodExt);return d}};d=0;for(e=c.length;d<e;d++)f=c[d],b[f.name]="function"===typeof f.val?g(a,f.val,f):h.isPlainObject(f.val)?{}:f.val,b[f.name].__dt_wrapper=!0,s.extend(a,b[f.name],f.propExt)}};s.register=o=function(a,b){if(h.isArray(a))for(var c=0,d=a.length;c<d;c++)s.register(a[c],b);else for(var e=a.split("."),f=Rb,g,j,c=0,d=e.length;c<d;c++){g=(j=-1!==
e[c].indexOf("()"))?e[c].replace("()",""):e[c];var i;a:{i=0;for(var n=f.length;i<n;i++)if(f[i].name===g){i=f[i];break a}i=null}i||(i={name:g,val:{},methodExt:[],propExt:[]},f.push(i));c===d-1?i.val=b:f=j?i.methodExt:i.propExt}};s.registerPlural=u=function(a,b,c){s.register(a,c);s.register(b,function(){var a=c.apply(this,arguments);return a===this?this:a instanceof s?a.length?h.isArray(a[0])?new s(a.context,a[0]):a[0]:k:a})};o("tables()",function(a){var b;if(a){b=s;var c=this.context;if("number"===
typeof a)a=[c[a]];else var d=h.map(c,function(a){return a.nTable}),a=h(d).filter(a).map(function(){var a=h.inArray(this,d);return c[a]}).toArray();b=new b(a)}else b=this;return b});o("table()",function(a){var a=this.tables(a),b=a.context;return b.length?new s(b[0]):a});u("tables().nodes()","table().node()",function(){return this.iterator("table",function(a){return a.nTable},1)});u("tables().body()","table().body()",function(){return this.iterator("table",function(a){return a.nTBody},1)});u("tables().header()",
"table().header()",function(){return this.iterator("table",function(a){return a.nTHead},1)});u("tables().footer()","table().footer()",function(){return this.iterator("table",function(a){return a.nTFoot},1)});u("tables().containers()","table().container()",function(){return this.iterator("table",function(a){return a.nTableWrapper},1)});o("draw()",function(a){return this.iterator("table",function(b){"page"===a?N(b):("string"===typeof a&&(a="full-hold"===a?!1:!0),S(b,!1===a))})});o("page()",function(a){return a===
k?this.page.info().page:this.iterator("table",function(b){Sa(b,a)})});o("page.info()",function(){if(0===this.context.length)return k;var a=this.context[0],b=a._iDisplayStart,c=a.oFeatures.bPaginate?a._iDisplayLength:-1,d=a.fnRecordsDisplay(),e=-1===c;return{page:e?0:Math.floor(b/c),pages:e?1:Math.ceil(d/c),start:b,end:a.fnDisplayEnd(),length:c,recordsTotal:a.fnRecordsTotal(),recordsDisplay:d,serverSide:"ssp"===y(a)}});o("page.len()",function(a){return a===k?0!==this.context.length?this.context[0]._iDisplayLength:
k:this.iterator("table",function(b){Qa(b,a)})});var Sb=function(a,b,c){if(c){var d=new s(a);d.one("draw",function(){c(d.ajax.json())})}if("ssp"==y(a))S(a,b);else{C(a,!0);var e=a.jqXHR;e&&4!==e.readyState&&e.abort();sa(a,[],function(c){na(a);for(var c=ta(a,c),d=0,e=c.length;d<e;d++)M(a,c[d]);S(a,b);C(a,!1)})}};o("ajax.json()",function(){var a=this.context;if(0<a.length)return a[0].json});o("ajax.params()",function(){var a=this.context;if(0<a.length)return a[0].oAjaxData});o("ajax.reload()",function(a,
b){return this.iterator("table",function(c){Sb(c,!1===b,a)})});o("ajax.url()",function(a){var b=this.context;if(a===k){if(0===b.length)return k;b=b[0];return b.ajax?h.isPlainObject(b.ajax)?b.ajax.url:b.ajax:b.sAjaxSource}return this.iterator("table",function(b){h.isPlainObject(b.ajax)?b.ajax.url=a:b.ajax=a})});o("ajax.url().load()",function(a,b){return this.iterator("table",function(c){Sb(c,!1===b,a)})});var Za=function(a,b,c,d,e){var f=[],g,j,i,n,l,m;i=typeof b;if(!b||"string"===i||"function"===
i||b.length===k)b=[b];i=0;for(n=b.length;i<n;i++){j=b[i]&&b[i].split&&!b[i].match(/[\[\(:]/)?b[i].split(","):[b[i]];l=0;for(m=j.length;l<m;l++)(g=c("string"===typeof j[l]?h.trim(j[l]):j[l]))&&g.length&&(f=f.concat(g))}a=x.selector[a];if(a.length){i=0;for(n=a.length;i<n;i++)f=a[i](d,e,f)}return qa(f)},$a=function(a){a||(a={});a.filter&&a.search===k&&(a.search=a.filter);return h.extend({search:"none",order:"current",page:"all"},a)},ab=function(a){for(var b=0,c=a.length;b<c;b++)if(0<a[b].length)return a[0]=
a[b],a[0].length=1,a.length=1,a.context=[a.context[b]],a;a.length=0;return a},Ba=function(a,b){var c,d,e,f=[],g=a.aiDisplay;c=a.aiDisplayMaster;var j=b.search;d=b.order;e=b.page;if("ssp"==y(a))return"removed"===j?[]:W(0,c.length);if("current"==e){c=a._iDisplayStart;for(d=a.fnDisplayEnd();c<d;c++)f.push(g[c])}else if("current"==d||"applied"==d)f="none"==j?c.slice():"applied"==j?g.slice():h.map(c,function(a){return-1===h.inArray(a,g)?a:null});else if("index"==d||"original"==d){c=0;for(d=a.aoData.length;c<
d;c++)"none"==j?f.push(c):(e=h.inArray(c,g),(-1===e&&"removed"==j||0<=e&&"applied"==j)&&f.push(c))}return f};o("rows()",function(a,b){a===k?a="":h.isPlainObject(a)&&(b=a,a="");var b=$a(b),c=this.iterator("table",function(c){var e=b,f;return Za("row",a,function(a){var b=Nb(a);if(b!==null&&!e)return[b];f||(f=Ba(c,e));if(b!==null&&h.inArray(b,f)!==-1)return[b];if(a===null||a===k||a==="")return f;if(typeof a==="function")return h.map(f,function(b){var e=c.aoData[b];return a(b,e._aData,e.nTr)?b:null});
b=Qb(ia(c.aoData,f,"nTr"));if(a.nodeName){if(a._DT_RowIndex!==k)return[a._DT_RowIndex];if(a._DT_CellIndex)return[a._DT_CellIndex.row];b=h(a).closest("*[data-dt-row]");return b.length?[b.data("dt-row")]:[]}if(typeof a==="string"&&a.charAt(0)==="#"){var i=c.aIds[a.replace(/^#/,"")];if(i!==k)return[i.idx]}return h(b).filter(a).map(function(){return this._DT_RowIndex}).toArray()},c,e)},1);c.selector.rows=a;c.selector.opts=b;return c});o("rows().nodes()",function(){return this.iterator("row",function(a,
b){return a.aoData[b].nTr||k},1)});o("rows().data()",function(){return this.iterator(!0,"rows",function(a,b){return ia(a.aoData,b,"_aData")},1)});u("rows().cache()","row().cache()",function(a){return this.iterator("row",function(b,c){var d=b.aoData[c];return"search"===a?d._aFilterData:d._aSortData},1)});u("rows().invalidate()","row().invalidate()",function(a){return this.iterator("row",function(b,c){ca(b,c,a)})});u("rows().indexes()","row().index()",function(){return this.iterator("row",function(a,
b){return b},1)});u("rows().ids()","row().id()",function(a){for(var b=[],c=this.context,d=0,e=c.length;d<e;d++)for(var f=0,g=this[d].length;f<g;f++){var h=c[d].rowIdFn(c[d].aoData[this[d][f]]._aData);b.push((!0===a?"#":"")+h)}return new s(c,b)});u("rows().remove()","row().remove()",function(){var a=this;this.iterator("row",function(b,c,d){var e=b.aoData,f=e[c],g,h,i,n,l;e.splice(c,1);g=0;for(h=e.length;g<h;g++)if(i=e[g],l=i.anCells,null!==i.nTr&&(i.nTr._DT_RowIndex=g),null!==l){i=0;for(n=l.length;i<
n;i++)l[i]._DT_CellIndex.row=g}oa(b.aiDisplayMaster,c);oa(b.aiDisplay,c);oa(a[d],c,!1);0<b._iRecordsDisplay&&b._iRecordsDisplay--;Ra(b);c=b.rowIdFn(f._aData);c!==k&&delete b.aIds[c]});this.iterator("table",function(a){for(var c=0,d=a.aoData.length;c<d;c++)a.aoData[c].idx=c});return this});o("rows.add()",function(a){var b=this.iterator("table",function(b){var c,f,g,h=[];f=0;for(g=a.length;f<g;f++)c=a[f],c.nodeName&&"TR"===c.nodeName.toUpperCase()?h.push(ma(b,c)[0]):h.push(M(b,c));return h},1),c=this.rows(-1);
c.pop();h.merge(c,b);return c});o("row()",function(a,b){return ab(this.rows(a,b))});o("row().data()",function(a){var b=this.context;if(a===k)return b.length&&this.length?b[0].aoData[this[0]]._aData:k;b[0].aoData[this[0]]._aData=a;ca(b[0],this[0],"data");return this});o("row().node()",function(){var a=this.context;return a.length&&this.length?a[0].aoData[this[0]].nTr||null:null});o("row.add()",function(a){a instanceof h&&a.length&&(a=a[0]);var b=this.iterator("table",function(b){return a.nodeName&&
"TR"===a.nodeName.toUpperCase()?ma(b,a)[0]:M(b,a)});return this.row(b[0])});var bb=function(a,b){var c=a.context;if(c.length&&(c=c[0].aoData[b!==k?b:a[0]])&&c._details)c._details.remove(),c._detailsShow=k,c._details=k},Tb=function(a,b){var c=a.context;if(c.length&&a.length){var d=c[0].aoData[a[0]];if(d._details){(d._detailsShow=b)?d._details.insertAfter(d.nTr):d._details.detach();var e=c[0],f=new s(e),g=e.aoData;f.off("draw.dt.DT_details column-visibility.dt.DT_details destroy.dt.DT_details");0<D(g,
"_details").length&&(f.on("draw.dt.DT_details",function(a,b){e===b&&f.rows({page:"current"}).eq(0).each(function(a){a=g[a];a._detailsShow&&a._details.insertAfter(a.nTr)})}),f.on("column-visibility.dt.DT_details",function(a,b){if(e===b)for(var c,d=aa(b),f=0,h=g.length;f<h;f++)c=g[f],c._details&&c._details.children("td[colspan]").attr("colspan",d)}),f.on("destroy.dt.DT_details",function(a,b){if(e===b)for(var c=0,d=g.length;c<d;c++)g[c]._details&&bb(f,c)}))}}};o("row().child()",function(a,b){var c=this.context;
if(a===k)return c.length&&this.length?c[0].aoData[this[0]]._details:k;if(!0===a)this.child.show();else if(!1===a)bb(this);else if(c.length&&this.length){var d=c[0],c=c[0].aoData[this[0]],e=[],f=function(a,b){if(h.isArray(a)||a instanceof h)for(var c=0,k=a.length;c<k;c++)f(a[c],b);else a.nodeName&&"tr"===a.nodeName.toLowerCase()?e.push(a):(c=h("<tr><td/></tr>").addClass(b),h("td",c).addClass(b).html(a)[0].colSpan=aa(d),e.push(c[0]))};f(a,b);c._details&&c._details.detach();c._details=h(e);c._detailsShow&&
c._details.insertAfter(c.nTr)}return this});o(["row().child.show()","row().child().show()"],function(){Tb(this,!0);return this});o(["row().child.hide()","row().child().hide()"],function(){Tb(this,!1);return this});o(["row().child.remove()","row().child().remove()"],function(){bb(this);return this});o("row().child.isShown()",function(){var a=this.context;return a.length&&this.length?a[0].aoData[this[0]]._detailsShow||!1:!1});var bc=/^([^:]+):(name|visIdx|visible)$/,Ub=function(a,b,c,d,e){for(var c=
[],d=0,f=e.length;d<f;d++)c.push(B(a,e[d],b));return c};o("columns()",function(a,b){a===k?a="":h.isPlainObject(a)&&(b=a,a="");var b=$a(b),c=this.iterator("table",function(c){var e=a,f=b,g=c.aoColumns,j=D(g,"sName"),i=D(g,"nTh");return Za("column",e,function(a){var b=Nb(a);if(a==="")return W(g.length);if(b!==null)return[b>=0?b:g.length+b];if(typeof a==="function"){var e=Ba(c,f);return h.map(g,function(b,f){return a(f,Ub(c,f,0,0,e),i[f])?f:null})}var k=typeof a==="string"?a.match(bc):"";if(k)switch(k[2]){case "visIdx":case "visible":b=
parseInt(k[1],10);if(b<0){var m=h.map(g,function(a,b){return a.bVisible?b:null});return[m[m.length+b]]}return[Z(c,b)];case "name":return h.map(j,function(a,b){return a===k[1]?b:null});default:return[]}if(a.nodeName&&a._DT_CellIndex)return[a._DT_CellIndex.column];b=h(i).filter(a).map(function(){return h.inArray(this,i)}).toArray();if(b.length||!a.nodeName)return b;b=h(a).closest("*[data-dt-column]");return b.length?[b.data("dt-column")]:[]},c,f)},1);c.selector.cols=a;c.selector.opts=b;return c});u("columns().header()",
"column().header()",function(){return this.iterator("column",function(a,b){return a.aoColumns[b].nTh},1)});u("columns().footer()","column().footer()",function(){return this.iterator("column",function(a,b){return a.aoColumns[b].nTf},1)});u("columns().data()","column().data()",function(){return this.iterator("column-rows",Ub,1)});u("columns().dataSrc()","column().dataSrc()",function(){return this.iterator("column",function(a,b){return a.aoColumns[b].mData},1)});u("columns().cache()","column().cache()",
function(a){return this.iterator("column-rows",function(b,c,d,e,f){return ia(b.aoData,f,"search"===a?"_aFilterData":"_aSortData",c)},1)});u("columns().nodes()","column().nodes()",function(){return this.iterator("column-rows",function(a,b,c,d,e){return ia(a.aoData,e,"anCells",b)},1)});u("columns().visible()","column().visible()",function(a,b){var c=this.iterator("column",function(b,c){if(a===k)return b.aoColumns[c].bVisible;var f=b.aoColumns,g=f[c],j=b.aoData,i,n,l;if(a!==k&&g.bVisible!==a){if(a){var m=
h.inArray(!0,D(f,"bVisible"),c+1);i=0;for(n=j.length;i<n;i++)l=j[i].nTr,f=j[i].anCells,l&&l.insertBefore(f[c],f[m]||null)}else h(D(b.aoData,"anCells",c)).detach();g.bVisible=a;ea(b,b.aoHeader);ea(b,b.aoFooter);xa(b)}});a!==k&&(this.iterator("column",function(c,e){r(c,null,"column-visibility",[c,e,a,b])}),(b===k||b)&&this.columns.adjust());return c});u("columns().indexes()","column().index()",function(a){return this.iterator("column",function(b,c){return"visible"===a?$(b,c):c},1)});o("columns.adjust()",
function(){return this.iterator("table",function(a){Y(a)},1)});o("column.index()",function(a,b){if(0!==this.context.length){var c=this.context[0];if("fromVisible"===a||"toData"===a)return Z(c,b);if("fromData"===a||"toVisible"===a)return $(c,b)}});o("column()",function(a,b){return ab(this.columns(a,b))});o("cells()",function(a,b,c){h.isPlainObject(a)&&(a.row===k?(c=a,a=null):(c=b,b=null));h.isPlainObject(b)&&(c=b,b=null);if(null===b||b===k)return this.iterator("table",function(b){var d=a,e=$a(c),f=
b.aoData,g=Ba(b,e),j=Qb(ia(f,g,"anCells")),i=h([].concat.apply([],j)),l,n=b.aoColumns.length,m,o,u,s,r,v;return Za("cell",d,function(a){var c=typeof a==="function";if(a===null||a===k||c){m=[];o=0;for(u=g.length;o<u;o++){l=g[o];for(s=0;s<n;s++){r={row:l,column:s};if(c){v=f[l];a(r,B(b,l,s),v.anCells?v.anCells[s]:null)&&m.push(r)}else m.push(r)}}return m}if(h.isPlainObject(a))return[a];c=i.filter(a).map(function(a,b){return{row:b._DT_CellIndex.row,column:b._DT_CellIndex.column}}).toArray();if(c.length||
!a.nodeName)return c;v=h(a).closest("*[data-dt-row]");return v.length?[{row:v.data("dt-row"),column:v.data("dt-column")}]:[]},b,e)});var d=this.columns(b,c),e=this.rows(a,c),f,g,j,i,n,l=this.iterator("table",function(a,b){f=[];g=0;for(j=e[b].length;g<j;g++){i=0;for(n=d[b].length;i<n;i++)f.push({row:e[b][g],column:d[b][i]})}return f},1);h.extend(l.selector,{cols:b,rows:a,opts:c});return l});u("cells().nodes()","cell().node()",function(){return this.iterator("cell",function(a,b,c){return(a=a.aoData[b])&&
a.anCells?a.anCells[c]:k},1)});o("cells().data()",function(){return this.iterator("cell",function(a,b,c){return B(a,b,c)},1)});u("cells().cache()","cell().cache()",function(a){a="search"===a?"_aFilterData":"_aSortData";return this.iterator("cell",function(b,c,d){return b.aoData[c][a][d]},1)});u("cells().render()","cell().render()",function(a){return this.iterator("cell",function(b,c,d){return B(b,c,d,a)},1)});u("cells().indexes()","cell().index()",function(){return this.iterator("cell",function(a,
b,c){return{row:b,column:c,columnVisible:$(a,c)}},1)});u("cells().invalidate()","cell().invalidate()",function(a){return this.iterator("cell",function(b,c,d){ca(b,c,a,d)})});o("cell()",function(a,b,c){return ab(this.cells(a,b,c))});o("cell().data()",function(a){var b=this.context,c=this[0];if(a===k)return b.length&&c.length?B(b[0],c[0].row,c[0].column):k;ib(b[0],c[0].row,c[0].column,a);ca(b[0],c[0].row,"data",c[0].column);return this});o("order()",function(a,b){var c=this.context;if(a===k)return 0!==
c.length?c[0].aaSorting:k;"number"===typeof a?a=[[a,b]]:a.length&&!h.isArray(a[0])&&(a=Array.prototype.slice.call(arguments));return this.iterator("table",function(b){b.aaSorting=a.slice()})});o("order.listener()",function(a,b,c){return this.iterator("table",function(d){La(d,a,b,c)})});o("order.fixed()",function(a){if(!a){var b=this.context,b=b.length?b[0].aaSortingFixed:k;return h.isArray(b)?{pre:b}:b}return this.iterator("table",function(b){b.aaSortingFixed=h.extend(!0,{},a)})});o(["columns().order()",
"column().order()"],function(a){var b=this;return this.iterator("table",function(c,d){var e=[];h.each(b[d],function(b,c){e.push([c,a])});c.aaSorting=e})});o("search()",function(a,b,c,d){var e=this.context;return a===k?0!==e.length?e[0].oPreviousSearch.sSearch:k:this.iterator("table",function(e){e.oFeatures.bFilter&&fa(e,h.extend({},e.oPreviousSearch,{sSearch:a+"",bRegex:null===b?!1:b,bSmart:null===c?!0:c,bCaseInsensitive:null===d?!0:d}),1)})});u("columns().search()","column().search()",function(a,
b,c,d){return this.iterator("column",function(e,f){var g=e.aoPreSearchCols;if(a===k)return g[f].sSearch;e.oFeatures.bFilter&&(h.extend(g[f],{sSearch:a+"",bRegex:null===b?!1:b,bSmart:null===c?!0:c,bCaseInsensitive:null===d?!0:d}),fa(e,e.oPreviousSearch,1))})});o("state()",function(){return this.context.length?this.context[0].oSavedState:null});o("state.clear()",function(){return this.iterator("table",function(a){a.fnStateSaveCallback.call(a.oInstance,a,{})})});o("state.loaded()",function(){return this.context.length?
this.context[0].oLoadedState:null});o("state.save()",function(){return this.iterator("table",function(a){xa(a)})});m.versionCheck=m.fnVersionCheck=function(a){for(var b=m.version.split("."),a=a.split("."),c,d,e=0,f=a.length;e<f;e++)if(c=parseInt(b[e],10)||0,d=parseInt(a[e],10)||0,c!==d)return c>d;return!0};m.isDataTable=m.fnIsDataTable=function(a){var b=h(a).get(0),c=!1;if(a instanceof m.Api)return!0;h.each(m.settings,function(a,e){var f=e.nScrollHead?h("table",e.nScrollHead)[0]:null,g=e.nScrollFoot?
h("table",e.nScrollFoot)[0]:null;if(e.nTable===b||f===b||g===b)c=!0});return c};m.tables=m.fnTables=function(a){var b=!1;h.isPlainObject(a)&&(b=a.api,a=a.visible);var c=h.map(m.settings,function(b){if(!a||a&&h(b.nTable).is(":visible"))return b.nTable});return b?new s(c):c};m.camelToHungarian=I;o("$()",function(a,b){var c=this.rows(b).nodes(),c=h(c);return h([].concat(c.filter(a).toArray(),c.find(a).toArray()))});h.each(["on","one","off"],function(a,b){o(b+"()",function(){var a=Array.prototype.slice.call(arguments);
a[0]=h.map(a[0].split(/\s/),function(a){return!a.match(/\.dt\b/)?a+".dt":a}).join(" ");var d=h(this.tables().nodes());d[b].apply(d,a);return this})});o("clear()",function(){return this.iterator("table",function(a){na(a)})});o("settings()",function(){return new s(this.context,this.context)});o("init()",function(){var a=this.context;return a.length?a[0].oInit:null});o("data()",function(){return this.iterator("table",function(a){return D(a.aoData,"_aData")}).flatten()});o("destroy()",function(a){a=a||
!1;return this.iterator("table",function(b){var c=b.nTableWrapper.parentNode,d=b.oClasses,e=b.nTable,f=b.nTBody,g=b.nTHead,j=b.nTFoot,i=h(e),f=h(f),k=h(b.nTableWrapper),l=h.map(b.aoData,function(a){return a.nTr}),o;b.bDestroying=!0;r(b,"aoDestroyCallback","destroy",[b]);a||(new s(b)).columns().visible(!0);k.off(".DT").find(":not(tbody *)").off(".DT");h(E).off(".DT-"+b.sInstance);e!=g.parentNode&&(i.children("thead").detach(),i.append(g));j&&e!=j.parentNode&&(i.children("tfoot").detach(),i.append(j));
b.aaSorting=[];b.aaSortingFixed=[];wa(b);h(l).removeClass(b.asStripeClasses.join(" "));h("th, td",g).removeClass(d.sSortable+" "+d.sSortableAsc+" "+d.sSortableDesc+" "+d.sSortableNone);f.children().detach();f.append(l);g=a?"remove":"detach";i[g]();k[g]();!a&&c&&(c.insertBefore(e,b.nTableReinsertBefore),i.css("width",b.sDestroyWidth).removeClass(d.sTable),(o=b.asDestroyStripes.length)&&f.children().each(function(a){h(this).addClass(b.asDestroyStripes[a%o])}));c=h.inArray(b,m.settings);-1!==c&&m.settings.splice(c,
1)})});h.each(["column","row","cell"],function(a,b){o(b+"s().every()",function(a){var d=this.selector.opts,e=this;return this.iterator(b,function(f,g,h,i,n){a.call(e[b](g,"cell"===b?h:d,"cell"===b?d:k),g,h,i,n)})})});o("i18n()",function(a,b,c){var d=this.context[0],a=Q(a)(d.oLanguage);a===k&&(a=b);c!==k&&h.isPlainObject(a)&&(a=a[c]!==k?a[c]:a._);return a.replace("%d",c)});m.version="1.10.16";m.settings=[];m.models={};m.models.oSearch={bCaseInsensitive:!0,sSearch:"",bRegex:!1,bSmart:!0};m.models.oRow=
{nTr:null,anCells:null,_aData:[],_aSortData:null,_aFilterData:null,_sFilterRow:null,_sRowStripe:"",src:null,idx:-1};m.models.oColumn={idx:null,aDataSort:null,asSorting:null,bSearchable:null,bSortable:null,bVisible:null,_sManualType:null,_bAttrSrc:!1,fnCreatedCell:null,fnGetData:null,fnSetData:null,mData:null,mRender:null,nTh:null,nTf:null,sClass:null,sContentPadding:null,sDefaultContent:null,sName:null,sSortDataType:"std",sSortingClass:null,sSortingClassJUI:null,sTitle:null,sType:null,sWidth:null,
sWidthOrig:null};m.defaults={aaData:null,aaSorting:[[0,"asc"]],aaSortingFixed:[],ajax:null,aLengthMenu:[10,25,50,100],aoColumns:null,aoColumnDefs:null,aoSearchCols:[],asStripeClasses:null,bAutoWidth:!0,bDeferRender:!1,bDestroy:!1,bFilter:!0,bInfo:!0,bLengthChange:!0,bPaginate:!0,bProcessing:!1,bRetrieve:!1,bScrollCollapse:!1,bServerSide:!1,bSort:!0,bSortMulti:!0,bSortCellsTop:!1,bSortClasses:!0,bStateSave:!1,fnCreatedRow:null,fnDrawCallback:null,fnFooterCallback:null,fnFormatNumber:function(a){return a.toString().replace(/\B(?=(\d{3})+(?!\d))/g,
this.oLanguage.sThousands)},fnHeaderCallback:null,fnInfoCallback:null,fnInitComplete:null,fnPreDrawCallback:null,fnRowCallback:null,fnServerData:null,fnServerParams:null,fnStateLoadCallback:function(a){try{return JSON.parse((-1===a.iStateDuration?sessionStorage:localStorage).getItem("DataTables_"+a.sInstance+"_"+location.pathname))}catch(b){}},fnStateLoadParams:null,fnStateLoaded:null,fnStateSaveCallback:function(a,b){try{(-1===a.iStateDuration?sessionStorage:localStorage).setItem("DataTables_"+a.sInstance+
"_"+location.pathname,JSON.stringify(b))}catch(c){}},fnStateSaveParams:null,iStateDuration:7200,iDeferLoading:null,iDisplayLength:10,iDisplayStart:0,iTabIndex:0,oClasses:{},oLanguage:{oAria:{sSortAscending:": activate to sort column ascending",sSortDescending:": activate to sort column descending"},oPaginate:{sFirst:"First",sLast:"Last",sNext:"Next",sPrevious:"Previous"},sEmptyTable:"No data available in table",sInfo:"Showing _START_ to _END_ of _TOTAL_ entries",sInfoEmpty:"Showing 0 to 0 of 0 entries",
sInfoFiltered:"(filtered from _MAX_ total entries)",sInfoPostFix:"",sDecimal:"",sThousands:",",sLengthMenu:"Show _MENU_ entries",sLoadingRecords:"Loading...",sProcessing:"Processing...",sSearch:"Search:",sSearchPlaceholder:"",sUrl:"",sZeroRecords:"No matching records found"},oSearch:h.extend({},m.models.oSearch),sAjaxDataProp:"data",sAjaxSource:null,sDom:"lfrtip",searchDelay:null,sPaginationType:"simple_numbers",sScrollX:"",sScrollXInner:"",sScrollY:"",sServerMethod:"GET",renderer:null,rowId:"DT_RowId"};
X(m.defaults);m.defaults.column={aDataSort:null,iDataSort:-1,asSorting:["asc","desc"],bSearchable:!0,bSortable:!0,bVisible:!0,fnCreatedCell:null,mData:null,mRender:null,sCellType:"td",sClass:"",sContentPadding:"",sDefaultContent:null,sName:"",sSortDataType:"std",sTitle:null,sType:null,sWidth:null};X(m.defaults.column);m.models.oSettings={oFeatures:{bAutoWidth:null,bDeferRender:null,bFilter:null,bInfo:null,bLengthChange:null,bPaginate:null,bProcessing:null,bServerSide:null,bSort:null,bSortMulti:null,
bSortClasses:null,bStateSave:null},oScroll:{bCollapse:null,iBarWidth:0,sX:null,sXInner:null,sY:null},oLanguage:{fnInfoCallback:null},oBrowser:{bScrollOversize:!1,bScrollbarLeft:!1,bBounding:!1,barWidth:0},ajax:null,aanFeatures:[],aoData:[],aiDisplay:[],aiDisplayMaster:[],aIds:{},aoColumns:[],aoHeader:[],aoFooter:[],oPreviousSearch:{},aoPreSearchCols:[],aaSorting:null,aaSortingFixed:[],asStripeClasses:null,asDestroyStripes:[],sDestroyWidth:0,aoRowCallback:[],aoHeaderCallback:[],aoFooterCallback:[],
aoDrawCallback:[],aoRowCreatedCallback:[],aoPreDrawCallback:[],aoInitComplete:[],aoStateSaveParams:[],aoStateLoadParams:[],aoStateLoaded:[],sTableId:"",nTable:null,nTHead:null,nTFoot:null,nTBody:null,nTableWrapper:null,bDeferLoading:!1,bInitialised:!1,aoOpenRows:[],sDom:null,searchDelay:null,sPaginationType:"two_button",iStateDuration:0,aoStateSave:[],aoStateLoad:[],oSavedState:null,oLoadedState:null,sAjaxSource:null,sAjaxDataProp:null,bAjaxDataGet:!0,jqXHR:null,json:k,oAjaxData:k,fnServerData:null,
aoServerParams:[],sServerMethod:null,fnFormatNumber:null,aLengthMenu:null,iDraw:0,bDrawing:!1,iDrawError:-1,_iDisplayLength:10,_iDisplayStart:0,_iRecordsTotal:0,_iRecordsDisplay:0,oClasses:{},bFiltered:!1,bSorted:!1,bSortCellsTop:null,oInit:null,aoDestroyCallback:[],fnRecordsTotal:function(){return"ssp"==y(this)?1*this._iRecordsTotal:this.aiDisplayMaster.length},fnRecordsDisplay:function(){return"ssp"==y(this)?1*this._iRecordsDisplay:this.aiDisplay.length},fnDisplayEnd:function(){var a=this._iDisplayLength,
b=this._iDisplayStart,c=b+a,d=this.aiDisplay.length,e=this.oFeatures,f=e.bPaginate;return e.bServerSide?!1===f||-1===a?b+d:Math.min(b+a,this._iRecordsDisplay):!f||c>d||-1===a?d:c},oInstance:null,sInstance:null,iTabIndex:0,nScrollHead:null,nScrollFoot:null,aLastSort:[],oPlugins:{},rowIdFn:null,rowId:null};m.ext=x={buttons:{},classes:{},builder:"-source-",errMode:"alert",feature:[],search:[],selector:{cell:[],column:[],row:[]},internal:{},legacy:{ajax:null},pager:{},renderer:{pageButton:{},header:{}},
order:{},type:{detect:[],search:{},order:{}},_unique:0,fnVersionCheck:m.fnVersionCheck,iApiIndex:0,oJUIClasses:{},sVersion:m.version};h.extend(x,{afnFiltering:x.search,aTypes:x.type.detect,ofnSearch:x.type.search,oSort:x.type.order,afnSortData:x.order,aoFeatures:x.feature,oApi:x.internal,oStdClasses:x.classes,oPagination:x.pager});h.extend(m.ext.classes,{sTable:"dataTable",sNoFooter:"no-footer",sPageButton:"paginate_button",sPageButtonActive:"current",sPageButtonDisabled:"disabled",sStripeOdd:"odd",
sStripeEven:"even",sRowEmpty:"dataTables_empty",sWrapper:"dataTables_wrapper",sFilter:"dataTables_filter",sInfo:"dataTables_info",sPaging:"dataTables_paginate paging_",sLength:"dataTables_length",sProcessing:"dataTables_processing",sSortAsc:"sorting_asc",sSortDesc:"sorting_desc",sSortable:"sorting",sSortableAsc:"sorting_asc_disabled",sSortableDesc:"sorting_desc_disabled",sSortableNone:"sorting_disabled",sSortColumn:"sorting_",sFilterInput:"",sLengthSelect:"",sScrollWrapper:"dataTables_scroll",sScrollHead:"dataTables_scrollHead",
sScrollHeadInner:"dataTables_scrollHeadInner",sScrollBody:"dataTables_scrollBody",sScrollFoot:"dataTables_scrollFoot",sScrollFootInner:"dataTables_scrollFootInner",sHeaderTH:"",sFooterTH:"",sSortJUIAsc:"",sSortJUIDesc:"",sSortJUI:"",sSortJUIAscAllowed:"",sSortJUIDescAllowed:"",sSortJUIWrapper:"",sSortIcon:"",sJUIHeader:"",sJUIFooter:""});var Kb=m.ext.pager;h.extend(Kb,{simple:function(){return["previous","next"]},full:function(){return["first","previous","next","last"]},numbers:function(a,b){return[ha(a,
b)]},simple_numbers:function(a,b){return["previous",ha(a,b),"next"]},full_numbers:function(a,b){return["first","previous",ha(a,b),"next","last"]},first_last_numbers:function(a,b){return["first",ha(a,b),"last"]},_numbers:ha,numbers_length:7});h.extend(!0,m.ext.renderer,{pageButton:{_:function(a,b,c,d,e,f){var g=a.oClasses,j=a.oLanguage.oPaginate,i=a.oLanguage.oAria.paginate||{},n,l,m=0,o=function(b,d){var k,s,u,r,v=function(b){Sa(a,b.data.action,true)};k=0;for(s=d.length;k<s;k++){r=d[k];if(h.isArray(r)){u=
h("<"+(r.DT_el||"div")+"/>").appendTo(b);o(u,r)}else{n=null;l="";switch(r){case "ellipsis":b.append('<span class="ellipsis">&#x2026;</span>');break;case "first":n=j.sFirst;l=r+(e>0?"":" "+g.sPageButtonDisabled);break;case "previous":n=j.sPrevious;l=r+(e>0?"":" "+g.sPageButtonDisabled);break;case "next":n=j.sNext;l=r+(e<f-1?"":" "+g.sPageButtonDisabled);break;case "last":n=j.sLast;l=r+(e<f-1?"":" "+g.sPageButtonDisabled);break;default:n=r+1;l=e===r?g.sPageButtonActive:""}if(n!==null){u=h("<a>",{"class":g.sPageButton+
" "+l,"aria-controls":a.sTableId,"aria-label":i[r],"data-dt-idx":m,tabindex:a.iTabIndex,id:c===0&&typeof r==="string"?a.sTableId+"_"+r:null}).html(n).appendTo(b);Va(u,{action:r},v);m++}}}},s;try{s=h(b).find(G.activeElement).data("dt-idx")}catch(u){}o(h(b).empty(),d);s!==k&&h(b).find("[data-dt-idx="+s+"]").focus()}}});h.extend(m.ext.type.detect,[function(a,b){var c=b.oLanguage.sDecimal;return Ya(a,c)?"num"+c:null},function(a){if(a&&!(a instanceof Date)&&!Zb.test(a))return null;var b=Date.parse(a);
return null!==b&&!isNaN(b)||L(a)?"date":null},function(a,b){var c=b.oLanguage.sDecimal;return Ya(a,c,!0)?"num-fmt"+c:null},function(a,b){var c=b.oLanguage.sDecimal;return Pb(a,c)?"html-num"+c:null},function(a,b){var c=b.oLanguage.sDecimal;return Pb(a,c,!0)?"html-num-fmt"+c:null},function(a){return L(a)||"string"===typeof a&&-1!==a.indexOf("<")?"html":null}]);h.extend(m.ext.type.search,{html:function(a){return L(a)?a:"string"===typeof a?a.replace(Mb," ").replace(Aa,""):""},string:function(a){return L(a)?
a:"string"===typeof a?a.replace(Mb," "):a}});var za=function(a,b,c,d){if(0!==a&&(!a||"-"===a))return-Infinity;b&&(a=Ob(a,b));a.replace&&(c&&(a=a.replace(c,"")),d&&(a=a.replace(d,"")));return 1*a};h.extend(x.type.order,{"date-pre":function(a){return Date.parse(a)||-Infinity},"html-pre":function(a){return L(a)?"":a.replace?a.replace(/<.*?>/g,"").toLowerCase():a+""},"string-pre":function(a){return L(a)?"":"string"===typeof a?a.toLowerCase():!a.toString?"":a.toString()},"string-asc":function(a,b){return a<
b?-1:a>b?1:0},"string-desc":function(a,b){return a<b?1:a>b?-1:0}});cb("");h.extend(!0,m.ext.renderer,{header:{_:function(a,b,c,d){h(a.nTable).on("order.dt.DT",function(e,f,g,h){if(a===f){e=c.idx;b.removeClass(c.sSortingClass+" "+d.sSortAsc+" "+d.sSortDesc).addClass(h[e]=="asc"?d.sSortAsc:h[e]=="desc"?d.sSortDesc:c.sSortingClass)}})},jqueryui:function(a,b,c,d){h("<div/>").addClass(d.sSortJUIWrapper).append(b.contents()).append(h("<span/>").addClass(d.sSortIcon+" "+c.sSortingClassJUI)).appendTo(b);
h(a.nTable).on("order.dt.DT",function(e,f,g,h){if(a===f){e=c.idx;b.removeClass(d.sSortAsc+" "+d.sSortDesc).addClass(h[e]=="asc"?d.sSortAsc:h[e]=="desc"?d.sSortDesc:c.sSortingClass);b.find("span."+d.sSortIcon).removeClass(d.sSortJUIAsc+" "+d.sSortJUIDesc+" "+d.sSortJUI+" "+d.sSortJUIAscAllowed+" "+d.sSortJUIDescAllowed).addClass(h[e]=="asc"?d.sSortJUIAsc:h[e]=="desc"?d.sSortJUIDesc:c.sSortingClassJUI)}})}}});var Vb=function(a){return"string"===typeof a?a.replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,
"&quot;"):a};m.render={number:function(a,b,c,d,e){return{display:function(f){if("number"!==typeof f&&"string"!==typeof f)return f;var g=0>f?"-":"",h=parseFloat(f);if(isNaN(h))return Vb(f);h=h.toFixed(c);f=Math.abs(h);h=parseInt(f,10);f=c?b+(f-h).toFixed(c).substring(2):"";return g+(d||"")+h.toString().replace(/\B(?=(\d{3})+(?!\d))/g,a)+f+(e||"")}}},text:function(){return{display:Vb}}};h.extend(m.ext.internal,{_fnExternApiFunc:Lb,_fnBuildAjax:sa,_fnAjaxUpdate:kb,_fnAjaxParameters:tb,_fnAjaxUpdateDraw:ub,
_fnAjaxDataSrc:ta,_fnAddColumn:Da,_fnColumnOptions:ja,_fnAdjustColumnSizing:Y,_fnVisibleToColumnIndex:Z,_fnColumnIndexToVisible:$,_fnVisbleColumns:aa,_fnGetColumns:la,_fnColumnTypes:Fa,_fnApplyColumnDefs:hb,_fnHungarianMap:X,_fnCamelToHungarian:I,_fnLanguageCompat:Ca,_fnBrowserDetect:fb,_fnAddData:M,_fnAddTr:ma,_fnNodeToDataIndex:function(a,b){return b._DT_RowIndex!==k?b._DT_RowIndex:null},_fnNodeToColumnIndex:function(a,b,c){return h.inArray(c,a.aoData[b].anCells)},_fnGetCellData:B,_fnSetCellData:ib,
_fnSplitObjNotation:Ia,_fnGetObjectDataFn:Q,_fnSetObjectDataFn:R,_fnGetDataMaster:Ja,_fnClearTable:na,_fnDeleteIndex:oa,_fnInvalidate:ca,_fnGetRowElements:Ha,_fnCreateTr:Ga,_fnBuildHead:jb,_fnDrawHead:ea,_fnDraw:N,_fnReDraw:S,_fnAddOptionsHtml:mb,_fnDetectHeader:da,_fnGetUniqueThs:ra,_fnFeatureHtmlFilter:ob,_fnFilterComplete:fa,_fnFilterCustom:xb,_fnFilterColumn:wb,_fnFilter:vb,_fnFilterCreateSearch:Oa,_fnEscapeRegex:Pa,_fnFilterData:yb,_fnFeatureHtmlInfo:rb,_fnUpdateInfo:Bb,_fnInfoMacros:Cb,_fnInitialise:ga,
_fnInitComplete:ua,_fnLengthChange:Qa,_fnFeatureHtmlLength:nb,_fnFeatureHtmlPaginate:sb,_fnPageChange:Sa,_fnFeatureHtmlProcessing:pb,_fnProcessingDisplay:C,_fnFeatureHtmlTable:qb,_fnScrollDraw:ka,_fnApplyToChildren:H,_fnCalculateColumnWidths:Ea,_fnThrottle:Na,_fnConvertToWidth:Db,_fnGetWidestNode:Eb,_fnGetMaxLenString:Fb,_fnStringToCss:v,_fnSortFlatten:V,_fnSort:lb,_fnSortAria:Hb,_fnSortListener:Ua,_fnSortAttachListener:La,_fnSortingClasses:wa,_fnSortData:Gb,_fnSaveState:xa,_fnLoadState:Ib,_fnSettingsFromNode:ya,
_fnLog:J,_fnMap:F,_fnBindAction:Va,_fnCallbackReg:z,_fnCallbackFire:r,_fnLengthOverflow:Ra,_fnRenderer:Ma,_fnDataSource:y,_fnRowAttributes:Ka,_fnCalculateEnd:function(){}});h.fn.dataTable=m;m.$=h;h.fn.dataTableSettings=m.settings;h.fn.dataTableExt=m.ext;h.fn.DataTable=function(a){return h(this).dataTable(a).api()};h.each(m,function(a,b){h.fn.DataTable[a]=b});return h.fn.dataTable});

File diff suppressed because one or more lines are too long

5
external_js/popper.min.js vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

85
html/cleaningTool.html Normal file
View File

@@ -0,0 +1,85 @@
<!--
ClearURLs
Copyright (c) 2017-2020 Kevin Röbert
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
-->
<!DOCTYPE html>
<html lang="en">
<head>
<title>Cleaning tool from ClearURLs</title>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon" sizes="any" type="image/svg+xml" href="/img/clearurls.svg">
<!-- Bootstrap CSS -->
<link rel="stylesheet" href="../css/bootstrap.min.css">
<link rel="stylesheet" href="../css/dataTables.bootstrap.min.css">
<link rel="stylesheet" type="text/css" href="../css/core.css">
<style>
td {
word-wrap: break-word;
max-width: 200px;
}
</style>
</head>
<body>
<nav class="navbar-margin navbar navbar-dark bg-dark">
<div class="container">
<span class="navbar-brand">
<span class="float-left"><img src="../img/clearurls.svg"
width="30" height="30" alt=""></span>
<span style="color: #FF7800;" class="float-right" id="page_title"></span><br />
<span class="badge badge-warning float-left small-version"
id="version"></span>
</span>
</div>
</nav>
<div class="row">
<div class="col-lg-4 offset-lg-4 text-center">
<h4 id="cleaning_tool_description"></h4>
<br />
<div class="form-group">
<label for="dirtyURLs" id="cleaning_tool_dirty_urls_label"></label>
<textarea id="dirtyURLs" name="dirtyURLs" class="form-control" rows="8" cols="60"></textarea>
</div>
<br />
<p class="text-center">
<button type="button" id="cleaning_tool_btn"
class="btn btn-success" title="Clean the URLs"></button>
</p>
<br />
<div class="form-group">
<label for="cleanURLs" id="cleaning_tool_clean_urls_label"></label>
<textarea id="cleanURLs" name="cleanURLs" class="form-control" rows="8" cols="60" readonly></textarea>
</div>
</div>
</div>
<!-- Optional JavaScript -->
<!-- jQuery first, then Popper.js, then Bootstrap JS -->
<script src="../browser-polyfill.js"></script>
<script src="../external_js/jquery-3.4.1.min.js"></script>
<script src="../external_js/bootstrap.min.js"></script>
<script src="../core_js/cleaning_tool.js"></script>
<script src="../core_js/write_version.js"></script>
</body>
</html>

View File

@@ -1,3 +1,22 @@
<!--
ClearURLs
Copyright (c) 2017-2020 Kevin Röbert
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
-->
<!DOCTYPE html>
<html lang="en">
<head>
@@ -10,36 +29,67 @@
<!-- Bootstrap CSS -->
<link rel="stylesheet" href="../css/bootstrap.min.css">
<link rel="stylesheet" href="../css/dataTables.bootstrap.min.css">
<link rel="stylesheet" href="../css/dataTables.min.css">
<link rel="stylesheet" type="text/css" href="../css/core.css">
<style>
td {
word-wrap: break-word;
max-width: 200px;
}
td {
word-wrap: break-word;
max-width: 200px;
}
.fileinput-button {
position: relative;
overflow: hidden;
display: inline-block;
}
.fileinput-button input {
position: absolute;
top: 0;
right: 0;
margin: 0;
opacity: 0;
-ms-filter: 'alpha(opacity=0)';
direction: ltr;
cursor: pointer;
}
</style>
</head>
<body>
<nav class="navbar navbar-inverse">
<nav class="navbar-margin navbar navbar-dark bg-dark">
<div class="container">
<div class="navbar-header">
<span class="navbar-brand">
<span class="pull-left"><img src="../img/clearurls.svg"
<span class="float-left"><img src="../img/clearurls.svg"
width="30" height="30" alt=""></span>
<span style="color: #FF7800;" class="pull-right" id="page_title"></span><br />
<span class="label label-warning pull-left small-version"
<span style="color: #FF7800;" class="float-right" id="page_title"></span><br />
<span class="badge badge-warning float-left small-version"
id="version"></span>
</span>
</div>
</div>
</nav>
<div class="row">
<div class="col-md-10 col-md-offset-1">
<div class="col-lg-10 offset-lg-1">
<p class="text-center">
<button type="button" id="reset_log_btn"
class="btn btn-danger" title="Reset the global log"></button>
class="btn btn-danger" title="Reset the global log">
</button>
<button type="button" id="export_log_btn"
class="btn btn-success" title="Export the global log">
<i class="fas fa-download"></i>
<span id="export_log_btn_text"></span>
</button>
<span id="import_log_btn"
class="btn btn-success fileinput-button" title="Import the global log">
<i class="fas fa-upload"></i>
<span id="import_log_btn_text"></span>
<input type="file" name="file" id="importLog"/>
</span>
</p>
<div class="table-responsive">
<table class="table table-striped table-bordered"
@@ -62,10 +112,10 @@
<!-- Optional JavaScript -->
<!-- jQuery first, then Popper.js, then Bootstrap JS -->
<script src="../browser-polyfill.js"></script>
<script src="../external_js/jquery-3.2.1.min.js"></script>
<script src="../external_js/jquery-3.4.1.min.js"></script>
<script src="../external_js/bootstrap.min.js"></script>
<script src="../external_js/jquery.dataTables.min.js"></script>
<script src="../external_js/dataTables.bootstrap.min.js"></script>
<script src="../external_js/dataTables.min.js"></script>
<script src="../external_js/fontawesome/all.min.js"></script>
<script src="../core_js/log.js"></script>
<script src="../core_js/write_version.js"></script>
</body>

View File

@@ -1,3 +1,22 @@
<!--
ClearURLs
Copyright (c) 2017-2020 Kevin Röbert
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
-->
<!DOCTYPE html>
<html lang="en">
<head>
@@ -8,48 +27,40 @@
<!-- Bootstrap CSS -->
<link rel="stylesheet" href="../css/bootstrap.min.css">
<link rel="stylesheet" href="../css/bootstrap-dialog.min.css">
<link rel="stylesheet" type="text/css" href="../css/switchButtons.css">
<link rel="stylesheet" type="text/css" href="../css/core.css">
</head>
<body>
<div id="body-popup">
<div class="container-fluid"
style="background: url('../img/img-noise-361x370.png');background-size: auto;">
style="background: url('../img/img-noise-361x370.png');background-size: auto;min-width: 200px;">
<div class="row">
<nav class="col-sm-1 navbar navbar-inverse">
<nav class="col-sm-1 navbar-margin navbar navbar-dark bg-dark">
<div class="container">
<div class="navbar-header">
<span class="navbar-brand">
<span class="pull-left"><img src="../img/clearurls.svg"
<span class="float-left"><img src="../img/clearurls.svg"
width="30" height="30" alt=""></span>
<span style="color: #FF7800;" class="pull-right">
<span style="color: #FF7800;" class="float-right brand">
ClearURLs
</span><br />
<span class="label label-warning pull-left small-version"
<span class="badge badge-warning float-left small-version"
id="version"></span>
<a id="donate" target="_blank" href="https://www.paypal.me/KevinRoebert">
<span class="pull-right glyphicon glyphicon-heart"></span>
</a>
</span>
</span>
<a id="donate" target="_blank" href="https://www.paypal.me/KevinRoebert">
<i class="float-right fas fa-hand-holding-usd"></i>
</a>
</div>
</div>
</nav>
</div>
<div class="row" id="incognito" style="display:none;">
<div class="col-sm-1">
<b class="text-justify word-wrap" style="color: #FF7800;">
The graphical elements of ClearURLs do not work in Incognito mode.<br />
ClearURLs still cleans all URLs.<br />
If you want to change settings, you must do so in a non-private tab.<br />
These changes will then be taken over here.
</b>
<div class="row" id="references_section">
<div class="col-sm-1 text-center">
<a id="cleaning_tools" target="_blank"><span class="fas fa-tools" style="font-size: 1.5em; margin-right: 1em;"></span></a>
<a id="settings" target="_blank"><span class="fas fa-cog" style="font-size: 1.5em"></span></a>
</div>
</div>
<div id="dialog"></div>
<div class="row" id="config_section">
<div class="col-sm-1">
<a id="settings" target="_blank"><span class="pull-right glyphicon glyphicon-cog"></span></a>
<h5><b id="configs_head"></b></h5>
<label class="switch">
<input type="checkbox" id="globalStatus">
@@ -84,36 +95,36 @@
<h5><b id="statistics_head"></b></h5>
<div class="progress">
<div class="progress-bar progress-bar-danger progress-bar-striped"
<div class="progress-bar bg-danger progress-bar-striped"
role="progressbar" style="width: 0%" id="progress_blocked"></div>
<div class="progress-bar progress-bar-info progress-bar-striped"
<div class="progress-bar bg-info progress-bar-striped"
role="progressbar" style="width: 100%" id="progress_non_blocked"></div>
</div>
<br>
<div>
<span class="pull-left" id="statistics_elements"></span>
<span class="pull-right text-info"
<span class="float-left" id="statistics_elements"></span>
<span class="float-right text-info"
id="statistics_total_elements"></span>
<div class="clearfix"></div>
</div>
<div>
<span class="pull-left" id="statistics_blocked"></span>
<span class="pull-right text-danger"
<span class="float-left" id="statistics_blocked"></span>
<span class="float-right text-danger"
id="statistics_value"></span>
<div class="clearfix"></div>
</div>
<div>
<span class="pull-left" id="statistics_percentage"></span>
<span class="pull-right text-success"
<span class="float-left" id="statistics_percentage"></span>
<span class="float-right text-success"
id="statistics_value_global_percentage"></span>
<div class="clearfix"></div>
</div>
<br />
<div class="text-center">
<button type="button" id="reset_counter_btn"
class="btn btn-danger btn-xs">
class="btn btn-danger btn-sm text-wrap">
</button>
<div class="clearfix"></div>
<br />
@@ -125,8 +136,8 @@
<div class="col-sm-1">
<h5><b id="rules_status_head"></b></h5>
<div class="text-center">
<a href="https://gitlab.com/KevinRoebert/ClearUrls/commits/master/data/data.json"
id="hashStatus" class="btn btn-primary btn-xs" target="_blank"></a>
<a href="https://gitlab.com/KevinRoebert/ClearUrls/commits/master/data/data.min.json"
id="hashStatus" class="btn btn-primary btn-sm text-wrap" target="_blank"></a>
</div>
<div class="clearfix"></div>
<br />
@@ -136,30 +147,21 @@
<div class="row" id="log_section">
<div class="col-sm-1">
<div class="text-center">
<a type="button" id="loggingPage" target="_blank"
class="btn btn-default btn-sm btn-block"></a>
<a id="loggingPage" target="_blank"
class="btn btn-default btn-sm btn-block text-wrap"></a>
</div>
</div>
</div>
<br />
<div class="row" id="report_section">
<div class="col-sm-1">
<div class="text-center">
<a type="button" id="reportButton" target="_blank"
class="btn btn-warning btn-sm btn-block"></a>
</div>
</div>
<br />
</div>
</div>
<!-- Optional JavaScript -->
<!-- jQuery first, then Popper.js, then Bootstrap JS -->
<script type="application/javascript" src="../browser-polyfill.js"></script>
<script src="../external_js/jquery-3.2.1.min.js"></script>
<script src="../external_js/bootstrap.min.js"></script>
<script src="../external_js/bootstrap-dialog.min.js"></script>
<script src="../core_js/popup_new.js"></script>
<script src="../core_js/write_version.js"></script>
<!-- Optional JavaScript -->
<!-- jQuery first, then Popper.js, then Bootstrap JS -->
<script type="application/javascript" src="../browser-polyfill.js"></script>
<script src="../external_js/jquery-3.4.1.min.js"></script>
<script src="../external_js/bootstrap.min.js"></script>
<script src="../external_js/fontawesome/all.min.js"></script>
<script src="../core_js/popup.js"></script>
<script src="../core_js/write_version.js"></script>
</body>
</html>

View File

@@ -1,3 +1,22 @@
<!--
ClearURLs
Copyright (c) 2017-2020 Kevin Röbert
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
-->
<!DOCTYPE html>
<html lang="en">
<head>
@@ -10,77 +29,154 @@
<!-- Bootstrap CSS -->
<link rel="stylesheet" href="../css/bootstrap.min.css">
<link rel="stylesheet" type="text/css" href="../css/switchButtons.css">
<link rel="stylesheet" type="text/css" href="../css/core.css">
<link rel="stylesheet" href="../css/pick-a-color-1.2.3.min.css">
<link rel="stylesheet" href="../css/bootstrap-colorpicker.min.css">
<style>
td {
word-wrap: break-word;
max-width: 200px;
}
td {
word-wrap: break-word;
max-width: 200px;
}
.fileinput-button {
position: relative;
overflow: hidden;
display: inline-block;
}
.fileinput-button input {
position: absolute;
top: 0;
right: 0;
margin: 0;
opacity: 0;
-ms-filter: 'alpha(opacity=0)';
direction: ltr;
cursor: pointer;
}
</style>
</head>
<body>
<nav class="navbar navbar-inverse">
<nav class="navbar-margin navbar navbar-dark bg-dark">
<div class="container">
<div class="navbar-header">
<span class="navbar-brand">
<span class="pull-left"><img src="../img/clearurls.svg"
<div class="navbar-brand">
<span class="float-left"><img src="../img/clearurls.svg"
width="30" height="30" alt=""></span>
<span style="color: #FF7800;" class="pull-right" id="page_title"></span><br />
<span class="label label-warning pull-left small-version"
id="version"></span>
<span style="color: #FF7800;" class="float-right" id="page_title"></span><br/>
<span class="badge badge-warning float-left small-version"
id="version"></span>
</div>
</div>
</nav>
<div class="row">
<div class="col-lg-4 offset-lg-4">
<p class="text-center">
<button type="button" id="reset_settings_btn"
class="btn btn-danger" title="Reset everything settings"></button>
<button type="button" id="export_settings_btn"
class="btn btn-success" title="Export the settings">
<i class="fas fa-download"></i>
<span id="export_settings_btn_text"></span>
</button>
<span id="import_settings_btn"
class="btn btn-success fileinput-button" title="Import the settings">
<i class="fas fa-upload"></i>
<span id="import_settings_btn_text"></span>
<input type="file" name="file" id="importSettings"/>
</span>
</p>
<br />
<label id="badged_color_label"></label><br />
<div id="badged-color-picker" class="input-group">
<input type="text" class="form-control input-lg" value="" name="badged_color" id="badged_color">
<span class="input-group-append">
<span class="input-group-text colorpicker-input-addon"><i></i></span>
</span>
</div>
<br />
<br />
<p>
<label id="rule_url_label"></label><br />
<input type="url" id="ruleURL" value="" name="ruleURL" class="form-control" />
</p>
<br />
<p>
<label id="hash_url_label"></label><br />
<input type="url" id="hashURL" value="" name="hashURL" class="form-control" />
</p>
<br />
<p>
<label id="types_label"></label><br />
<input type="text" id="types" value="" name="types" class="form-control" />
</p>
<br />
<p>
<label id="logLimit_label"></label><br />
<input type="number" id="logLimit" value="" name="logLimit" class="form-control" min="-1">
</p>
<br />
<p>
<label id="domain_blocking_enabled" style="font-weight: bold;"></label><br />
<label class="switch">
<input type="checkbox" id="domainBlocking">
<span class="slider round"></span>
</label>
</p>
<p>
<label id="local_hosts_skipping" style="font-weight: bold;"></label><br />
<label class="switch">
<input type="checkbox" id="localHostsSkipping">
<span class="slider round"></span>
</label>
</p>
<p>
<label id="history_listener_enabled" style="font-weight: bold;"></label><br />
<label class="switch">
<input type="checkbox" id="historyListenerEnabled">
<span class="slider round"></span>
</label>
</p>
<p>
<label id="context_menu_enabled" style="font-weight: bold;"></label><br />
<label class="switch">
<input type="checkbox" id="contextMenuEnabled">
<span class="slider round"></span>
</label>
</p>
<p>
<label id="referral_marketing_enabled" style="font-weight: bold;"></label><br />
<label class="switch">
<input type="checkbox" id="referralMarketing">
<span class="slider round"></span>
</label>
</p>
<p>
<label id="ping_blocking_enabled" style="font-weight: bold;"></label><br />
<label class="switch">
<input type="checkbox" id="pingBlocking">
<span class="slider round"></span>
</label>
</p>
<br />
<p class="text-center">
<button type="button" id="save_settings_btn"
class="btn btn-success" title="Save the settings"></button>
</p>
</div>
</div>
</nav>
<div class="row">
<div class="col-md-4 col-md-offset-4">
<p class="text-center">
<button type="button" id="reset_settings_btn"
class="btn btn-danger" title="Reset everything settings"></button>
</p>
<br />
<p>
<label id="badged_color_label"></label><br />
<input type="text" id="badged_color" value="" name="badged_color" class="pick-a-color form-control">
</p>
<br />
<p>
<label id="rule_url_label"></label><br />
<input type="url" id="rule_url" value="" name="rule_url" class="form-control" />
</p>
<br />
<p>
<label id="hash_url_label"></label><br />
<input type="url" id="hash_url" value="" name="hash_url" class="form-control" />
</p>
<br />
<p>
<label id="types_label"></label><br />
<input type="text" id="types" value="" name="types" class="form-control" />
</p>
<br />
<p>
<label id="report_server_label"></label><br />
<input type="text" id="report_server" value="" name="report_server" class="form-control" />
</p>
<br />
<p class="text-center">
<button type="button" id="save_settings_btn"
class="btn btn-success" title="Save the settings"></button>
</p>
</div>
</div>
<!-- Optional JavaScript -->
<script src="../browser-polyfill.js"></script>
<script src="../external_js/jquery-3.2.1.min.js"></script>
<script src="../external_js/bootstrap.min.js"></script>
<script src="../external_js/tinycolor-0.9.15.min.js"></script>
<script src="../external_js/pick-a-color-1.2.3.min.js"></script>
<script src="../core_js/settings.js"></script>
<script src="../core_js/write_version.js"></script>
</body>
</html>
<!-- Optional JavaScript -->
<script src="../browser-polyfill.js"></script>
<script src="../external_js/jquery-3.4.1.min.js"></script>
<script src="../external_js/popper.min.js"></script>
<script src="../external_js/bootstrap.min.js"></script>
<script src="../external_js/bootstrap-colorpicker.min.js"></script>
<script src="../external_js/fontawesome/all.min.js"></script>
<script src="../core_js/settings.js"></script>
<script src="../core_js/write_version.js"></script>
</body>
</html>

View File

@@ -1,7 +1,26 @@
<!--
ClearURLs
Copyright (c) 2017-2020 Kevin Röbert
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
-->
<!DOCTYPE html>
<html lang="en">
<head>
<title>This site or element was blocked by ClearURLs Add-on</title>
<title>This site was blocked by ClearURLs Add-on</title>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
@@ -33,27 +52,26 @@
<body>
<div class="container content">
<div class="row">
<div class="col-sm-10 col-sm-offset-1">
<h1 class="text-center">This site or element was blocked by <b>ClearURLs</b> Add-on</h1>
<div class="col-md-10 offset-md-1">
<h1 class="text-center" id="title"></h1>
<p class="text-center" id="body"></p>
<p class="text-center">
This site or element was blocked by <b>ClearURLs</b> Add-on, because we identify this site as an
advertising and/or tracking service.
<br>
To visit this site, you must temporarily deactivate the Add-on.
<a class="btn btn-warning" id="page"></a>
</p>
</div>
</div>
</div>
<footer class="navbar-fixed-bottom">
<div class="navbar-inverse text-center">
<small class="text-muted">Version 1.1.2.5</small>
</div>
<footer class="navbar navbar-dark bg-dark fixed-bottom">
<small class="text-muted">ClearURLs v.<span id="version"></span></small>
</footer>
<!-- Optional JavaScript -->
<!-- jQuery first, then Popper.js, then Bootstrap JS -->
<script src="../external_js/jquery-3.2.1.min.js"></script>
<script src="../browser-polyfill.js"></script>
<script src="../external_js/jquery-3.4.1.min.js"></script>
<script src="../external_js/bootstrap.min.js"></script>
<script src="../core_js/siteBlockedAlert.js"></script>
<script src="../core_js/write_version.js"></script>
</body>
</html>

BIN
img/clearurls_128x128.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

BIN
img/clearurls_16x16.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 542 B

BIN
img/clearurls_19x19.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 646 B

BIN
img/clearurls_20x20.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 663 B

BIN
img/clearurls_24x24.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 729 B

BIN
img/clearurls_30x30.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 854 B

BIN
img/clearurls_32x32.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 737 B

BIN
img/clearurls_38x38.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

BIN
img/clearurls_48x48.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
img/clearurls_64x64.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
img/clearurls_96x96.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

@@ -1,45 +1,43 @@
{
"manifest_version": 2,
"name": "ClearURLs",
"version": "1.3.4.0",
"author": "Kevin R.",
"description": "Remove tracking elements form URLs.",
"version": "1.13.0",
"author": "Kevin Röbert",
"description": "Remove tracking elements from URLs.",
"homepage_url": "https://gitlab.com/KevinRoebert/ClearUrls",
"default_locale": "en",
"applications": {
"gecko": {
"id": "{74145f27-f039-47ce-a470-a662b129930a}"
"id": "{74145f27-f039-47ce-a470-a662b129930a}"
}
},
"icons": {
"16": "img/clearurls.svg",
"19": "img/clearurls.svg",
"20": "img/clearurls.svg",
"24": "img/clearurls.svg",
"30": "img/clearurls.svg",
"32": "img/clearurls.svg",
"38": "img/clearurls.svg",
"48": "img/clearurls.svg",
"64": "img/clearurls.svg",
"96": "img/clearurls.svg",
"128": "img/clearurls.svg"
"16": "img/clearurls_16x16.png",
"19": "img/clearurls_19x19.png",
"20": "img/clearurls_20x20.png",
"24": "img/clearurls_24x24.png",
"30": "img/clearurls_30x30.png",
"32": "img/clearurls_32x32.png",
"38": "img/clearurls_38x38.png",
"48": "img/clearurls_48x48.png",
"64": "img/clearurls_64x64.png",
"96": "img/clearurls_96x96.png",
"128": "img/clearurls_128x128.png"
},
"browser_action": {
"browser_style": true,
"default_icon": {
"16": "img/clearurls.svg",
"19": "img/clearurls.svg",
"20": "img/clearurls.svg",
"24": "img/clearurls.svg",
"30": "img/clearurls.svg",
"32": "img/clearurls.svg",
"38": "img/clearurls.svg",
"48": "img/clearurls.svg",
"64": "img/clearurls.svg",
"96": "img/clearurls.svg",
"128": "img/clearurls.svg"
"16": "img/clearurls_16x16.png",
"19": "img/clearurls_19x19.png",
"20": "img/clearurls_20x20.png",
"24": "img/clearurls_24x24.png",
"30": "img/clearurls_30x30.png",
"32": "img/clearurls_32x32.png",
"38": "img/clearurls_38x38.png",
"48": "img/clearurls_48x48.png",
"64": "img/clearurls_64x64.png",
"96": "img/clearurls_96x96.png",
"128": "img/clearurls_128x128.png"
},
"default_title": "ClearURLs Add-on",
"default_popup": "html/popup.html"
@@ -50,22 +48,250 @@
"webRequest",
"webRequestBlocking",
"storage",
"tabs"
"unlimitedStorage",
"contextMenus",
"clipboardWrite",
"webNavigation",
"tabs",
"downloads"
],
"background": {
"scripts": [
"browser-polyfill.js",
"external_js/jquery-3.2.1.min.js",
"external_js/jquery-3.4.1.min.js",
"external_js/sha256.jquery.js",
"clearurls.js"
"core_js/message_handler.js",
"external_js/ip-range-check.js",
"core_js/tools.js",
"core_js/pureCleaning.js",
"core_js/context_menu.js",
"core_js/historyListener.js",
"clearurls.js",
"core_js/storage.js",
"core_js/watchdog.js"
]
},
"content_scripts": [
{
"matches": ["<all_urls>"],
"matches": [
"<all_urls>"
],
"js": [
"browser-polyfill.js"
]
},
{
"all_frames": true,
"matches": [
"*://*.google.com/*",
"*://*.google.ad/*",
"*://*.google.ae/*",
"*://*.google.com.af/*",
"*://*.google.com.ag/*",
"*://*.google.com.ai/*",
"*://*.google.al/*",
"*://*.google.am/*",
"*://*.google.co.ao/*",
"*://*.google.com.ar/*",
"*://*.google.as/*",
"*://*.google.at/*",
"*://*.google.com.au/*",
"*://*.google.az/*",
"*://*.google.ba/*",
"*://*.google.com.bd/*",
"*://*.google.be/*",
"*://*.google.bf/*",
"*://*.google.bg/*",
"*://*.google.com.bh/*",
"*://*.google.bi/*",
"*://*.google.bj/*",
"*://*.google.com.bn/*",
"*://*.google.com.bo/*",
"*://*.google.com.br/*",
"*://*.google.bs/*",
"*://*.google.bt/*",
"*://*.google.co.bw/*",
"*://*.google.by/*",
"*://*.google.com.bz/*",
"*://*.google.ca/*",
"*://*.google.cd/*",
"*://*.google.cf/*",
"*://*.google.cg/*",
"*://*.google.ch/*",
"*://*.google.ci/*",
"*://*.google.co.ck/*",
"*://*.google.cl/*",
"*://*.google.cm/*",
"*://*.google.cn/*",
"*://*.google.com.co/*",
"*://*.google.co.cr/*",
"*://*.google.com.cu/*",
"*://*.google.cv/*",
"*://*.google.com.cy/*",
"*://*.google.cz/*",
"*://*.google.de/*",
"*://*.google.dj/*",
"*://*.google.dk/*",
"*://*.google.dm/*",
"*://*.google.com.do/*",
"*://*.google.dz/*",
"*://*.google.com.ec/*",
"*://*.google.ee/*",
"*://*.google.com.eg/*",
"*://*.google.es/*",
"*://*.google.com.et/*",
"*://*.google.fi/*",
"*://*.google.com.fj/*",
"*://*.google.fm/*",
"*://*.google.fr/*",
"*://*.google.ga/*",
"*://*.google.ge/*",
"*://*.google.gg/*",
"*://*.google.com.gh/*",
"*://*.google.com.gi/*",
"*://*.google.gl/*",
"*://*.google.gm/*",
"*://*.google.gp/*",
"*://*.google.gr/*",
"*://*.google.com.gt/*",
"*://*.google.gy/*",
"*://*.google.com.hk/*",
"*://*.google.hn/*",
"*://*.google.hr/*",
"*://*.google.ht/*",
"*://*.google.hu/*",
"*://*.google.co.id/*",
"*://*.google.ie/*",
"*://*.google.co.il/*",
"*://*.google.im/*",
"*://*.google.co.in/*",
"*://*.google.iq/*",
"*://*.google.is/*",
"*://*.google.it/*",
"*://*.google.je/*",
"*://*.google.com.jm/*",
"*://*.google.jo/*",
"*://*.google.co.jp/*",
"*://*.google.co.ke/*",
"*://*.google.com.kh/*",
"*://*.google.ki/*",
"*://*.google.kg/*",
"*://*.google.co.kr/*",
"*://*.google.com.kw/*",
"*://*.google.kz/*",
"*://*.google.la/*",
"*://*.google.com.lb/*",
"*://*.google.li/*",
"*://*.google.lk/*",
"*://*.google.co.ls/*",
"*://*.google.lt/*",
"*://*.google.lu/*",
"*://*.google.lv/*",
"*://*.google.com.ly/*",
"*://*.google.co.ma/*",
"*://*.google.md/*",
"*://*.google.me/*",
"*://*.google.mg/*",
"*://*.google.mk/*",
"*://*.google.ml/*",
"*://*.google.com.mm/*",
"*://*.google.mn/*",
"*://*.google.ms/*",
"*://*.google.com.mt/*",
"*://*.google.mu/*",
"*://*.google.mv/*",
"*://*.google.mw/*",
"*://*.google.com.mx/*",
"*://*.google.com.my/*",
"*://*.google.co.mz/*",
"*://*.google.com.na/*",
"*://*.google.com.nf/*",
"*://*.google.com.ng/*",
"*://*.google.com.ni/*",
"*://*.google.ne/*",
"*://*.google.nl/*",
"*://*.google.no/*",
"*://*.google.com.np/*",
"*://*.google.nr/*",
"*://*.google.nu/*",
"*://*.google.co.nz/*",
"*://*.google.com.om/*",
"*://*.google.com.pa/*",
"*://*.google.com.pe/*",
"*://*.google.com.pg/*",
"*://*.google.com.ph/*",
"*://*.google.com.pk/*",
"*://*.google.pl/*",
"*://*.google.pn/*",
"*://*.google.com.pr/*",
"*://*.google.ps/*",
"*://*.google.pt/*",
"*://*.google.com.py/*",
"*://*.google.com.qa/*",
"*://*.google.ro/*",
"*://*.google.ru/*",
"*://*.google.rw/*",
"*://*.google.com.sa/*",
"*://*.google.com.sb/*",
"*://*.google.sc/*",
"*://*.google.se/*",
"*://*.google.com.sg/*",
"*://*.google.sh/*",
"*://*.google.si/*",
"*://*.google.sk/*",
"*://*.google.com.sl/*",
"*://*.google.sn/*",
"*://*.google.so/*",
"*://*.google.sm/*",
"*://*.google.sr/*",
"*://*.google.st/*",
"*://*.google.com.sv/*",
"*://*.google.td/*",
"*://*.google.tg/*",
"*://*.google.co.th/*",
"*://*.google.com.tj/*",
"*://*.google.tk/*",
"*://*.google.tl/*",
"*://*.google.tm/*",
"*://*.google.tn/*",
"*://*.google.to/*",
"*://*.google.com.tr/*",
"*://*.google.tt/*",
"*://*.google.com.tw/*",
"*://*.google.co.tz/*",
"*://*.google.com.ua/*",
"*://*.google.co.ug/*",
"*://*.google.co.uk/*",
"*://*.google.com.uy/*",
"*://*.google.co.uz/*",
"*://*.google.com.vc/*",
"*://*.google.co.ve/*",
"*://*.google.vg/*",
"*://*.google.co.vi/*",
"*://*.google.com.vn/*",
"*://*.google.vu/*",
"*://*.google.ws/*",
"*://*.google.rs/*",
"*://*.google.co.za/*",
"*://*.google.co.zm/*",
"*://*.google.co.zw/*",
"*://*.google.cat/*"
],
"js": [
"core_js/google_link_fix.js"
],
"run_at": "document_end"
},
{
"all_frames": true,
"matches": [
"*://*.yandex.ru/*",
"*://*.yandex.com/*"
],
"js": [
"core_js/yandex_link_fix.js"
],
"run_at": "document_end"
}
],
"options_ui": {

9473
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -22,11 +22,12 @@
}
],
"dependencies": {
"twbs/bootstrap": "3.3.7",
"jquery/jquery": "3.2.1",
"orsozed/sha256.jquery.plugin": "1.0",
"DataTables/DataTables": "1.10.16",
"lauren/pick-a-color": "1.2.3"
"ip-range-check": "^0.2.0",
"jquery/jquery": "3.2.1",
"lauren/pick-a-color": "1.2.3",
"orsozed/sha256.jquery.plugin": "1.0",
"twbs/bootstrap": "3.3.7"
},
"bugs": {
"web": "https://gitlab.com/KevinRoebert/ClearUrls/issues/new"

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 MiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 890 KiB

After

Width:  |  Height:  |  Size: 890 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Some files were not shown because too many files have changed in this diff Show More