├── .github ├── ISSUE_TEMPLATE.md └── PULL_REQUEST_TEMPLATE.md ├── .gitignore ├── .vscode └── settings.json ├── LICENSE ├── README.md ├── app.js ├── arduino_mouse ├── .gitignore ├── .vscode │ ├── extensions.json │ └── settings.json ├── include │ └── README ├── lib │ └── README ├── platformio.ini ├── src │ ├── main.cpp │ └── recoil.inc └── test │ └── README ├── assets ├── README.md ├── audio │ ├── alternator_0.mp3 │ ├── alternator_1.mp3 │ ├── alternator_2.mp3 │ ├── alternator_3.mp3 │ ├── car_0.mp3 │ ├── car_1.mp3 │ ├── car_2.mp3 │ ├── car_3.mp3 │ ├── devotion_0.mp3 │ ├── devotion_1.mp3 │ ├── devotion_2.mp3 │ ├── devotion_3.mp3 │ ├── devotion_tc_0.mp3 │ ├── devotion_tc_1.mp3 │ ├── devotion_tc_2.mp3 │ ├── devotion_tc_3.mp3 │ ├── flatline_19.mp3 │ ├── flatline_23.mp3 │ ├── flatline_27.mp3 │ ├── flatline_29.mp3 │ ├── havoc_tc_0.mp3 │ ├── havoc_tc_1.mp3 │ ├── havoc_tc_2.mp3 │ ├── havoc_tc_3.mp3 │ ├── lstar_20.mp3 │ ├── lstar_22.mp3 │ ├── lstar_24.mp3 │ ├── lstar_26.mp3 │ ├── lstar_28.mp3 │ ├── ping0.wav │ ├── ping1.wav │ ├── prowler_3.mp3 │ ├── r301_0.mp3 │ ├── r301_1.mp3 │ ├── r301_2.mp3 │ ├── r301_3.mp3 │ ├── r99_0.mp3 │ ├── r99_1.mp3 │ ├── r99_2.mp3 │ ├── r99_3.mp3 │ ├── r99_30.mp3 │ ├── rampage_0.mp3 │ ├── rampage_1.mp3 │ ├── rampage_2.mp3 │ ├── rampage_3.mp3 │ ├── rampage_revved_0.mp3 │ ├── rampage_revved_1.mp3 │ ├── rampage_revved_2.mp3 │ ├── rampage_revved_3.mp3 │ ├── re45_0.mp3 │ ├── re45_1.mp3 │ ├── re45_2.mp3 │ ├── re45_3.mp3 │ ├── spitfire_0.mp3 │ ├── spitfire_1.mp3 │ ├── spitfire_2.mp3 │ ├── spitfire_3.mp3 │ ├── spitfire_drop.mp3 │ ├── volt_0.mp3 │ ├── volt_1.mp3 │ ├── volt_2.mp3 │ └── volt_3.mp3 └── images │ ├── alternator.png │ ├── barrel_stock.png │ ├── barrel_stocki.png │ ├── car.png │ ├── devotion.png │ ├── flatline.png │ ├── havoc.png │ ├── hemlok.png │ ├── lstar.png │ ├── mag.png │ ├── magi.png │ ├── prowler.png │ ├── r301.png │ ├── r99.png │ ├── rampage.png │ ├── re45.png │ ├── spitfire.png │ ├── thermite_grenade.png │ └── volt.png ├── bin └── www ├── client ├── editor.ts ├── game.ts ├── main.ts ├── point.ts ├── raw_recoils.json ├── specs.json ├── stats.ts ├── storage.ts └── utils.ts ├── docs ├── capture.md ├── code-of-conduct.md ├── contributing.md ├── faq.md ├── notes.md ├── playbooks.md ├── privacy-policy-de.md ├── privacy-policy.md ├── release-notes.md └── res │ ├── cut.png │ ├── flatline_diff.png │ ├── r99_diff.png │ ├── yt_capture.png │ └── yt_convert.png ├── etc ├── GitHub-Mark-Light-32px.png ├── en.png ├── favicon-16x16.png ├── favicon-32x32.png ├── favicon.ico ├── outline_insert_chart_white_48dp.png ├── outline_run_circle_white_24dp.png ├── outline_slow_motion_video_white_24dp.png ├── plot.js ├── plotly-cartesian.min.js ├── red_dot.png ├── reddit.png ├── robots.txt ├── ru.png ├── tarteaucitron │ ├── .github │ │ ├── FUNDING.yml │ │ └── stale.yml │ ├── .gitignore │ ├── LICENSE │ ├── README.md │ ├── advertising.js │ ├── css │ │ └── tarteaucitron.css │ ├── lang │ │ ├── tarteaucitron.bg.js │ │ ├── tarteaucitron.ca.js │ │ ├── tarteaucitron.cn.js │ │ ├── tarteaucitron.cs.js │ │ ├── tarteaucitron.da.js │ │ ├── tarteaucitron.de.js │ │ ├── tarteaucitron.el.js │ │ ├── tarteaucitron.en.js │ │ ├── tarteaucitron.es.js │ │ ├── tarteaucitron.fi.js │ │ ├── tarteaucitron.fr.js │ │ ├── tarteaucitron.hu.js │ │ ├── tarteaucitron.it.js │ │ ├── tarteaucitron.ja.js │ │ ├── tarteaucitron.lv.js │ │ ├── tarteaucitron.nl.js │ │ ├── tarteaucitron.no.js │ │ ├── tarteaucitron.oc.js │ │ ├── tarteaucitron.pl.js │ │ ├── tarteaucitron.pt.js │ │ ├── tarteaucitron.ro.js │ │ ├── tarteaucitron.ru.js │ │ ├── tarteaucitron.se.js │ │ ├── tarteaucitron.sk.js │ │ ├── tarteaucitron.sv.js │ │ ├── tarteaucitron.tr.js │ │ ├── tarteaucitron.vi.js │ │ └── tarteaucitron.zh.js │ ├── package.json │ ├── tarteaucitron.js │ └── tarteaucitron.services.js ├── tarteaucitron_init.js ├── trail.png ├── volume_off_white_24dp.svg └── volume_up_white_24dp.svg ├── gulpfile.js ├── package-lock.json ├── package.json ├── processing ├── .gitignore ├── Pipfile ├── Pipfile.lock ├── convert_to_arduino_mouse.ipynb ├── gen_recoil_inc.py └── recoils.ipynb ├── reset.scss ├── style.scss ├── theme.json ├── theme.scss ├── tsconfig.json └── views ├── editor.pug ├── index-ru.pug ├── index-zh-CN.pug ├── index.pug └── layout.pug /.github/ISSUE_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | Please check existing issues https://github.com/metaflow/apex-recoil/issues first. 2 | Include your browser version and platform in case of rendering issues. 3 | ----------- 4 | -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | Fixes # 2 | 3 | > It's a good idea to open an issue first for discussion. 4 | 5 | - [ ] Tests pass 6 | - [ ] Appropriate changes to README are included in PR -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | public/ 2 | static/ 3 | 4 | # Logs 5 | logs 6 | *.log 7 | npm-debug.log* 8 | yarn-debug.log* 9 | yarn-error.log* 10 | 11 | # Runtime data 12 | pids 13 | *.pid 14 | *.seed 15 | *.pid.lock 16 | 17 | # Directory for instrumented libs generated by jscoverage/JSCover 18 | lib-cov 19 | 20 | # Coverage directory used by tools like istanbul 21 | coverage 22 | 23 | # nyc test coverage 24 | .nyc_output 25 | 26 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 27 | .grunt 28 | 29 | # Bower dependency directory (https://bower.io/) 30 | bower_components 31 | 32 | # node-waf configuration 33 | .lock-wscript 34 | 35 | # Compiled binary addons (https://nodejs.org/api/addons.html) 36 | build/Release 37 | 38 | # Dependency directories 39 | node_modules/ 40 | jspm_packages/ 41 | 42 | # Typescript v1 declaration files 43 | typings/ 44 | 45 | # Optional npm cache directory 46 | .npm 47 | 48 | # Optional eslint cache 49 | .eslintcache 50 | 51 | # Optional REPL history 52 | .node_repl_history 53 | 54 | # Output of 'npm pack' 55 | *.tgz 56 | 57 | # Yarn Integrity file 58 | .yarn-integrity 59 | 60 | # dotenv environment variables file 61 | .env 62 | 63 | # next.js build output 64 | .next 65 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "cSpell.words": [ 3 | "Datenschutzerkl", 4 | "Datenschutzerklärung", 5 | "lstar", 6 | "rulez", 7 | "rung", 8 | "tooltiptext" 9 | ] 10 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # About 2 | 3 | https://apexlegendsrecoils.net 4 | 5 | Visualization of recoil patterns from [Apex Legends](https://www.ea.com/games/apex-legends). 6 | 7 | [How recoils are captured](./docs/capture.md). 8 | 9 | # Contributing and support 10 | 11 | I would appreciate a kind word and up arrow [on Reddit](https://www.reddit.com/r/apexlegends/comments/mosk0l/i_have_created_an_app_to_practice_recoils/). Or just tell your friends about it. 12 | 13 | You can also help this project by suggesting an idea or contributing (I would still recommend to start with the idea). Check [contributing](./docs/contributing.md) and [Code of conduct](./docs/code-of-conduct.md). 14 | 15 | # License and disclaimers 16 | 17 | Source code licensed under [Apache 2](./LICENSE). 18 | 19 | This project is not affiliated with or sponsored by Google. 20 | 21 | This project is not affiliated with or sponsored by Electronic Arts Inc. or its licensors. 22 | 23 | ## Assets 24 | 25 | Images, audio fragments, weapon names and behavior come from Apex Legends game or from websites created and owned by [Electronic Arts Inc.](https://ea.com) or [Respawn Entertainment](https://www.respawn.com/"), who hold the copyright of Apex Legends. 26 | 27 | Some images and reference materials come from [Apex Legends Wiki](https://apexlegends.fandom.com/wiki). 28 | 29 | Thus multimedia content from [assets](./assets) is NOT under Apache 2.0 License. Get in touch with EA if you want to use it. 30 | 31 | ## Running the app 32 | 33 | For development run `npm run dev` and open `http://localhost:3000`. That will watch for file changes and update the 34 | content of `./public`. Running `start` by itself will not rebuild 35 | the bundle. 36 | 37 | Deployment is completely static and assembled with `npm run static`. 38 | 39 | Copy files from `./static` to the web server dir, for example by running `scp -r -i id_rsa .\static\* root@1.2.3.4:/var/www/html`. 40 | -------------------------------------------------------------------------------- /app.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright 2021 Mikhail Goncharov 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | var createError = require('http-errors'); 18 | var express = require('express'); 19 | var path = require('path'); 20 | var cookieParser = require('cookie-parser'); 21 | var logger = require('morgan'); 22 | 23 | var app = express(); 24 | 25 | app.set('views', path.join(__dirname, 'views')); 26 | app.set('view engine', 'pug'); 27 | 28 | app.use(logger('dev')); 29 | app.use(express.json()); 30 | app.use(express.urlencoded({ extended: false })); 31 | app.use(cookieParser()); 32 | app.use(express.static(path.join(__dirname, 'public'))); 33 | 34 | app.use('/editor', express.Router().get('/', function(req, res, next) { 35 | res.render('editor', { title: 'Editor' }); 36 | })); 37 | app.use('/ru', express.Router().get('/', function(req, res, next) { 38 | res.render('index-ru', { title: 'Apex Legends Recoils' }); 39 | })); 40 | app.use('/zh-CN', express.Router().get('/', function(req, res, next) { 41 | res.render('index-zh-CN', { title: 'Apex Legends Recoils' }); 42 | })); 43 | app.use('/*', express.Router().get('/', function(req, res, next) { 44 | res.render('index', { title: 'Apex Legends Recoils' }); 45 | })); 46 | 47 | // catch 404 and forward to error handler 48 | app.use(function(req, res, next) { 49 | next(createError(404)); 50 | }); 51 | 52 | // error handler 53 | app.use(function(err, req, res, next) { 54 | // set locals, only providing error in development 55 | res.locals.message = err.message; 56 | res.locals.error = req.app.get('env') === 'development' ? err : {}; 57 | 58 | // render the error page 59 | res.status(err.status || 500); 60 | res.render('error'); 61 | }); 62 | 63 | module.exports = app; 64 | -------------------------------------------------------------------------------- /arduino_mouse/.gitignore: -------------------------------------------------------------------------------- 1 | .pio 2 | .vscode/.browse.c_cpp.db* 3 | .vscode/c_cpp_properties.json 4 | .vscode/launch.json 5 | .vscode/ipch 6 | -------------------------------------------------------------------------------- /arduino_mouse/.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | // See http://go.microsoft.com/fwlink/?LinkId=827846 3 | // for the documentation about the extensions.json format 4 | "recommendations": [ 5 | "platformio.platformio-ide" 6 | ], 7 | "unwantedRecommendations": [ 8 | "ms-vscode.cpptools-extension-pack" 9 | ] 10 | } 11 | -------------------------------------------------------------------------------- /arduino_mouse/.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "files.associations": { 3 | "*.inc": "cpp" 4 | } 5 | } -------------------------------------------------------------------------------- /arduino_mouse/include/README: -------------------------------------------------------------------------------- 1 | 2 | This directory is intended for project header files. 3 | 4 | A header file is a file containing C declarations and macro definitions 5 | to be shared between several project source files. You request the use of a 6 | header file in your project source file (C, C++, etc) located in `src` folder 7 | by including it, with the C preprocessing directive `#include'. 8 | 9 | ```src/main.c 10 | 11 | #include "header.h" 12 | 13 | int main (void) 14 | { 15 | ... 16 | } 17 | ``` 18 | 19 | Including a header file produces the same results as copying the header file 20 | into each source file that needs it. Such copying would be time-consuming 21 | and error-prone. With a header file, the related declarations appear 22 | in only one place. If they need to be changed, they can be changed in one 23 | place, and programs that include the header file will automatically use the 24 | new version when next recompiled. The header file eliminates the labor of 25 | finding and changing all the copies as well as the risk that a failure to 26 | find one copy will result in inconsistencies within a program. 27 | 28 | In C, the usual convention is to give header files names that end with `.h'. 29 | It is most portable to use only letters, digits, dashes, and underscores in 30 | header file names, and at most one dot. 31 | 32 | Read more about using header files in official GCC documentation: 33 | 34 | * Include Syntax 35 | * Include Operation 36 | * Once-Only Headers 37 | * Computed Includes 38 | 39 | https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html 40 | -------------------------------------------------------------------------------- /arduino_mouse/lib/README: -------------------------------------------------------------------------------- 1 | 2 | This directory is intended for project specific (private) libraries. 3 | PlatformIO will compile them to static libraries and link into executable file. 4 | 5 | The source code of each library should be placed in a an own separate directory 6 | ("lib/your_library_name/[here are source files]"). 7 | 8 | For example, see a structure of the following two libraries `Foo` and `Bar`: 9 | 10 | |--lib 11 | | | 12 | | |--Bar 13 | | | |--docs 14 | | | |--examples 15 | | | |--src 16 | | | |- Bar.c 17 | | | |- Bar.h 18 | | | |- library.json (optional, custom build options, etc) https://docs.platformio.org/page/librarymanager/config.html 19 | | | 20 | | |--Foo 21 | | | |- Foo.c 22 | | | |- Foo.h 23 | | | 24 | | |- README --> THIS FILE 25 | | 26 | |- platformio.ini 27 | |--src 28 | |- main.c 29 | 30 | and a contents of `src/main.c`: 31 | ``` 32 | #include 33 | #include 34 | 35 | int main (void) 36 | { 37 | ... 38 | } 39 | 40 | ``` 41 | 42 | PlatformIO Library Dependency Finder will find automatically dependent 43 | libraries scanning project source files. 44 | 45 | More information about PlatformIO Library Dependency Finder 46 | - https://docs.platformio.org/page/librarymanager/ldf.html 47 | -------------------------------------------------------------------------------- /arduino_mouse/platformio.ini: -------------------------------------------------------------------------------- 1 | ; PlatformIO Project Configuration File 2 | ; 3 | ; Build options: build flags, source filter 4 | ; Upload options: custom upload port, speed and extra flags 5 | ; Library options: dependencies, extra library storages 6 | ; Advanced options: extra scripting 7 | ; 8 | ; Please visit documentation for the other options and examples 9 | ; https://docs.platformio.org/page/projectconf.html 10 | 11 | [env:leonardo] 12 | platform = atmelavr 13 | board = leonardo 14 | framework = arduino 15 | lib_deps = 16 | arduino-libraries/Mouse@^1.0.1 17 | marcoschwartz/LiquidCrystal_I2C@^1.1.4 18 | monitor_speed = 115200 19 | -------------------------------------------------------------------------------- /arduino_mouse/src/main.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | 6 | float scale = 1.0; 7 | const int invert = 1; // Or -1. 8 | const int BTN_1 = 4; 9 | const int BTN_2 = 10; 10 | const int MAX_LENGTH = 55; 11 | 12 | String name; 13 | float mx[MAX_LENGTH]; 14 | float my[MAX_LENGTH]; 15 | float mt[MAX_LENGTH]; 16 | int n; 17 | int current_recoil = 2; 18 | 19 | // Generated by processing/convert_to_arduino_mouse.ipynb 20 | #include "recoil.inc" 21 | 22 | LiquidCrystal_I2C lcd(0x27, 16, 2); 23 | 24 | float read_x(int r, int n) { 25 | return pgm_read_float(XDATA + (r * MAX_LENGTH + n)); 26 | } 27 | 28 | float read_y(int r, int n) { 29 | return pgm_read_float(YDATA + (r * MAX_LENGTH + n)); 30 | } 31 | 32 | uint32_t read_t(int r, int n) { 33 | return pgm_read_float(TDATA + (r * MAX_LENGTH + n)); 34 | } 35 | 36 | void load_recoil() { 37 | n = sizes[current_recoil]; 38 | name = names[current_recoil]; 39 | for (int i = 0; i < n; i++) { 40 | mx[i] = read_x(current_recoil, i); 41 | my[i] = read_y(current_recoil, i); 42 | mt[i] = read_t(current_recoil, i); 43 | } 44 | } 45 | 46 | void print_current() { 47 | lcd.home(); 48 | lcd.clear(); 49 | lcd.print(name); 50 | lcd.setCursor(0, 1); 51 | lcd.print(String("mag ") + String(n)); 52 | } 53 | 54 | void setup() { 55 | lcd.init(); 56 | lcd.backlight(); 57 | 58 | load_recoil(); 59 | print_current(); 60 | 61 | pinMode(BTN_1, INPUT); 62 | pinMode(5, OUTPUT); 63 | pinMode(6, OUTPUT); 64 | digitalWrite(5, HIGH); 65 | digitalWrite(6, LOW); 66 | 67 | pinMode(BTN_2, INPUT); 68 | pinMode(8, OUTPUT); 69 | digitalWrite(8, LOW); 70 | pinMode(9, OUTPUT); 71 | digitalWrite(9, HIGH); 72 | 73 | Mouse.begin(); 74 | } 75 | 76 | long start_time = 0; 77 | bool shooting = false; 78 | long idx = 0; // Index of the point we currently moving from; 79 | long mouse_x = 0; 80 | long mouse_y = 0; 81 | long signals = 0; 82 | 83 | void move() { 84 | long t = millis() - start_time; 85 | int last_progress = (idx * 17 / (n - 1)); 86 | while (idx + 1 < n && mt[idx + 1] <= t) { 87 | idx++; 88 | } 89 | int progress = (idx * 17 / (n - 1)); 90 | while (progress > last_progress) { 91 | last_progress++; 92 | lcd.print(char(0b11111111)); 93 | } 94 | if (idx + 1 >= n) { 95 | shooting = false; 96 | print_current(); 97 | 98 | delay(50); 99 | Mouse.release(MOUSE_LEFT); 100 | delay(10); 101 | Mouse.release(MOUSE_RIGHT); 102 | return; 103 | } 104 | float p = (1.0 * (t - mt[idx])) / (mt[idx + 1] - mt[idx]); 105 | if (p < 0) p = 0; 106 | if (p > 1) p = 1; 107 | long x = -round(scale * (mx[idx] + p * (mx[idx + 1] - mx[idx]))); 108 | long y = - invert * round(scale * (my[idx] + p * (my[idx + 1] - my[idx]))); 109 | if (x != mouse_x || y != mouse_y) { 110 | // Serial.println(String(t) + " " + String(p) + ": (" + String(x) + "," + String(y) + ") d (" + String(x - mouse_x) + "," + String(y - mouse_y) + ")"); 111 | Mouse.move(x - mouse_x, y - mouse_y, 0); 112 | signals++; 113 | mouse_x = x; 114 | mouse_y = y; 115 | } 116 | } 117 | 118 | const float circle_speed = 3 * 2 * 3.141 / 1000; 119 | const float radius = 40.0; 120 | 121 | int scale_modifer = 0; 122 | 123 | void loop() { 124 | if (shooting) { 125 | move(); 126 | return; 127 | } 128 | if (digitalRead(BTN_1) == HIGH) { 129 | lcd.clear(); 130 | lcd.home(); 131 | lcd.print("running.."); 132 | lcd.setCursor(0,1); 133 | shooting = true; 134 | idx = 0; 135 | mouse_x = 0; 136 | mouse_y = 0; 137 | signals = 0; 138 | Mouse.press(MOUSE_RIGHT); 139 | delay(700); 140 | Mouse.press(MOUSE_LEFT); 141 | start_time = millis(); 142 | } 143 | if (digitalRead(BTN_2) == HIGH) { 144 | current_recoil = (current_recoil + 1) % RECOILS_LENGTH; 145 | load_recoil(); 146 | print_current(); 147 | delay(1000); 148 | } 149 | } -------------------------------------------------------------------------------- /arduino_mouse/test/README: -------------------------------------------------------------------------------- 1 | 2 | This directory is intended for PlatformIO Unit Testing and project tests. 3 | 4 | Unit Testing is a software testing method by which individual units of 5 | source code, sets of one or more MCU program modules together with associated 6 | control data, usage procedures, and operating procedures, are tested to 7 | determine whether they are fit for use. Unit testing finds problems early 8 | in the development cycle. 9 | 10 | More information about PlatformIO Unit Testing: 11 | - https://docs.platformio.org/page/plus/unit-testing.html 12 | -------------------------------------------------------------------------------- /assets/README.md: -------------------------------------------------------------------------------- 1 | Some images and reference materials come from [Apex Legends Wiki](https://apexlegends.fandom.com/wiki). 2 | 3 | Images, audio fragments, weapon names and behavior are captured from the Apex Legends game or come from websites created and owned by [Electronic Arts Inc.](https://ea.com) or [Respawn Entertainment](https://www.respawn.com/"), who hold the copyright of Apex Legends. 4 | 5 | Audio is mono exported with audacity setting preset / medium 145-185kpbs / fast / joint stereo. 6 | 7 | I don't own these files, please contact EA if you want to reuse them. -------------------------------------------------------------------------------- /assets/audio/alternator_0.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/assets/audio/alternator_0.mp3 -------------------------------------------------------------------------------- /assets/audio/alternator_1.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/assets/audio/alternator_1.mp3 -------------------------------------------------------------------------------- /assets/audio/alternator_2.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/assets/audio/alternator_2.mp3 -------------------------------------------------------------------------------- /assets/audio/alternator_3.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/assets/audio/alternator_3.mp3 -------------------------------------------------------------------------------- /assets/audio/car_0.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/assets/audio/car_0.mp3 -------------------------------------------------------------------------------- /assets/audio/car_1.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/assets/audio/car_1.mp3 -------------------------------------------------------------------------------- /assets/audio/car_2.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/assets/audio/car_2.mp3 -------------------------------------------------------------------------------- /assets/audio/car_3.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/assets/audio/car_3.mp3 -------------------------------------------------------------------------------- /assets/audio/devotion_0.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/assets/audio/devotion_0.mp3 -------------------------------------------------------------------------------- /assets/audio/devotion_1.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/assets/audio/devotion_1.mp3 -------------------------------------------------------------------------------- /assets/audio/devotion_2.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/assets/audio/devotion_2.mp3 -------------------------------------------------------------------------------- /assets/audio/devotion_3.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/assets/audio/devotion_3.mp3 -------------------------------------------------------------------------------- /assets/audio/devotion_tc_0.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/assets/audio/devotion_tc_0.mp3 -------------------------------------------------------------------------------- /assets/audio/devotion_tc_1.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/assets/audio/devotion_tc_1.mp3 -------------------------------------------------------------------------------- /assets/audio/devotion_tc_2.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/assets/audio/devotion_tc_2.mp3 -------------------------------------------------------------------------------- /assets/audio/devotion_tc_3.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/assets/audio/devotion_tc_3.mp3 -------------------------------------------------------------------------------- /assets/audio/flatline_19.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/assets/audio/flatline_19.mp3 -------------------------------------------------------------------------------- /assets/audio/flatline_23.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/assets/audio/flatline_23.mp3 -------------------------------------------------------------------------------- /assets/audio/flatline_27.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/assets/audio/flatline_27.mp3 -------------------------------------------------------------------------------- /assets/audio/flatline_29.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/assets/audio/flatline_29.mp3 -------------------------------------------------------------------------------- /assets/audio/havoc_tc_0.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/assets/audio/havoc_tc_0.mp3 -------------------------------------------------------------------------------- /assets/audio/havoc_tc_1.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/assets/audio/havoc_tc_1.mp3 -------------------------------------------------------------------------------- /assets/audio/havoc_tc_2.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/assets/audio/havoc_tc_2.mp3 -------------------------------------------------------------------------------- /assets/audio/havoc_tc_3.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/assets/audio/havoc_tc_3.mp3 -------------------------------------------------------------------------------- /assets/audio/lstar_20.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/assets/audio/lstar_20.mp3 -------------------------------------------------------------------------------- /assets/audio/lstar_22.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/assets/audio/lstar_22.mp3 -------------------------------------------------------------------------------- /assets/audio/lstar_24.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/assets/audio/lstar_24.mp3 -------------------------------------------------------------------------------- /assets/audio/lstar_26.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/assets/audio/lstar_26.mp3 -------------------------------------------------------------------------------- /assets/audio/lstar_28.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/assets/audio/lstar_28.mp3 -------------------------------------------------------------------------------- /assets/audio/ping0.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/assets/audio/ping0.wav -------------------------------------------------------------------------------- /assets/audio/ping1.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/assets/audio/ping1.wav -------------------------------------------------------------------------------- /assets/audio/prowler_3.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/assets/audio/prowler_3.mp3 -------------------------------------------------------------------------------- /assets/audio/r301_0.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/assets/audio/r301_0.mp3 -------------------------------------------------------------------------------- /assets/audio/r301_1.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/assets/audio/r301_1.mp3 -------------------------------------------------------------------------------- /assets/audio/r301_2.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/assets/audio/r301_2.mp3 -------------------------------------------------------------------------------- /assets/audio/r301_3.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/assets/audio/r301_3.mp3 -------------------------------------------------------------------------------- /assets/audio/r99_0.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/assets/audio/r99_0.mp3 -------------------------------------------------------------------------------- /assets/audio/r99_1.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/assets/audio/r99_1.mp3 -------------------------------------------------------------------------------- /assets/audio/r99_2.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/assets/audio/r99_2.mp3 -------------------------------------------------------------------------------- /assets/audio/r99_3.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/assets/audio/r99_3.mp3 -------------------------------------------------------------------------------- /assets/audio/r99_30.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/assets/audio/r99_30.mp3 -------------------------------------------------------------------------------- /assets/audio/rampage_0.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/assets/audio/rampage_0.mp3 -------------------------------------------------------------------------------- /assets/audio/rampage_1.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/assets/audio/rampage_1.mp3 -------------------------------------------------------------------------------- /assets/audio/rampage_2.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/assets/audio/rampage_2.mp3 -------------------------------------------------------------------------------- /assets/audio/rampage_3.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/assets/audio/rampage_3.mp3 -------------------------------------------------------------------------------- /assets/audio/rampage_revved_0.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/assets/audio/rampage_revved_0.mp3 -------------------------------------------------------------------------------- /assets/audio/rampage_revved_1.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/assets/audio/rampage_revved_1.mp3 -------------------------------------------------------------------------------- /assets/audio/rampage_revved_2.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/assets/audio/rampage_revved_2.mp3 -------------------------------------------------------------------------------- /assets/audio/rampage_revved_3.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/assets/audio/rampage_revved_3.mp3 -------------------------------------------------------------------------------- /assets/audio/re45_0.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/assets/audio/re45_0.mp3 -------------------------------------------------------------------------------- /assets/audio/re45_1.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/assets/audio/re45_1.mp3 -------------------------------------------------------------------------------- /assets/audio/re45_2.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/assets/audio/re45_2.mp3 -------------------------------------------------------------------------------- /assets/audio/re45_3.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/assets/audio/re45_3.mp3 -------------------------------------------------------------------------------- /assets/audio/spitfire_0.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/assets/audio/spitfire_0.mp3 -------------------------------------------------------------------------------- /assets/audio/spitfire_1.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/assets/audio/spitfire_1.mp3 -------------------------------------------------------------------------------- /assets/audio/spitfire_2.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/assets/audio/spitfire_2.mp3 -------------------------------------------------------------------------------- /assets/audio/spitfire_3.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/assets/audio/spitfire_3.mp3 -------------------------------------------------------------------------------- /assets/audio/spitfire_drop.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/assets/audio/spitfire_drop.mp3 -------------------------------------------------------------------------------- /assets/audio/volt_0.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/assets/audio/volt_0.mp3 -------------------------------------------------------------------------------- /assets/audio/volt_1.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/assets/audio/volt_1.mp3 -------------------------------------------------------------------------------- /assets/audio/volt_2.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/assets/audio/volt_2.mp3 -------------------------------------------------------------------------------- /assets/audio/volt_3.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/assets/audio/volt_3.mp3 -------------------------------------------------------------------------------- /assets/images/alternator.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/assets/images/alternator.png -------------------------------------------------------------------------------- /assets/images/barrel_stock.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/assets/images/barrel_stock.png -------------------------------------------------------------------------------- /assets/images/barrel_stocki.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/assets/images/barrel_stocki.png -------------------------------------------------------------------------------- /assets/images/car.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/assets/images/car.png -------------------------------------------------------------------------------- /assets/images/devotion.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/assets/images/devotion.png -------------------------------------------------------------------------------- /assets/images/flatline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/assets/images/flatline.png -------------------------------------------------------------------------------- /assets/images/havoc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/assets/images/havoc.png -------------------------------------------------------------------------------- /assets/images/hemlok.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/assets/images/hemlok.png -------------------------------------------------------------------------------- /assets/images/lstar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/assets/images/lstar.png -------------------------------------------------------------------------------- /assets/images/mag.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/assets/images/mag.png -------------------------------------------------------------------------------- /assets/images/magi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/assets/images/magi.png -------------------------------------------------------------------------------- /assets/images/prowler.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/assets/images/prowler.png -------------------------------------------------------------------------------- /assets/images/r301.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/assets/images/r301.png -------------------------------------------------------------------------------- /assets/images/r99.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/assets/images/r99.png -------------------------------------------------------------------------------- /assets/images/rampage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/assets/images/rampage.png -------------------------------------------------------------------------------- /assets/images/re45.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/assets/images/re45.png -------------------------------------------------------------------------------- /assets/images/spitfire.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/assets/images/spitfire.png -------------------------------------------------------------------------------- /assets/images/thermite_grenade.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/assets/images/thermite_grenade.png -------------------------------------------------------------------------------- /assets/images/volt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/assets/images/volt.png -------------------------------------------------------------------------------- /bin/www: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | /** 4 | * Module dependencies. 5 | */ 6 | 7 | var app = require('../app'); 8 | var debug = require('debug')('app:server'); 9 | var http = require('http'); 10 | 11 | /** 12 | * Get port from environment and store in Express. 13 | */ 14 | 15 | var port = normalizePort(process.env.PORT || '3000'); 16 | app.set('port', port); 17 | 18 | /** 19 | * Create HTTP server. 20 | */ 21 | 22 | var server = http.createServer(app); 23 | 24 | /** 25 | * Listen on provided port, on all network interfaces. 26 | */ 27 | 28 | server.listen(port); 29 | server.on('error', onError); 30 | server.on('listening', onListening); 31 | 32 | /** 33 | * Normalize a port into a number, string, or false. 34 | */ 35 | 36 | function normalizePort(val) { 37 | var port = parseInt(val, 10); 38 | 39 | if (isNaN(port)) { 40 | // named pipe 41 | return val; 42 | } 43 | 44 | if (port >= 0) { 45 | // port number 46 | return port; 47 | } 48 | 49 | return false; 50 | } 51 | 52 | /** 53 | * Event listener for HTTP server "error" event. 54 | */ 55 | 56 | function onError(error) { 57 | if (error.syscall !== 'listen') { 58 | throw error; 59 | } 60 | 61 | var bind = typeof port === 'string' 62 | ? 'Pipe ' + port 63 | : 'Port ' + port; 64 | 65 | // handle specific listen errors with friendly messages 66 | switch (error.code) { 67 | case 'EACCES': 68 | console.error(bind + ' requires elevated privileges'); 69 | process.exit(1); 70 | break; 71 | case 'EADDRINUSE': 72 | console.error(bind + ' is already in use'); 73 | process.exit(1); 74 | break; 75 | default: 76 | throw error; 77 | } 78 | } 79 | 80 | /** 81 | * Event listener for HTTP server "listening" event. 82 | */ 83 | 84 | function onListening() { 85 | var addr = server.address(); 86 | var bind = typeof addr === 'string' 87 | ? 'pipe ' + addr 88 | : 'port ' + addr.port; 89 | debug('Listening on ' + bind); 90 | } 91 | -------------------------------------------------------------------------------- /client/main.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright 2021 Mikhail Goncharov 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | import Konva from 'konva'; 18 | import { Point } from './point'; 19 | import { initGame } from './game'; 20 | import { setupEditor } from './editor'; 21 | import { pokeAttrs } from './storage'; 22 | 23 | export const stage = new Konva.Stage({ 24 | container: 'stage', 25 | width: window.screen.width, 26 | height: window.screen.height, 27 | }); 28 | 29 | document.getElementById('stage')?.addEventListener('contextmenu', e => { 30 | e.preventDefault(); 31 | }); 32 | 33 | export const layer = new Konva.Layer(); 34 | stage.add(layer); 35 | 36 | export function cursor(): Point { 37 | let pos = stage.getPointerPosition(); 38 | if (pos == null) pos = { x: 0, y: 0 }; 39 | return new Point(pos); 40 | } 41 | 42 | if (window.location.hostname.includes('.online')) { 43 | alert('Apex Legends Recoils is moving to a new domain and .ONLINE will not be available from 10 of April.\n'+ 44 | 'Please update your bookmark to apexlegendsrecoils.NET.\nYou will now be redirected.'); 45 | window.location.href = 'http://apexlegendsrecoils.net' + window.location.pathname; 46 | } 47 | 48 | if (window.location.pathname.startsWith('/editor')) { 49 | setupEditor(); 50 | } else { 51 | initGame(); 52 | } 53 | pokeAttrs(); 54 | stage.batchDraw(); -------------------------------------------------------------------------------- /client/point.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright 2021 Mikhail Goncharov 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | import Konva from "konva"; 18 | import { error } from "./utils"; 19 | 20 | export class PlainPoint { 21 | x: number = 0; 22 | y: number = 0; 23 | }; 24 | 25 | export class Point implements Konva.Vector2d { 26 | x: number = 0; 27 | y: number = 0; 28 | constructor(v?: number | Point | PlainPoint | null, y?: number) { 29 | if (v == null) v = 0; 30 | if (v instanceof Point) { 31 | this.x = v.x; 32 | this.y = v.y; 33 | return; 34 | } 35 | const a = v as any; 36 | if (a.x != null && a.y != null) { 37 | this.x = a.x; 38 | this.y = a.y; 39 | return; 40 | } 41 | if (typeof v === 'number') { 42 | this.x = v; 43 | } else { 44 | error(v, 'is not a valid init value for point'); 45 | } 46 | if (y == undefined) y = 0; 47 | this.y = y; 48 | } 49 | align(a: number | null): this { 50 | if (a == null) return this; 51 | this.x = Math.round(this.x / a) * a; 52 | this.y = Math.round(this.y / a) * a; 53 | return this; 54 | } 55 | clone(): this { 56 | return new (this.constructor as any)(this.x, this.y); 57 | } 58 | s(v: number): this { 59 | this.x = this.x * v; 60 | this.y = this.y * v; 61 | return this; 62 | } 63 | sx(v: number): this { 64 | this.x = this.x * v; 65 | return this; 66 | } 67 | sy(v: number): this { 68 | this.y = this.y * v; 69 | return this; 70 | } 71 | sub(other: this): this { 72 | this.x = this.x - other.x; 73 | this.y = this.y - other.y; 74 | return this; 75 | } 76 | add(other: this): this { 77 | this.x = this.x + other.x; 78 | this.y = this.y + other.y; 79 | return this; 80 | } 81 | // Can be removed? 82 | plain() { 83 | return { x: this.x, y: this.y } as PlainPoint; 84 | } 85 | array(): [number, number] { 86 | return [this.x, this.y]; 87 | } 88 | distance(other: this): number { 89 | const dx = this.x - other.x; 90 | const dy = this.y - other.y; 91 | return Math.sqrt(dx * dx + dy * dy); 92 | } 93 | closeTo(other: this): boolean { 94 | return this.distance(other) < 0.1; 95 | } 96 | atan2(): number { 97 | return Math.atan2(this.x, this.y); 98 | } 99 | dot(o: this): number { 100 | return this.x * o.x + this.y * o.y; 101 | } 102 | length(): number { 103 | return Math.sqrt(this.x * this.x + this.y * this.y); 104 | } 105 | }; -------------------------------------------------------------------------------- /client/stats.ts: -------------------------------------------------------------------------------- 1 | // import { getAttr, setAttr } from "./storage"; 2 | import { StringAttribute } from "./storage"; 3 | import { today } from "./utils"; 4 | 5 | const statsDataVersion = 3; 6 | export let stats: TrialStats[] = []; 7 | export const aStats = new StringAttribute('stats', 'game:', '[]'); 8 | 9 | export function percentile(values: number[], p: number) { 10 | const xx = values.map(x => x); 11 | if (xx.length === 0 || p < 0) return NaN; 12 | if (p > 1) p = 1; 13 | xx.sort((a, b) => a - b); 14 | const i = (xx.length - 1) * p; 15 | if ((i | 0) === i) return xx[i]; 16 | var int_part = i | 0; 17 | var f = i - int_part; 18 | return (1 - f) * xx[int_part] + f * xx[Math.min(int_part + 1, xx.length - 1)]; 19 | } 20 | 21 | export interface TrialSetup { 22 | weapon: string; 23 | mag: number; 24 | hint: boolean; 25 | moving: boolean; 26 | } 27 | 28 | // [day (2021-04-30 is represented as 20210430), count, median, best]. 29 | type DayResults = [number, number, number, number]; 30 | 31 | interface TrialStats { 32 | v: number; 33 | setup: TrialSetup; 34 | dayResults: DayResults[]; 35 | bestAllTime: number; 36 | today: number; 37 | todayResults: number[]; 38 | }; 39 | 40 | export function loadStats() { 41 | // console.log('stats raw', JSON.parse(getAttr('stats'))); 42 | JSON.parse(aStats.get()).forEach((t: any) => { 43 | const s = t['setup']; 44 | if (s === undefined) return; 45 | let version = t['v']; 46 | if (version == null) { 47 | // Initial un-versioned storage. 48 | if (s['barrel'] != null && s['barrel'] != '0') return; 49 | if (s['stock'] != null && s['stock'] != '0') return; 50 | const setup: TrialSetup = { 51 | weapon: s['weapon'] || '', 52 | mag: s['mag'] || '0', 53 | hint: s['hint'] || 'true', 54 | moving: false, 55 | }; 56 | const st: TrialStats = { 57 | v: statsDataVersion, 58 | setup, 59 | today: 20210423, 60 | dayResults: t['days'].map((d: number, i: number) => { 61 | const z: DayResults = [ 62 | (Math.floor(d / 100) + 1) * 100 + d % 100 + 1, 63 | 0, 64 | t['medianByDay'][i], 65 | t['bestByDay'][i], 66 | ]; 67 | return z; 68 | }), 69 | todayResults: t['todayResults'] || [], 70 | bestAllTime: t.bestAllTime, 71 | } 72 | t = st; 73 | stats.push(st); 74 | version = 1; 75 | } 76 | if (version == 1) { 77 | // Delete entries that have only "path visible" set. 78 | if (s['hint'] == 'true' && s['pacer'] == 'false') return; 79 | delete (s['pacer']); 80 | version = 2; 81 | } 82 | if (version == 2) { 83 | s['moving'] = false; 84 | s['hint'] = s['hint'] == 'true'; 85 | s['mag'] = Number(s['mag']); 86 | version = 3; 87 | } 88 | t['v'] = statsDataVersion; 89 | stats.push(t); 90 | }); 91 | stats.forEach(s => touchStat(s)); 92 | // console.log('loaded', stats); 93 | } 94 | 95 | function touchStat(s: TrialStats) { 96 | const t = today(); 97 | if (s.today == t) return; 98 | if (s.todayResults.length > 0) { 99 | const r: DayResults = [ 100 | s.today, 101 | s.todayResults.length, 102 | percentile(s.todayResults, 0.5), 103 | percentile(s.todayResults, 1) 104 | ]; 105 | s.dayResults.push(r); 106 | } 107 | s.todayResults = []; 108 | s.today = t; 109 | } 110 | 111 | export function distanceScore(x: number) { 112 | // Reasoning: 113 | // 1. Small errors should not decrease the score a lot. 114 | // 2. Big errors should decrease the score almost to 0. In game it's 115 | // a binary value that suddenly drops drops "hit" to "no hit" but 116 | // that would not be useful for training. 117 | // Graph: https://www.desmos.com/calculator/j7vjbzvuly. 118 | return Math.exp(-.0004 * Math.pow(x, 2)); 119 | } 120 | 121 | export function statsForSetup(c: TrialSetup): TrialStats | undefined { 122 | return stats.find(x => { 123 | try { 124 | return x.setup.weapon == c.weapon && 125 | x.setup.mag == c.mag && 126 | x.setup.hint == c.hint && 127 | x.setup.moving == c.moving; 128 | } catch { 129 | return false; 130 | } 131 | }); 132 | } 133 | 134 | export function addStat(v: number, setup: TrialSetup): TrialStats { 135 | let s = statsForSetup(setup); 136 | const t = today(); 137 | if (s === undefined) { 138 | s = { 139 | v: statsDataVersion, 140 | setup, 141 | bestAllTime: 0, 142 | today: t, 143 | todayResults: [], 144 | dayResults: [], 145 | }; 146 | stats.push(s); 147 | } 148 | if (s === undefined) throw new Error('no stat'); 149 | touchStat(s); 150 | s.todayResults.push(v); 151 | s.bestAllTime = Math.max(s.bestAllTime, v); 152 | aStats.set(JSON.stringify(stats)); 153 | return s; 154 | } 155 | -------------------------------------------------------------------------------- /client/storage.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright 2021 Goncharov Mikhail 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | let attrUpdatesActive = true; 18 | let allAttributes: Attribute[] = []; 19 | 20 | export function pokeAttrs() { 21 | allAttributes.forEach(a => a.poke()); 22 | } 23 | 24 | export function suspendAttrUpdates() { 25 | attrUpdatesActive = false; 26 | } 27 | 28 | export function resumeAttrUpdates() { 29 | allAttributes.forEach(a => { 30 | if (a.dirty) { 31 | a.dirty = false; 32 | a.poke(); 33 | } 34 | }); 35 | attrUpdatesActive = true; 36 | } 37 | 38 | export function initAttributes(ns: string) { 39 | allAttributes.filter(a => a.namespace == ns).forEach(a => a.init()); 40 | } 41 | 42 | export function watch(attrs: Attribute[], fn: () => void) { 43 | attrs.forEach(a => a.watchRaw(fn)); 44 | } 45 | 46 | type watcher = (v: string) => void; 47 | abstract class Attribute { 48 | name: string; 49 | namespace: string; 50 | def: string; 51 | value: string = ''; 52 | fullName: string; 53 | rawWatchers: watcher[] = []; 54 | dirty: boolean = false; 55 | constructor(name: string, namespace: string, def: string) { 56 | this.name = name; 57 | this.namespace = namespace; 58 | this.fullName = namespace + ':' + name; 59 | this.def = def; 60 | allAttributes.push(this); 61 | } 62 | init() { 63 | let v = localStorage.getItem(this.fullName); 64 | if (v == null) { 65 | localStorage.setItem(this.fullName, this.def); 66 | v = this.def; 67 | } 68 | this.value = v; 69 | this.initInput(); 70 | } 71 | poke() { 72 | // console.log('poke', this.fullName, this.value, this.rawWatchers.length); 73 | this.rawWatchers.forEach(f => f(this.value)); 74 | } 75 | getRaw(): string { 76 | return this.value; 77 | } 78 | setRaw(v: string) { 79 | if (v == this.value) return; 80 | this.value = v; 81 | localStorage.setItem(this.fullName, v); 82 | if (attrUpdatesActive) { 83 | this.poke(); 84 | } else { 85 | this.dirty = true; 86 | } 87 | } 88 | watchRaw(fn: watcher) { 89 | this.rawWatchers.push(fn); 90 | } 91 | initInput() { 92 | const a = document.getElementById(this.name) as HTMLInputElement; 93 | if (a == null) return; 94 | a.value = this.getRaw(); 95 | if (a.type == 'text' || a.type == 'textarea' || a.type == 'range') { 96 | a.onkeyup = a.onchange = () => { 97 | this.setRaw(a.value); 98 | }; 99 | this.watchRaw((v: string) => { 100 | a.value = v; 101 | }); 102 | return; 103 | } 104 | if (a.type == 'checkbox') { 105 | a.onchange = () => { 106 | this.setRaw(a.checked + ''); 107 | }; 108 | this.watchRaw((v: string) => { 109 | a.checked = v == 'true'; 110 | }); 111 | return; 112 | } 113 | console.error('unknown input type', this.name, a.type); 114 | } 115 | } 116 | 117 | export class StringAttribute extends Attribute { 118 | get(): string { 119 | return this.getRaw(); 120 | } 121 | set(v: string) { 122 | this.setRaw(v); 123 | } 124 | watch(f: watcher) { 125 | this.watchRaw(f); 126 | } 127 | } 128 | 129 | type booleanWatcher = (v: boolean) => void; 130 | export class BooleanAttribute extends Attribute { 131 | watchers: booleanWatcher[] = []; 132 | constructor(name: string, namespace: string, def: boolean) { 133 | super(name, namespace, def.toString()); 134 | } 135 | get(): boolean { 136 | return this.getRaw() == 'true'; 137 | } 138 | set(value: boolean) { 139 | this.setRaw(value.toString()); 140 | } 141 | watch(f: (a: boolean) => void) { 142 | this.watchers.push(f); 143 | } 144 | poke() { 145 | super.poke(); 146 | const v = this.get(); 147 | this.watchers.forEach(f => f(v)); 148 | } 149 | } 150 | 151 | type numericWatcher = (v: number) => void; 152 | export class NumericAttribute extends Attribute { 153 | watchers: numericWatcher[] = []; 154 | constructor(name: string, namespace: string, def: number) { 155 | super(name, namespace, def.toString()); 156 | } 157 | init() { 158 | super.init(); 159 | const a = document.getElementById(this.name) as HTMLInputElement; 160 | if (a == null) return; 161 | a.addEventListener('keydown', (e) => { 162 | if (e.key == 'ArrowDown') { 163 | this.set(this.get()-1); 164 | } 165 | if (e.key == 'ArrowUp') { 166 | this.set(this.get()+1); 167 | } 168 | }); 169 | } 170 | get(): number { 171 | return Number(this.getRaw()); 172 | } 173 | set(value: number) { 174 | this.setRaw(value.toString()); 175 | } 176 | watch(f: (a: number) => void) { 177 | this.watchers.push(f); 178 | } 179 | poke() { 180 | super.poke(); 181 | const v = this.get(); 182 | this.watchers.forEach(f => f(v)); 183 | } 184 | } -------------------------------------------------------------------------------- /client/utils.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright 2021 Mikhail Goncharov 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | interface typeMap { // for mapping from strings to types 18 | string: string; 19 | number: number; 20 | boolean: boolean; 21 | } 22 | 23 | type PrimitiveOrConstructor = // 'string' | 'number' | 'boolean' | constructor 24 | | { new(...args: any[]): any } 25 | | keyof typeMap; 26 | 27 | // infer the guarded type from a specific case of PrimitiveOrConstructor 28 | type GuardedType = T extends { new(...args: any[]): infer U; } ? U : T extends keyof typeMap ? typeMap[T] : never; 29 | 30 | export function checkT(o: any, className: T): o is GuardedType { 31 | const localPrimitiveOrConstructor: PrimitiveOrConstructor = className; 32 | if (typeof localPrimitiveOrConstructor === 'string') { 33 | return typeof o === localPrimitiveOrConstructor; 34 | } 35 | return o instanceof localPrimitiveOrConstructor; 36 | } 37 | 38 | export function error(...args: any): Error { 39 | onError(...args); 40 | return new Error('error ocurred'); 41 | } 42 | 43 | export function onError(...args: any) { 44 | console.error(...args); 45 | const c = document.getElementById("error-bar"); 46 | if (c) { 47 | c.classList.remove('hidden'); 48 | c.innerText = 'Error ocurred. See console for the details'; 49 | } 50 | } 51 | 52 | export function assert(c: boolean, ...args: any) { 53 | if (c) return; 54 | console.error('assertion failed', ...args); 55 | throw new Error('assertion failed'); 56 | } 57 | 58 | export function clearError() { 59 | const c = document.getElementById("error-bar"); 60 | if (!c) return; 61 | c.classList.add('hidden'); 62 | } 63 | 64 | export function copy(v: T): T { 65 | return JSON.parse(JSON.stringify(v)); 66 | } 67 | 68 | // Returns current date as a number. E.g. 2015-04-28 => 20150428. 69 | export function today(): number { 70 | return dateToNumber(new Date()); 71 | } 72 | 73 | export function dateToNumber(d: Date) { 74 | return (d.getFullYear() * 100 + d.getMonth() + 1) * 100 + d.getDate(); 75 | } 76 | 77 | export function zeroPad(num: number, places: number) { 78 | return String(num).padStart(places, '0'); 79 | } 80 | 81 | export function numberToDate(n: number): string { 82 | const m = Math.floor(n / 100); 83 | const y = Math.floor(m / 100); 84 | return `${y}-${zeroPad(m % 100, 2)}-${zeroPad(n % 100, 2)}`; 85 | } 86 | 87 | export function clamp(x: number, from: number, to: number) { 88 | if (!Number.isFinite(x)) return from; 89 | return Math.max(from, Math.min(to, x)); 90 | } -------------------------------------------------------------------------------- /docs/capture.md: -------------------------------------------------------------------------------- 1 | # How to capture recoils 2 | 1. (one time) install [python 3](https://www.python.org/downloads/), [pipenv](https://pipenv.pypa.io/en/latest/). Run `pipenv install` in *./processing* dir. 3 | You will also need to record in-game footage - NVIDIA overlay or [OBS](https://obsproject.com/) worked fine for me. 4 | 5 | Update Apex Legends starup options to include `+cl_showpos 1` . 6 | 7 | 2. Go to fire range and take a weapon with maximum mag and no other attachments and a sniper rifle with x4-8. Start recoding, fire the whole magazine then point to the most distant points through sniper scope, capture the whole pattern too. I have used [avidemux player](https://avidemux.sourceforge.net/) to navigate between frames. Here is an example recording: 8 | [![sample capture](./res/yt_capture.png)](https://www.youtube.com/watch?v=f52L6WkNIS0) 9 | 10 | It's important not to move mouse while shooting. One can either lift a mouse from a pad or map mouse buttons to keyboard if possible. 11 | 12 | Save pattern image and crop it: 13 | 14 | 15 | 16 | 3. Open ./processing/recoils.ipynb jupyter notebook and enter angle coordinates of two distant points into `np.round(points(...), 2)` cell. That will give you a distance in pixels between points. 17 | Open https://apexlegendsrecoils.net/editor, load an image of the pattern, enter name of the weapon (see ./client/specs.json for possible values). Use left mouse click to add and move individual points, right button to remove them and middle button to mark "anchors". There should be exactly two anchors at marks that we just measured. "auto targets" might also be useful as it converts detected areas to marks - play with settings to understand how it works. Then select starting mark and hover over points to create a path. Normally y-coordinate in the result should be negative as it offsetts gun upward movement. 18 | 19 | Copy the resulting json string back to jupyter notebook `rc = []` . Running next cell will produce arrays for X and Y coordinates that now can be put into ./client/specs.json. This coordinates correspond to mouse positons for sensitivity 1. 20 | 21 | [![sample capture](./res/yt_convert.png)](https://www.youtube.com/watch?v=tvXYcHC7TbU) 22 | 23 | As there is some randomness of the pattern - repeat 2-4 steps a few times - there is a "error estimation" cell that might help to understand if results have converged enough. 24 | -------------------------------------------------------------------------------- /docs/code-of-conduct.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | In the interest of fostering an open and welcoming environment, we as 6 | contributors and maintainers pledge to make participation in our project and 7 | our community a harassment-free experience for everyone, regardless of age, body 8 | size, disability, ethnicity, sex characteristics, gender identity and expression, 9 | level of experience, education, socio-economic status, nationality, personal 10 | appearance, race, religion, or sexual identity and orientation. 11 | 12 | ## Our Standards 13 | 14 | Examples of behavior that contributes to creating a positive environment 15 | include: 16 | 17 | * Using welcoming and inclusive language 18 | * Being respectful of differing viewpoints and experiences 19 | * Gracefully accepting constructive criticism 20 | * Focusing on what is best for the community 21 | * Showing empathy towards other community members 22 | 23 | Examples of unacceptable behavior by participants include: 24 | 25 | * The use of sexualized language or imagery and unwelcome sexual attention or 26 | advances 27 | * Trolling, insulting/derogatory comments, and personal or political attacks 28 | * Public or private harassment 29 | * Publishing others' private information, such as a physical or electronic 30 | address, without explicit permission 31 | * Other conduct which could reasonably be considered inappropriate in a 32 | professional setting 33 | 34 | ## Our Responsibilities 35 | 36 | Project maintainers are responsible for clarifying the standards of acceptable 37 | behavior and are expected to take appropriate and fair corrective action in 38 | response to any instances of unacceptable behavior. 39 | 40 | Project maintainers have the right and responsibility to remove, edit, or 41 | reject comments, commits, code, wiki edits, issues, and other contributions 42 | that are not aligned to this Code of Conduct, or to ban temporarily or 43 | permanently any contributor for other behaviors that they deem inappropriate, 44 | threatening, offensive, or harmful. 45 | 46 | ## Scope 47 | 48 | This Code of Conduct applies within all project spaces, and it also applies when 49 | an individual is representing the project or its community in public spaces. 50 | Examples of representing a project or community include using an official 51 | project e-mail address, posting via an official social media account, or acting 52 | as an appointed representative at an online or offline event. Representation of 53 | a project may be further defined and clarified by project maintainers. 54 | 55 | ## Enforcement 56 | 57 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 58 | reported by contacting [me](mailto:goncharov.mikhail+github@gmail.com). All 59 | complaints will be reviewed and investigated and will result in a response that 60 | is deemed necessary and appropriate to the circumstances. The project team is 61 | obligated to maintain confidentiality with regard to the reporter of an incident. 62 | Further details of specific enforcement policies may be posted separately. 63 | 64 | Project maintainers who do not follow or enforce the Code of Conduct in good 65 | faith may face temporary or permanent repercussions as determined by other 66 | members of the project's leadership. 67 | 68 | ## Attribution 69 | 70 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, 71 | available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html 72 | 73 | [homepage]: https://www.contributor-covenant.org 74 | 75 | For answers to common questions about this code of conduct, see 76 | https://www.contributor-covenant.org/faq 77 | -------------------------------------------------------------------------------- /docs/contributing.md: -------------------------------------------------------------------------------- 1 | # How to Contribute 2 | 3 | We'd love to accept your patches and contributions to this project. There are just a few small guidelines you need to follow. 4 | 5 | ## Contributor License Agreement 6 | 7 | Contributions to this project must be accompanied by a Contributor License Agreement. You (or your employer) retain the copyright to your contribution; 8 | this simply gives us permission to use and redistribute your contributions as part of the project. Head over to [cla assistant](https://cla-assistant.io/metaflow/apex-recoil) to see your current agreements on file or to sign a new one. 9 | 10 | You generally only need to submit a CLA once, so if you've already submitted one (even if it was for a different project), you probably don't need to do it again. 11 | 12 | ## Code Reviews 13 | 14 | All submissions, including submissions by project members, require review. We use GitHub pull requests for this purpose. Consult [GitHub Help](https://help.github.com/articles/about-pull-requests/) for more information on using pull requests. -------------------------------------------------------------------------------- /docs/faq.md: -------------------------------------------------------------------------------- 1 | # Frequently asked questions 2 | 3 | ## Mouse sensitivity 4 | 5 | It's assumed that your Windows sensitivity is 6/11 (x1.0) and the "Enhance pointer precision" is off so every mouse count equals 1 pixel on the screen. 6 | 7 | If you see a warning that "Active area is too small!" then it means that either browser's window is too small (resize it!) or in-game sensitivity is very low and recoil pattern will not fit the screen. In this case you should lower your mouse sensitivity for the app: 8 | 9 | - most of mouse control software supports multiple CPI settings. Switch to a lower value e.g. from 2000 to 1000 CPI. 10 | 11 | - use this [script](https://gist.github.com/metaflow/dd0b38a66b74dad27d6af04358fbae40) for [autohotkey](https://www.autohotkey.com/) to switch between normal and 1/2 sensitivity. 12 | 13 | after you've reduced you mouse speed you can then multiply web app sensitivity by the same value (e.g. x0.5 mouse speed -> x2 sensitivity). 14 | 15 | ## How accurate are the patterns? 16 | 17 | I've tested every pattern by replaying it in-game with a few different scopes and game options (like FOV and mouse sensitivity). That was done with a hardware mouse simulator (Arduino board). 18 | 19 | 20 | 21 | ## Controller support 22 | 23 | You can try to use Steam controller support `Settings > Controller > Desktop Configuration`. 24 | 25 | According to my experiments, these mouse sensitivity values should be close to in-game: 26 | 27 | | Apex Legends | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 28 | |------------------|-------|-------|-------|-------|-------|------|-------|------| 29 | | Steam controller | 0.123 | 0.198 | 0.388 | 0.594 | 0.939 | 1.12 | 1.222 | 1.24 | 30 | 31 | Pick the response curve, [this post might help](https://www.reddit.com/r/apexlegends/comments/bpkzn4/advanced_look_controls_response_curve_guide/). 32 | 33 | Steam does not disable mouse movement for non-steam games, your controls might be funky. 34 | 35 | *Disclaimer*: I play on the keyboard and mouse and have not tested with a controller. Sensitivity numbers above were computed with [xbox controller emulator](https://github.com/dmadison/ArduinoXInput) and having a linear response pattern. Trying to emulate the recoil movement of a gamepad seems to be non-trivial. 36 | 37 | ## How scoring works 38 | 39 | Scores are counted separately for different settings (mag, weapon, enabled hints). 40 | 41 | [Scoring formula](https://www.desmos.com/calculator/j7vjbzvuly) (x = distance to the "ideal" point normalized to the mouse sensitivity). 42 | 43 | The reasoning for the shape and constants selection: 44 | 1. Small errors should not decrease the score a lot. 45 | 2. Increasing the error value should gradually decrease the score to almost 0 at a distance of 100px (approximate body size from 20m). In-game "score" a binary value that suddenly drops drops "hit" to "no-hit" but that would not be useful for training. 46 | 47 | ## No registration? 48 | 49 | As you probably noticed there is no registration and email confirmation. 50 | Settings and scores are stored locally in your browser. So they might be lost browser or system update. 51 | 52 | ## FPS 53 | 54 | Normally you should see FPS values around 60: that's the default browser cap on animations. From time to time browser can also decide that 30 FPS is all you need - restarting usually helps. 55 | 56 | ## I have an issue/idea! 57 | 58 | If something is broken or you have an improvement idea, please [create an issue](https://github.com/metaflow/apex-recoil/issues/new). -------------------------------------------------------------------------------- /docs/notes.md: -------------------------------------------------------------------------------- 1 | # Notes (for myself) 2 | 3 | Letsencrypt is set via https://certbot.eff.org . -------------------------------------------------------------------------------- /docs/playbooks.md: -------------------------------------------------------------------------------- 1 | # Deploy a code 2 | 3 | 1. `npm run static` 4 | 5 | 2. scp -r -i .\static\* root@46.101.102.179:/var/www/html 6 | 7 | # Update domains 8 | 9 | 1. edit /etc/nginx/sites-enabled/default 10 | add section 11 | 12 | ``` 13 | server { 14 | root /var/www/html; 15 | index index.html index.htm index.nginx-debian.html; 16 | server_name apexlegendsrecoils.net; 17 | gzip on; 18 | gzip_types text/plain application/xml application/javascript text/css audio/mpeg image/png; 19 | 20 | location / { 21 | # First attempt to serve request as file, then 22 | # as directory, then fall back to displaying a 404. 23 | try_files $uri $uri/ =404; 24 | } 25 | location ~ ^/ru/?$ { 26 | rewrite ^/ru/?(.*)$ /$1 break; 27 | index index-ru.html; 28 | try_files $uri $uri/ =404; 29 | } 30 | location ~ ^/zh-CN/?$ { 31 | rewrite ^/zh-CN/?(.*)$ /$1 break; 32 | index index-zh-CN.html; 33 | try_files $uri $uri/ =404; 34 | } 35 | listen 80; 36 | } 37 | ``` 38 | 39 | 2. run `nginx -t` to test and `systemctl restart nginx` 40 | 41 | 3. check that http://apexlegendsrecoils.net/ is available 42 | 43 | 4. run `certbot --nginx` and select new domain -------------------------------------------------------------------------------- /docs/release-notes.md: -------------------------------------------------------------------------------- 1 | # v240915 2 | 3 | - Added splash screen about current state of the project; 4 | 5 | - Updated recoils of Flatline and R99. 6 | 7 | # v240907 8 | 9 | First update since 2021! 10 | 11 | - Added donation button for supporters; 12 | 13 | - R301 recoils are updated (many others are still out of date!); 14 | 15 | - using a YYMMDD as a version number now; 16 | 17 | # v19 18 | 19 | - C.A.R. recoils; 20 | 21 | - updated crosshair to be easily distinguishable from hit markers; 22 | 23 | - added scale: it's useful if your sensitivity is too high and pattern is very small. You can also set is proportional to 4:3 (e.g. 1.3 x 1). 24 | 25 | # v18 26 | 27 | Now shooting is interrupted when you release the mouse button. Score is computed for the bullets already shot and not recorded. 28 | 29 | # v17 30 | 31 | Simplified Chinese translation. Thank you, @SkywalkerJi! 32 | 33 | # v16 34 | 35 | Updates to L-STAR mag size after [evolution collection event](https://www.ea.com/en-gb/games/apex-legends/news/evolution-collection-event). 36 | 37 | # v15 38 | 39 | Recoils and weapons updates for the Season 10. 40 | 41 | - Prowler is removed as it only has burst mode. 42 | 43 | - Added mag levels for L-Star. 44 | 45 | - Added special fixed mag for drop weapons (Spitfire and Alternator). 46 | 47 | - Added Rampage and ad toggle for it's "Revved Up" mod. 48 | 49 | # v14 50 | 51 | - "Invert Y" setting. 52 | 53 | # v13 54 | 55 | - Russian locale. 56 | 57 | - Fix: tooltips not being fully visible. 58 | 59 | # v12 small updates 60 | 61 | - Fixed a bug when moving target disappeared after switching back to the app from other tab. 62 | 63 | - Added a note and AHK script on how to lower window sens if in-game sensitivity is very low. 64 | 65 | - Added scrolling to the control panel if windows height is too small. 66 | 67 | # v11 Moving target and UI 68 | 69 | - Added "moving target" mode, stats are tracked separately for it. Speed is not taken in account as there are many variables to consider beside that. 70 | 71 | - Updated UI controls to make mode selection easier. 72 | 73 | - Added hints to many controls. 74 | 75 | # v10 Firing area and spitfire mag size 76 | 77 | - Added a dotted region that shows a good starting position for a spray. If region is too small user will see a warning. 78 | 79 | - Updated mag size and audio for Spitfire with a purple mag. 80 | 81 | - Now versions are just sequential numbers as I realized that the game is useful already and it's not clear what should be "v1.0". 82 | 83 | # v0.9 Reworked simulation 84 | 85 | - Added a new "stationary target" option. If unchecked then crosshair will be pinned to the initial position, the target and hit markers will move. That experience should feel closer to the game. Thank you [u/Fartikus](https://www.reddit.com/user/Fartikus) for the suggestion! 86 | 87 | - Removed the "show pacer" option as "target" fulfills its purpose naturally. Statistic records with "hints" on and "pacer" off are dropped. 88 | 89 | # v0.8 L-STAR patterns 90 | 91 | - added L-STAR patterns. That completes the list! 92 | 93 | # v0.7 scores graph 94 | 95 | - Graph of best / median scores by day. 96 | 97 | - Minor layout fixes. 98 | 99 | # v0.6 updated spitfire and havoc patterns 100 | 101 | - Updated spitfire and havoc patterns after the season 9 patch has landed. Difference in mean recoils is quite small. See https://www.reddit.com/r/apexlegends/comments/n50ps9/oc_changes_in_spitfire_and_havoc_recoils_in/. 102 | 103 | # v0.5 all weapons 104 | 105 | - All weapons are here! Havoc and Devotion have a Turbocharger. It does not affect their recoils, only makes them brrr faster. 106 | 107 | - Rearranged weapons to match in-game order (AR, SMG, LMG, Pistols). 108 | 109 | - Small style and performance improvements. 110 | 111 | # v0.4 stats updates 112 | 113 | - Fixed few issues with statistics storage. 114 | 115 | - Added counter of "today tries" to the interface. 116 | 117 | - Added Alternator (not verified in-game yet but should be very close). 118 | 119 | # v0.3 slow-mode 120 | 121 | - Added a "slow-mode": o. Statistics are not recorded for "slow-mode". 122 | 123 | - Minor visual improvements and simple page for devices with width less than 900px. 124 | 125 | # v0.2 Accurate pattern scale, scoring, performance, and more 126 | 127 | [v.01 announce on reddit](https://www.reddit.com/r/apexlegends/comments/mosk0l/i_have_created_an_app_to_practice_recoils) got some attention to the app and users pointed out multiple improvement points. 128 | 129 | - Improved the method to collect recoil patterns found that previous patterns were bigger by around 15%. I have also found, by trying to accurately compensate with different scopes and FOV from 70 to 110, that recoil is absolute and does not scale with ADS or FOV. So there is not need to introduce ADS and FOV settings. Confirmed that new patterns are *identical with the game*. 130 | 131 | - Reworked scoring [old formula](https://www.desmos.com/calculator/ptb2ipcscr), [new formula](https://www.desmos.com/calculator/j7vjbzvuly). Now they are more forgiving for small errors. 132 | 133 | - Removed attachments level selection. The reason is twofold: 1) It's generally recommended to practice with no attachments. 2) The difference between trails is mostly in vertical scale, not form ([r99 diff](./res/r99_diff.png), [flatline diff](./res/faltline_diff.png)). In-game better attachments decrease randomness; training patterns are averages so randomness is removed. Keeping that in mind, the effort to record and support different types of attachments seems redundant. Typically it takes me around 1h to collect and process ~10 trails for one weapon config. Oh yes, it also means that **new weapon types will be added soon**er than I initially planned! 134 | 135 | - Improved performance and added FPS display. 136 | 137 | - Removed the "Real trace" option that was used to pick the "raw" pattern. Mean one is much more useful for training. 138 | 139 | - Added a custom "red dot" cursor. Disabled right mouse click on the area. 140 | 141 | - Added weapon titles. 142 | 143 | - Added FAQ page, including controller settings. 144 | 145 | # v0.1 Initial version 146 | 147 | First version with r99, r301, Flatline, and Volt x 4 possible attachment levels. -------------------------------------------------------------------------------- /docs/res/cut.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/docs/res/cut.png -------------------------------------------------------------------------------- /docs/res/flatline_diff.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/docs/res/flatline_diff.png -------------------------------------------------------------------------------- /docs/res/r99_diff.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/docs/res/r99_diff.png -------------------------------------------------------------------------------- /docs/res/yt_capture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/docs/res/yt_capture.png -------------------------------------------------------------------------------- /docs/res/yt_convert.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/docs/res/yt_convert.png -------------------------------------------------------------------------------- /etc/GitHub-Mark-Light-32px.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/etc/GitHub-Mark-Light-32px.png -------------------------------------------------------------------------------- /etc/en.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/etc/en.png -------------------------------------------------------------------------------- /etc/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/etc/favicon-16x16.png -------------------------------------------------------------------------------- /etc/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/etc/favicon-32x32.png -------------------------------------------------------------------------------- /etc/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/etc/favicon.ico -------------------------------------------------------------------------------- /etc/outline_insert_chart_white_48dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/etc/outline_insert_chart_white_48dp.png -------------------------------------------------------------------------------- /etc/outline_run_circle_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/etc/outline_run_circle_white_24dp.png -------------------------------------------------------------------------------- /etc/outline_slow_motion_video_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/etc/outline_slow_motion_video_white_24dp.png -------------------------------------------------------------------------------- /etc/plot.js: -------------------------------------------------------------------------------- 1 | function updateGraph(x, median, best, count, i18n) { 2 | const data = [{ 3 | x: x, 4 | y: median.map(v => 101 - v), 5 | text: median, 6 | name: i18n.median, 7 | hovertemplate: '%{text}', 8 | mode: 'lines', 9 | }, { 10 | x: x, 11 | y: best.map(v => 101 - v), 12 | name: i18n.best, 13 | text: best, 14 | hovertemplate: '%{text}', 15 | mode: 'lines', 16 | }, 17 | { 18 | x: x, 19 | y: count, 20 | name: i18n.tries, 21 | yaxis: 'y2', 22 | type: 'scatter', 23 | mode: 'markers', 24 | }, 25 | ]; 26 | const yticks = [1, 2, 3, 5, 7, 9, 11, 21, 31, 41, 61, 81, 101]; 27 | const layout = { 28 | margin: { t: 30, l: 60, r: 60, b: 80 }, 29 | paper_bgcolor: '#171717', 30 | plot_bgcolor: '#171717', 31 | legend: { 32 | orientation: 'h', 33 | y: -0.2, 34 | }, 35 | xaxis: { 36 | color: '#F9F9F9', 37 | showgrid: false, 38 | showline: false, 39 | zeroline: false, 40 | type: 'date', 41 | // tickangle: -90, 42 | }, 43 | yaxis: { 44 | title: i18n.score, 45 | color: '#F9F9F9', 46 | showgrid: false, 47 | range: [2.1, 0], 48 | zeroline: false, 49 | type: 'log', 50 | tickmode: "array", // If "array", the placement of the ticks is set via `tickvals` and the tick text is `ticktext`. 51 | tickvals: yticks, 52 | ticktext: yticks.map(v => 101 - v), 53 | }, 54 | yaxis2: { 55 | color: '#F9F9F9', 56 | overlaying: 'y', 57 | side: 'right', 58 | title: i18n.tries, 59 | rangemode: 'tozero', 60 | zeroline: false, 61 | } 62 | }; 63 | const config = { responsive: true }; 64 | Plotly.newPlot('plotly_area', data, layout, config); 65 | } -------------------------------------------------------------------------------- /etc/red_dot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/etc/red_dot.png -------------------------------------------------------------------------------- /etc/reddit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/etc/reddit.png -------------------------------------------------------------------------------- /etc/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Allow: / -------------------------------------------------------------------------------- /etc/ru.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/etc/ru.png -------------------------------------------------------------------------------- /etc/tarteaucitron/.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: AmauriC 4 | -------------------------------------------------------------------------------- /etc/tarteaucitron/.github/stale.yml: -------------------------------------------------------------------------------- 1 | # Number of days of inactivity before an issue becomes stale 2 | daysUntilStale: 20 3 | # Number of days of inactivity before a stale issue is closed 4 | daysUntilClose: 5 5 | # Issues with these labels will never be considered stale 6 | exemptLabels: 7 | - pinned 8 | - security 9 | - active 10 | # Label to use when marking an issue as stale 11 | staleLabel: inactive 12 | # Comment to post when marking an issue as stale. Set to `false` to disable 13 | markComment: > 14 | This issue has been automatically marked as stale because it has not had 15 | recent activity. It will be closed if no further activity occurs. Thank you 16 | for your contributions. 17 | # Comment to post when closing a stale issue. Set to `false` to disable 18 | closeComment: false -------------------------------------------------------------------------------- /etc/tarteaucitron/.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | .DS_Store 3 | -------------------------------------------------------------------------------- /etc/tarteaucitron/LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2014 AmauriC 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /etc/tarteaucitron/README.md: -------------------------------------------------------------------------------- 1 | [![](https://data.jsdelivr.com/v1/package/gh/AmauriC/tarteaucitron.js/badge)](https://www.jsdelivr.com/package/gh/AmauriC/tarteaucitron.js) 2 | [![npm](https://img.shields.io/npm/v/tarteaucitronjs.svg)](https://www.npmjs.com/package/tarteaucitronjs) [![GitHub contributors](https://img.shields.io/github/contributors/AmauriC/tarteaucitron.js.svg)](https://github.com/AmauriC/tarteaucitron.js/graphs/contributors) [![Sponsor](https://img.shields.io/static/v1?label=Sponsor&message=%E2%9D%A4&logo=GitHub)](https://github.com/sponsors/AmauriC) 3 | 4 | tarteaucitron.js 5 | ================ 6 | Comply to the european cookie law is simple with the french *tarte au citron*. 7 | 8 | # What is this script? 9 | The european cookie law regulates the management of cookies and you should ask your visitors their consent before exposing them to third party services. 10 | 11 | Clearly this script will: 12 | - Disable all services by default, 13 | - Display a banner on the first page view and a small one on other pages, 14 | - Display a panel to allow or deny each services one by one, 15 | - Activate services on the second page view if not denied, 16 | - Store the consent in a cookie for 365 days. 17 | 18 | Bonus: 19 | - Load service when user click on Allow (without reload of the page), 20 | - Incorporate a fallback system (display a link instead of social button and a static banner instead of advertising). 21 | 22 | 23 | # Installation guide 24 | [Visit tarteaucitron.io](https://tarteaucitron.io/) 25 | 26 | 27 | # How to use 28 | 29 | ```html 30 | 31 | 32 | 69 | ``` 70 | 71 | # Create custom service 72 | ```js 73 | tarteaucitron.services.mycustomservice = { 74 | "key": "mycustomservice", 75 | "type": "ads|analytic|api|comment|other|social|support|video", 76 | "name": "MyCustomService", 77 | "needConsent": true, 78 | "cookies": ['cookie', 'cookie2'], 79 | "readmoreLink": "/custom_read_more", // If you want to change readmore link 80 | "js": function () { 81 | "use strict"; 82 | // When user allow cookie 83 | }, 84 | "fallback": function () { 85 | "use strict"; 86 | // when use deny cookie 87 | } 88 | }; 89 | ``` 90 | 91 | ## Thanks to the sponsors 😊 92 | 93 | | Be the first sponsor! | 94 | |:---:| 95 | -------------------------------------------------------------------------------- /etc/tarteaucitron/advertising.js: -------------------------------------------------------------------------------- 1 | tarteaucitronNoAdBlocker = true; -------------------------------------------------------------------------------- /etc/tarteaucitron/lang/tarteaucitron.bg.js: -------------------------------------------------------------------------------- 1 | /*global tarteaucitron */ 2 | tarteaucitron.lang = { 3 | "middleBarHead": "☝ 🍪", 4 | "adblock": "Здравей! Този сайт позволяа включването на бисквитки по избор.", 5 | "adblock_call": "Моля изключете вашият adblocker и изберете бисквитките които искате, или спрете всички.", 6 | "reload": "Презареди", 7 | 8 | "alertBigScroll": "Ако продължавате да скролвате,", 9 | "alertBigClick": "Ако продължавате да използвате този сайт,", 10 | "alertBig": "вив се съгласявате с всички бисквитки от трети лица.", 11 | 12 | "alertBigPrivacy": "Този сайт използва бисквитки и Ви дава право да изберете записването на определени или всички.", 13 | "alertSmall": "Управление на услуги", 14 | "personalize": "Ще избирам", 15 | "acceptAll": "ОК, приемам всички", 16 | "close": "Затвори", 17 | 18 | "privacyUrl": "Политика за поверителност", 19 | 20 | "all": "Услуги които записват бисквитки на този сайт", 21 | 22 | "info": "Зашитава вашата сигурност", 23 | "disclaimer": "Позволяването на тези бисквитки от трети лица, Вие приемате те да записват и използват услуги за проследяване нужни за правилното им функциониране.", 24 | "allow": "Разшреши", 25 | "deny": "Забрани", 26 | "noCookie": "Тази услуга не записва бисквитки.", 27 | "useCookie": "Тази услуга може да запише", 28 | "useCookieCurrent": "Тази услуга е записала", 29 | "useNoCookie": "Тази услуга не е записала бисквитки.", 30 | "more": "Прочети повече", 31 | "source": "Официален сайт", 32 | "credit": "Управление на бисквитките от tarteaucitron.js", 33 | 34 | "toggleInfoBox": "Покажи/скрий информация за записването на бисквитки", 35 | "title": "Управление на бисквитките", 36 | "cookieDetail": "Информация за", 37 | "ourSite": "в нашият сайт", 38 | "newWindow": "(нов прозорец)", 39 | "allowAll": "Разреши всички", 40 | "denyAll": "Забрани всички", 41 | 42 | "icon": "Cookies", 43 | 44 | "fallback": "е изключен.", 45 | 46 | "ads": { 47 | "title": "Рекламодатели", 48 | "details": "Ad networks can generate revenue by selling advertising space on the site." 49 | }, 50 | "analytic": { 51 | "title": "Аналитични", 52 | "details": "The audience measurement services used to generate useful statistics attendance to improve the site." 53 | }, 54 | "social": { 55 | "title": "Социални", 56 | "details": "Social networks can improve the usability of the site and help to promote it via the shares." 57 | }, 58 | "video": { 59 | "title": "Видео платформи", 60 | "details": "Video sharing services help to add rich media on the site and increase its visibility." 61 | }, 62 | "comment": { 63 | "title": "Коментари", 64 | "details": "Comments managers facilitate the filing of comments and fight against spam." 65 | }, 66 | "support": { 67 | "title": "Поддръжка", 68 | "details": "Support services allow you to get in touch with the site team and help to improve it." 69 | }, 70 | "api": { 71 | "title": "Функционални", 72 | "details": "APIs are used to load scripts: geolocation, search engines, translations, ..." 73 | }, 74 | "other": { 75 | "title": "Други", 76 | "details": "Services to display web content." 77 | }, 78 | 79 | "mandatoryTitle": "Mandatory cookies", 80 | "mandatoryText": "This site uses cookies necessary for its proper functioning which cannot be deactivated." 81 | }; 82 | -------------------------------------------------------------------------------- /etc/tarteaucitron/lang/tarteaucitron.ca.js: -------------------------------------------------------------------------------- 1 | /*global tarteaucitron */ 2 | tarteaucitron.lang = { 3 | "middleBarHead": "☝ 🍪", 4 | "adblock": "Hola! Aquest lloc web és transparent i et dóna l'opció d'activar els serveis de tercers", 5 | "adblock_call": "Si us plau desactiva la teva AdBlocker per començar a personalitzar els serveis.", 6 | "reload": "Recarrega aquesta pàgina", 7 | 8 | "alertBigScroll": "Al continuar desplaçant,", 9 | "alertBigClick": "Si continues navegant en aquest lloc web,", 10 | "alertBig": "estàs permetent serveis tercers", 11 | 12 | "alertBigPrivacy": "Aquest lloc web fa servir galetes i et permet controlar les que vols activar", 13 | "alertSmall": "Gestionar serveis", 14 | "personalize": "Personalitzar", 15 | "acceptAll": "OK, acceptar totes", 16 | "close": "Tancar", 17 | 18 | "privacyUrl": "Política de privacitat", 19 | 20 | "all": "Ajustaments per a tots els serveis", 21 | 22 | "info": "Protegint la teva privacitat", 23 | "disclaimer": "Acceptant aquests serveis de tercers, estàs acceptant les seves galetes i l'ús de tecnologies de rastreig necessàries per al seu correcte funcionament.", 24 | "allow": "Permetre", 25 | "deny": "Denegar", 26 | "noCookie": "Aquest servei no fa servir galetes.", 27 | "useCookie": "Aquest servei pot instal·lar", 28 | "useCookieCurrent": "Aquest servei ha instal·lat", 29 | "useNoCookie": "Aquest servei no ha instal·lat cap galeta.", 30 | "more": "Llegir més", 31 | "source": "Veure lloc web oficial", 32 | "credit": "Gestor de galetes realitzat per tarteaucitron.js", 33 | 34 | "toggleInfoBox": "Mostra / oculta la informació sobre emmagatzematge de galetes", 35 | "title": "Panell de gestió de galetes", 36 | "cookieDetail": "Detalls de les galetes per a", 37 | "ourSite": "en la nostra web", 38 | "newWindow": "(finestra nova)", 39 | "allowAll": "Permet totes les galetes", 40 | "denyAll": "Denega totes les galetes", 41 | 42 | "icon": "Cookies", 43 | 44 | "fallback": "està deshabilitat.", 45 | 46 | "ads": { 47 | "title": "Xarxa de publicitat", 48 | "details": "Les xarxes publicitàries poden generar ingressos mitjançant la venda d'espais publicitaris en el lloc." 49 | }, 50 | "analytic": { 51 | "title": "Mesura d'audiència", 52 | "details": "Els serveis de mesurament d'audiència s'usen per generar estadístiques útils per millorar el lloc." 53 | }, 54 | "social": { 55 | "title": "Xarxes socials", 56 | "details": "Les xarxes socials poden augmentar la usabilitat del lloc web i ajudar a promoure-ho a través de la contribució." 57 | }, 58 | "video": { 59 | "title": "Videos", 60 | "details": "Els serveis per compartir vídeos ajuden a afegir contingut enriquit en el lloc web i augmentar la seva visibilitat." 61 | }, 62 | "comment": { 63 | "title": "Comentaris", 64 | "details": "El gestor de comentaris facilita la classificació de comentaris i lluitar contra robots de correu." 65 | }, 66 | "support": { 67 | "title": "Suport", 68 | "details": "Els serveis de suport et permeten contactar amb el lloc web i ajudar a millorar-lo" 69 | }, 70 | "api": { 71 | "title": "APIs", 72 | "details": "Les APIs s'utilitzen per carregar scripts: geolocalització, motor de cerca, traduccions, ..." 73 | }, 74 | "other": { 75 | "title": "Altres", 76 | "details": "Serveis per mostrar contingut web." 77 | }, 78 | 79 | "mandatoryTitle": "Galetes obligatòries", 80 | "mandatoryText": "Aquest lloc utilitza galetes necessàries per al seu correcte funcionament que no es poden desactivar (cookies tècniques)." 81 | }; 82 | -------------------------------------------------------------------------------- /etc/tarteaucitron/lang/tarteaucitron.cn.js: -------------------------------------------------------------------------------- 1 | /*global tarteaucitron */ 2 | tarteaucitron.lang = { 3 | "adblock": "您好!这是一个透明的网站,您可以选择激活不同的第三方服务。", 4 | "adblock_call": "感谢您停用广告拦截功能并开始个性化设置。", 5 | "reload": "重新加载页面", 6 | 7 | "alertBigScroll": "继续划屏,", 8 | "alertBigClick": "继续浏览,", 9 | "alertBig": "即表示您同意第三方服务安装cookie", 10 | 11 | "alertBigPrivacy": "这个网站使用cookie, 并让您可以控制想要激活的内容。", 12 | "alertSmall": "服务管理", 13 | "acceptAll": "好的,全部接受", 14 | "personalize": "个性化", 15 | "close": "关闭", 16 | 17 | "privacyUrl": "保密政策", 18 | 19 | "all": "所有服务的偏好设置", 20 | 21 | "disclaimer": "通过授权这些第三方服务,您同意存储和读取cookie,并使用其正常运行所需的跟踪技术。", 22 | "allow": "允许", 23 | "deny": "禁用", 24 | "noCookie": "此服务不存储任何cookie。", 25 | "useCookie": "此服务可以存储", 26 | "useCookieCurrent": "此服务已存储", 27 | "useNoCookie": "此服务未存储任何cookie。", 28 | "more": "了解更多", 29 | "source": "查看官网", 30 | "credit": "通过tarteaucitron.js管理cookie", 31 | 32 | "toggleInfoBox": "显示/隐藏cookie存储信息。", 33 | "title": "Cookie管理面板", 34 | "cookieDetail": "Cookie详情", 35 | "ourSite": "显示在我们的网站上", 36 | "newWindow": "(新建窗口)", 37 | "allowAll": "允许", 38 | "denyAll": "禁用", 39 | 40 | "icon": "Cookies", 41 | 42 | "fallback": "已禁用。", 43 | 44 | "ads": { 45 | "title": "广告组", 46 | "details": "广告组通过营销网站上的广告空间来产生收入." 47 | }, 48 | "analytic": { 49 | "title": "受众测量", 50 | "details": "受众测量服务可以生成对站点改进有用的访问统计数据。" 51 | }, 52 | "social": { 53 | "title": "社交网络", 54 | "details": "社交网络有助于提高网站的用户友好性,并通过分享帮助推广。" 55 | }, 56 | "video": { 57 | "title": "视频", 58 | "details": "视频共享服务丰富网站的多媒体内容,提高网站知名度。" 59 | }, 60 | "comment": { 61 | "title": "评论", 62 | "details": "评论管理器使您的评论更容易提交,并避免垃圾邮件。" 63 | }, 64 | "support": { 65 | "title": "支持", 66 | "details": "支持服务使您能够与网站团队联系并帮助改进网站." 67 | }, 68 | "api": { 69 | "title": "API", 70 | "details": "API允许加载脚本:地理位置、搜索引擎、翻译……" 71 | }, 72 | "other": { 73 | "title": "其他", 74 | "details": "旨在显示网页内容的服务。" 75 | }, 76 | 77 | "mandatoryTitle": "Mandatory cookies", 78 | "mandatoryText": "This site uses cookies necessary for its proper functioning which cannot be deactivated." 79 | }; 80 | -------------------------------------------------------------------------------- /etc/tarteaucitron/lang/tarteaucitron.cs.js: -------------------------------------------------------------------------------- 1 | /*global tarteaucitron */ 2 | tarteaucitron.lang = { 3 | "middleBarHead": "☝ 🍪", 4 | "adblock": "Ahoj! Tato stránka je transparetní a umožňuje ti si přímo vybrat, jaké služby třetích stran chceš povolit.", 5 | "adblock_call": "Pro úpravu osobních preferencí si, prosím, vypni adblock.", 6 | "reload": "Načíst stránku znovu", 7 | 8 | "alertBigScroll": "Pokračováním ve scrollování,", 9 | "alertBigClick": "Pokud pokračujete v brouzdání našich stránek,", 10 | "alertBig": "povolujete všechny služby třetích stran.", 11 | 12 | "alertBigPrivacy": "Tato stránka využívá cookies a dává ti na výběr, co chceš aktivovat", 13 | "alertSmall": "Spravovat služby", 14 | "personalize": "Přizpůsobit", 15 | "acceptAll": "OK, přijmout vše", 16 | "close": "Zavřít", 17 | 18 | "privacyUrl": "Zásady ochrany osobních údajů", 19 | 20 | "all": "Nastavení všech služeb", 21 | 22 | "info": "Chrání tvé soukromí", 23 | "disclaimer": "Povolením těchto služeb třetích stran, přijímáš jejich cookies, jež jsou nezbytné pro řádné fungování jejich technologií.", 24 | "allow": "Povolit", 25 | "deny": "Zamítnout", 26 | "noCookie": "Tato služba nepoužívá cookies.", 27 | "useCookie": "Tato služba může nainstalovat", 28 | "useCookieCurrent": "Tato služba nainstalovala", 29 | "useNoCookie": "Tato služba nenainstalovala žádné cookies.", 30 | "more": "Dozvědět se více", 31 | "source": "Zobrazit oficiální stránku", 32 | "credit": "Správce cookies od tarteaucitron.js", 33 | 34 | "toggleInfoBox": "Show/hide informations about cookie storage", 35 | "title": "Cookies management panel", 36 | "cookieDetail": "Cookie detail for", 37 | "ourSite": "on our site", 38 | "newWindow": "(new window)", 39 | "allowAll": "Allow all cookies", 40 | "denyAll": "Deny all cookies", 41 | 42 | "icon": "Cookies", 43 | 44 | "fallback": "je vypnutý.", 45 | 46 | "ads": { 47 | "title": "Reklamní síť", 48 | "details": "Prodejem reklamních ploch na této stránce mohou reklamní sítě vydělávat peníze." 49 | }, 50 | "analytic": { 51 | "title": "Statistika návštěvnosti", 52 | "details": "Služby pro analýzu návštěvníků slouží k vytvoření užitečných statistik návštěvnosti. Ty zase slouží ke zlepšení stránky." 53 | }, 54 | "social": { 55 | "title": "Sociální sítě", 56 | "details": "Sociální sítě mohou usnadnit práci se stránkou a pomáhají jí prosadit se pomocí sdílení." 57 | }, 58 | "video": { 59 | "title": "Videa", 60 | "details": "Video-hostingové služby pomáhají přidat na stránku bohaté mediální prvky." 61 | }, 62 | "comment": { 63 | "title": "Komentáře", 64 | "details": "Správce komentářů zajišťují vyplňování komentářů a bojují proti šíření spamu." 65 | }, 66 | "support": { 67 | "title": "Podpora", 68 | "details": "Služby podpory ti pomáhají spojit se s týmem stojícím za stránkou a umožňují ti vyjádřit se k jejím nedostatkům." 69 | }, 70 | "api": { 71 | "title": "API", 72 | "details": "API slouží k načtění skriptů: geolokace, vyhledávačů, překladů, ..." 73 | }, 74 | "other": { 75 | "title": "Jiný", 76 | "details": "Služby pro zobrazení webového obsahu." 77 | }, 78 | 79 | "mandatoryTitle": "Mandatory cookies", 80 | "mandatoryText": "This site uses cookies necessary for its proper functioning which cannot be deactivated." 81 | }; 82 | -------------------------------------------------------------------------------- /etc/tarteaucitron/lang/tarteaucitron.da.js: -------------------------------------------------------------------------------- 1 | /*global tarteaucitron */ 2 | tarteaucitron.lang = { 3 | "middleBarHead": "☝ 🍪", 4 | "adblock": "Hej! Dette sted er gennemsigtigt og giver dig mulighed for at vælge de tredjeparts tjenester, du vil tillade.", 5 | "adblock_call": "Deaktiver venligst din adblocker for at begynde tilpasningen.", 6 | "reload": "Opdater siden", 7 | 8 | "alertBigScroll": "Ved at fortsætte med at scrolle,", 9 | "alertBigClick": "Hvis du fortsætter med at bruge dette websted,", 10 | "alertBig": "tillader du alle tredjeparts tjenester", 11 | 12 | "alertBigPrivacy": "Dette websted bruger cookies og giver dig kontrol over, hvad du vil aktivere", 13 | "alertSmall": "Administrer tjenester", 14 | "personalize": "Tilpas", 15 | "acceptAll": "OK, accepter alle", 16 | "close": "Luk", 17 | 18 | "privacyUrl": "Fortrolighedspolitik", 19 | 20 | "all": "Præference for alle tjenester", 21 | 22 | "info": "Beskyttelse af dit privatliv", 23 | "disclaimer": "Ved at tillade disse tredjeparts tjenester accepterer du deres cookies og brugen af sporingsteknologier, der er nødvendige for, at de fungerer korrekt.", 24 | "allow": "Tillad", 25 | "deny": "Afvis ", 26 | "noCookie": "Denne service bruger ikke cookies", 27 | "useCookie": "Denne service kan installere", 28 | "useCookieCurrent": "Denne service er installeret", 29 | "useNoCookie": "Denne service har ikke installeret nogen cookie.", 30 | "more": "Læs mere", 31 | "source": "Se det officielle websted", 32 | "credit": "Cookies manager af tarteaucitron.js", 33 | "noServices": "Dette websted bruger ikke nogen cookie, der kræver dit samtykke.", 34 | 35 | "toggleInfoBox": "Vis / skjul informationer om opbevaring af cookies", 36 | "title": "CCookie-styringspanel", 37 | "cookieDetail": "Cookie detaljer for", 38 | "ourSite": "på vores side", 39 | "newWindow": "(nyt vindue)", 40 | "allowAll": "Tillad alle cookies", 41 | "denyAll": "Afvis alle cookies", 42 | 43 | "icon": "Cookies", 44 | 45 | "fallback": "er deaktiveret.", 46 | 47 | "ads": { 48 | "title": "Annonceringsnetværk", 49 | "details": "Annoncenetværk kan generere indtægter ved at sælge annonceplads på webstedet." 50 | }, 51 | "analytic": { 52 | "title": "Måling af målgruppen", 53 | "details": "Målingstjenesterne bruges til at generere nyttig statistisk til at forbedre webstedet." 54 | }, 55 | "social": { 56 | "title": "Sociale netværk", 57 | "details": "Sociale netværk kan forbedre anvendeligheden af webstedet og hjælpe med at markedsføre det via aktierne." 58 | }, 59 | "video": { 60 | "title": "Videoer", 61 | "details": "Videodelingstjenester hjælper med at tilføje rige medier på webstedet og øger dets synlighed." 62 | }, 63 | "comment": { 64 | "title": "Kommentarer", 65 | "details": "Kommentarledere letter arkiveringen af kommentarer og bekæmper spam." 66 | }, 67 | "support": { 68 | "title": "Support", 69 | "details": "Supporttjenester giver dig mulighed for at komme i kontakt med webstedsteamet og hjælpe med at forbedre det." 70 | }, 71 | "api": { 72 | "title": "APIer", 73 | "details": "AAPI'er bruges til at indlæse scripts: geolokalisation, søgemaskiner, oversættelser, ..." 74 | }, 75 | "other": { 76 | "title": "Andet", 77 | "details": "Tjenester til visning af webindhold." 78 | }, 79 | 80 | "mandatoryTitle": "Mandatory cookies", 81 | "mandatoryText": "This site uses cookies necessary for its proper functioning which cannot be deactivated." 82 | }; 83 | -------------------------------------------------------------------------------- /etc/tarteaucitron/lang/tarteaucitron.de.js: -------------------------------------------------------------------------------- 1 | /*global tarteaucitron */ 2 | tarteaucitron.lang = { 3 | "middleBarHead": "☝ 🍪", 4 | "adblock": "Hallo! Diese Seite ist transparent und lässt Ihnen die Wahl der externen Services, die aktiviert werden dürfen.", 5 | "adblock_call": "Bitte deaktivieren Sie Ihren 'Werbeblocker' um Cookie-Einstellungen vornehmen zu können.", 6 | "reload": "Seite neu laden", 7 | 8 | "alertBigScroll": "Durch weiterblättern,", 9 | "alertBigClick": "Wenn Sie diese Webseite benutzen,", 10 | "alertBig": "stimmen Sie der Benutzung von externen Diensten zu", 11 | 12 | "alertBigPrivacy": "Diese Webseite verwendet 'Cookies' um Inhalte und Anzeigen zu personalisieren und zu analysieren. Bestimmen Sie, welche Dienste benutzt werden dürfen", 13 | "alertSmall": "Datenschutz-Einstellungen", 14 | "personalize": "Personalisieren", 15 | "acceptAll": "Alle akzeptieren", 16 | "close": "Schließen", 17 | 18 | "privacyUrl": "Datenschutzbestimmungen", 19 | 20 | "all": "Einstellungen für alle Dienste", 21 | 22 | "info": "Schutz der Privatsphäre", 23 | "disclaimer": "Wenn Sie diese Dienste nutzen, erlauben Sie deren 'Cookies' und Tracking-Funktionen, die zu ihrer ordnungsgemäßen Funktion notwendig sind.", 24 | "allow": "Erlauben", 25 | "deny": "Ablehnen", 26 | "noCookie": "Dieser Dienst nutzt keine 'Cookies'.", 27 | "useCookie": "Dieser Dienst kann 'Cookies' verwenden", 28 | "useCookieCurrent": "Dieser Dienst verwendet", 29 | "useNoCookie": "Dieser Dienst hat keine 'Cookies' installiert.", 30 | "more": "Weiter lesen", 31 | "source": "Zur offiziellen Webseite", 32 | "credit": "Cookie Manager von tarteaucitron.js", 33 | 34 | "toggleInfoBox": "Zeige/Verberge Cookie-Einstellungen", 35 | "title": "Cookie-Einstellungen", 36 | "cookieDetail": "Cookie Details für", 37 | "ourSite": "auf unserer Seite", 38 | "newWindow": "(neues Fenster)", 39 | "allowAll": "Erlaube alle Cookies", 40 | "denyAll": "Verbiete alle Cookies", 41 | 42 | "icon": "Cookies", 43 | 44 | "fallback": "ist deaktiviert.", 45 | 46 | "ads": { 47 | "title": "Werbenetzwerke", 48 | "details": "Werbenetzwerke können mit dem Verkauf von Werbeplatzierungen auf der Seite Einnahmen erhalten." 49 | }, 50 | "analytic": { 51 | "title": "Besucher Zähldienste", 52 | "details": "Die verwendeten Besucher Zähldienste generieren Statistiken die dabei helfen, die Seite zu verbessern." 53 | }, 54 | "social": { 55 | "title": "Soziale Netzwerke", 56 | "details": "Soziale Netzwerke können die Benutzbarkeit der Seite verbessern und ihren Bekanntheitsgrad erhöhen." 57 | }, 58 | "video": { 59 | "title": "Videos", 60 | "details": "Videoplattformen erlauben Videoinhalte einzublenden und die Sichtbarkeit der Seite zu erhöhen." 61 | }, 62 | "comment": { 63 | "title": "Kommentare", 64 | "details": "Kommentar Manager erleichtern die Organisation von Kommentaren und helfen dabei Spam zu verhindern." 65 | }, 66 | "support": { 67 | "title": "Support", 68 | "details": "Support Dienste erlauben es die Urheber der Seite zu kontaktieren und sie zu verbessern." 69 | }, 70 | "api": { 71 | "title": "APIs", 72 | "details": "APIs werden benutzt um Skripte zu laden, wie: Geolokalisierung, Suchmaschinen, Übersetzungen, ..." 73 | }, 74 | "other": { 75 | "title": "Andere", 76 | "details": "Dienste zum Anzeigen von Web-Inhalten." 77 | }, 78 | 79 | "mandatoryTitle": "Notwendige Cookies", 80 | "mandatoryText": "Diese Seite nutzt Cookies, um die Bedienung der Website zu ermöglichen, diese können nicht deaktiviert werden" 81 | }; 82 | -------------------------------------------------------------------------------- /etc/tarteaucitron/lang/tarteaucitron.el.js: -------------------------------------------------------------------------------- 1 | /*global tarteaucitron */ 2 | tarteaucitron.lang = { 3 | "middleBarHead": "☝ 🍪", 4 | "adblock": "Γεια σας! Ο ιστότοπος αυτός σας επιτρέπει να επιλέξετε τις υπηρεσίες που παρέχονται από τρίτους που θα θέλατε να επιτρέψετε.", 5 | "adblock_call": "Παρακαλώ απενεργοποιήστε τα προγράμματα απόρριψης διαφημίσεων για να ξεκινήσετε τις τροποποιήσεις σας.", 6 | "reload": "Ανανέωση της σελίδας", 7 | 8 | "alertBigScroll": "Συνεχίζοντας την ανάγνωση (κύλιση) της σελίδας,", 9 | "alertBigClick": "Αν συνεχίσετε την περιήγηση σας στον ιστότοπο,", 10 | "alertBig": "επιτρέπετε όλες τις υπηρεσίες που παρέχονται από τρίτους", 11 | 12 | "alertBigPrivacy": "Ο ιστότοπος αυτός χρησιμοποιεί "μπισκότα" (cookies) και σας επιτρέπει να ελέγξετε τι θέλετε να ενεργοποιήσετε", 13 | "alertSmall": "Διαχείριση υπηρεσιών", 14 | "personalize": "Εξατομίκευση", 15 | "acceptAll": "OK, αποδοχή όλων", 16 | "close": "Κλείσιμο", 17 | 18 | "privacyUrl": "Πολιτική απορρήτου", 19 | 20 | "all": "Προτίμηση για όλες τις υπηρεσίες", 21 | 22 | "info": "Προστασία των προσωπικών σας δεδομένων", 23 | "disclaimer": "Επιτρέποντας αυτές τις υπηρεσίες που παρέχονται από τρίτους, αποδέχεστε τα "μπισκότα" (cookies) τους καθώς και τη χρήση τεχνολογιών παρακολούθησης που είναι απαραίτητες για τη λειτουργία τους.", 24 | "allow": "Επέτρεψε", 25 | "deny": "Απόρριψε", 26 | "noCookie": "Η υπηρεσία αυτή δε χρησιμοποιεί "μπισκότα" (cookies).", 27 | "useCookie": "Η υπηρεσία αυτή μπορεί να αποθηκεύσει ", 28 | "useCookieCurrent": "Η υπηρεσία αυτή έχει αποθηκεύσει ", 29 | "useNoCookie": "Η υπηρεσία αυτή δεν έχει αποθηκεύσει κανένα "μπισκότο" (cookie).", 30 | "more": "Διαβάστε περισσότερα", 31 | "source": "Δείτε τον επίσημο ιστότοπο", 32 | "credit": "Cookies manager by tarteaucitron.js", 33 | 34 | "toggleInfoBox": "Προβολή/Απόκρυψη πληροφοριών για την αποθήκευση "μπισκότων" (cookies)", 35 | "title": "Πίνακας διαχείρισης "Μπισκότων" (Cookies)", 36 | "cookieDetail": "Λεπτομέρειες "μπισκότων" (cookies) για", 37 | "ourSite": "στον ιστότοπο μας", 38 | "newWindow": "(νέο παράθυρο)", 39 | "allowAll": "Επέτρεψε όλα τα "μπισκότα" (cookies)", 40 | "denyAll": "Απόρριψε όλα τα "μπισκότα" (cookies)", 41 | 42 | "icon": "Cookies", 43 | 44 | "fallback": "είναι απενεργοποιημένο.", 45 | 46 | "ads": { 47 | "title": "Διαφημιστικό Δίκτυο", 48 | "details": "Τα διαφημιστικά δίκτυα μπορούν να αποφέρουν εισόδημα πουλώντας διαφημιστικό χώρο στη σελίδα." 49 | }, 50 | "analytic": { 51 | "title": "Μετρήσεις κοινού", 52 | "details": "Οι υπηρεσίες μέτρησης κοινού χρησιμοποιούνται για τον υπολογισμό χρήσιμων στατιστικών επισκεψιμότητας του ιστοτόπου για την βελτίωση του." 53 | }, 54 | "social": { 55 | "title": "Κοινωνικά δίκτυα", 56 | "details": "Τα κοινωνικά δίκτυα μπορούν να βελτιώσουν την χρηστικότητα του ιστοτόπου και να τον προωθήσουν μέσω κοινοποιήσεων." 57 | }, 58 | "video": { 59 | "title": "Βίντεο", 60 | "details": "Υπηρεσίες διαμοιρασμού βίντεο που βοηθούν να παρουσιαστεί πλούσιο περιεχόμενο στον ιστότοπο και να αυξήσουν την αναγνωρισιμότητα του." 61 | }, 62 | "comment": { 63 | "title": "Σχόλια", 64 | "details": "Οι διαχειριστές σχολίων βοηθούν την καταχώρηση σχολίων και προστατεύουν από κακόβουλες ενέργειες." 65 | }, 66 | "support": { 67 | "title": "Υποστήριξη", 68 | "details": "Οι υποστηρικτικές υπηρεσίες σας επιτρέπουν να επικονωνείτε με την ομάδα υποστήριξης του ιστοτόπου και να βοηθήσετε στην βελτίωση του." 69 | }, 70 | "api": { 71 | "title": "APIs", 72 | "details": "Τα API χρησιμοποιούνται για την φόρτωση προγραμμάτων: αναγνώρισης τοποθεσίας, μηχανών αναζήτησης, μεταφράσεων, ..." 73 | }, 74 | "other": { 75 | "title": "Λοιπές υπηρεσίες", 76 | "details": "Υπηρεσίες που παρουσιάζουν άλλο περιεχόμενο." 77 | }, 78 | 79 | "mandatoryTitle": "Mandatory cookies", 80 | "mandatoryText": "This site uses cookies necessary for its proper functioning which cannot be deactivated." 81 | }; 82 | -------------------------------------------------------------------------------- /etc/tarteaucitron/lang/tarteaucitron.en.js: -------------------------------------------------------------------------------- 1 | /*global tarteaucitron */ 2 | tarteaucitron.lang = { 3 | "middleBarHead": "☝ 🍪", 4 | "adblock": "Hello! This site is transparent and lets you choose the 3rd party services you want to allow.", 5 | "adblock_call": "Please disable your adblocker to start customizing.", 6 | "reload": "Refresh the page", 7 | 8 | "alertBigScroll": "By continuing to scroll,", 9 | "alertBigClick": "If you continue to browse this website,", 10 | "alertBig": "you are allowing all third-party services", 11 | 12 | "alertBigPrivacy": "This site uses cookies and gives you control over what you want to activate", 13 | "alertSmall": "Manage services", 14 | "personalize": "Personalize", 15 | "acceptAll": "OK, accept all", 16 | "close": "Close", 17 | 18 | "privacyUrl": "Privacy policy", 19 | 20 | "all": "Preference for all services", 21 | 22 | "info": "Protecting your privacy", 23 | "disclaimer": "By allowing these third party services, you accept their cookies and the use of tracking technologies necessary for their proper functioning.", 24 | "allow": "Allow", 25 | "deny": "Deny", 26 | "noCookie": "This service does not use cookie.", 27 | "useCookie": "This service can install", 28 | "useCookieCurrent": "This service has installed", 29 | "useNoCookie": "This service has not installed any cookie.", 30 | "more": "Read more", 31 | "source": "View the official website", 32 | "credit": "Cookies manager by tarteaucitron.js", 33 | "noServices": "This website does not use any cookie requiring your consent.", 34 | 35 | "toggleInfoBox": "Show/hide informations about cookie storage", 36 | "title": "Cookies management panel", 37 | "cookieDetail": "Cookie detail for", 38 | "ourSite": "on our site", 39 | "newWindow": "(new window)", 40 | "allowAll": "Allow all cookies", 41 | "denyAll": "Deny all cookies", 42 | 43 | "icon": "Cookies", 44 | 45 | "fallback": "is disabled.", 46 | 47 | "ads": { 48 | "title": "Advertising network", 49 | "details": "Ad networks can generate revenue by selling advertising space on the site." 50 | }, 51 | "analytic": { 52 | "title": "Audience measurement", 53 | "details": "The audience measurement services used to generate useful statistics attendance to improve the site." 54 | }, 55 | "social": { 56 | "title": "Social networks", 57 | "details": "Social networks can improve the usability of the site and help to promote it via the shares." 58 | }, 59 | "video": { 60 | "title": "Videos", 61 | "details": "Video sharing services help to add rich media on the site and increase its visibility." 62 | }, 63 | "comment": { 64 | "title": "Comments", 65 | "details": "Comments managers facilitate the filing of comments and fight against spam." 66 | }, 67 | "support": { 68 | "title": "Support", 69 | "details": "Support services allow you to get in touch with the site team and help to improve it." 70 | }, 71 | "api": { 72 | "title": "APIs", 73 | "details": "APIs are used to load scripts: geolocation, search engines, translations, ..." 74 | }, 75 | "other": { 76 | "title": "Other", 77 | "details": "Services to display web content." 78 | }, 79 | 80 | "mandatoryTitle": "Mandatory cookies", 81 | "mandatoryText": "This site uses cookies necessary for its proper functioning which cannot be deactivated." 82 | }; 83 | -------------------------------------------------------------------------------- /etc/tarteaucitron/lang/tarteaucitron.es.js: -------------------------------------------------------------------------------- 1 | /*global tarteaucitron */ 2 | tarteaucitron.lang = { 3 | "middleBarHead": "☝ 🍪", 4 | "adblock": "¡Hola! Este sitio web es transparente y te da la opción de activar los servicios de terceros.", 5 | "adblock_call": "Por favor deshabilita tu AdBlocker para empezar a personalizar los servicios.", 6 | "reload": "Actualizar esta página", 7 | 8 | "alertBigScroll": "Al continuar desplazándote,", 9 | "alertBigClick": "Si continuas navegando por este sitio web,", 10 | "alertBig": "estás permitiendo servicios terceros", 11 | 12 | "alertBigPrivacy": "Este sitio web usa cookies y te permite controlar las que deseas activar", 13 | "alertSmall": "Gestionar servicios", 14 | "personalize": "Personalizar", 15 | "acceptAll": "OK, aceptar todas", 16 | "close": "Cerrar", 17 | 18 | "privacyUrl": "Política de privacidad", 19 | 20 | "all": "Ajustes para todos los servicios", 21 | 22 | "info": "Protegiendo tu privacidad", 23 | "disclaimer": "Aceptando estos servicios de terceros, estás aceptando sus cookies y el uso de tecnologías de rastreo necesarias para su correcto funcionamiento.", 24 | "allow": "Permitir", 25 | "deny": "Denegar", 26 | "noCookie": "Este servicio no usa cookies.", 27 | "useCookie": "Este servicio puede instalar", 28 | "useCookieCurrent": "Este servicio ha instalado", 29 | "useNoCookie": "Este servicio no ha instalado ninguna cookie.", 30 | "more": "Leer más", 31 | "source": "Ver sitio web oficial", 32 | "credit": "Gestor de cookies realizado por tarteaucitron.js", 33 | 34 | "toggleInfoBox": "Mostrar/ocultar información sobre almacenamiento de cookies", 35 | "title": "Panel de gestión de cookies", 36 | "cookieDetail": "Detalles de las cookies para", 37 | "ourSite": "en nuestra web", 38 | "newWindow": "(ventana nueva)", 39 | "allowAll": "Permitir todas las cookies", 40 | "denyAll": "Denegar todas las cookies", 41 | 42 | "icon": "Cookies", 43 | 44 | "fallback": "está deshabilitado.", 45 | 46 | "ads": { 47 | "title": "Red de publicidad", 48 | "details": "Las redes publicitarias pueden generar ingresos mediante la venta de espacios publicitarios en el sitio." 49 | }, 50 | "analytic": { 51 | "title": "Medición de audiencia", 52 | "details": "Los servicios de medición de audiencia se usan para generar estadísticas útiles para mejorar el sitio." 53 | }, 54 | "social": { 55 | "title": "Redes sociales", 56 | "details": "Las redes sociales pueden aumentar la usabilidad del sitio web y ayudar a promoverlo a través de la contribución." 57 | }, 58 | "video": { 59 | "title": "Videos", 60 | "details": "Los servicios para compartir videos ayudan a añadir contenido enriquecido en el sitio web y aumentar su visibilidad." 61 | }, 62 | "comment": { 63 | "title": "Comentarios", 64 | "details": "El gestor de comentarios facilita la clasificación de comentarios y luchar contra spam." 65 | }, 66 | "support": { 67 | "title": "Soporte", 68 | "details": "Los servicios de soporte te permiten contactar con el sitio web y ayudar a mejorarlo." 69 | }, 70 | "api": { 71 | "title": "APIs", 72 | "details": "APIs se utilizan para cargar scripts: geolocalización, motor de búsqueda, traducciones, ..." 73 | }, 74 | "other": { 75 | "title": "Otro", 76 | "details": "Servicios para mostrar contenido web." 77 | }, 78 | 79 | "mandatoryTitle": "Cookies obligatorias", 80 | "mandatoryText": "Este sitio utiliza cookies necesarias para su correcto funcionamiento que no se pueden desactivar." 81 | }; 82 | -------------------------------------------------------------------------------- /etc/tarteaucitron/lang/tarteaucitron.fi.js: -------------------------------------------------------------------------------- 1 | /*global tarteaucitron */ 2 | tarteaucitron.lang = { 3 | "middleBarHead": "☝ 🍪", 4 | "adblock": "Hei! Tämä sivusto antaa sinun valita ja hallita kolmansien osapuolten asettamia evästeitä.", 5 | "adblock_call": "Estä adblocker muuttaaksesi asetuksia.", 6 | "reload": "Päivitä sivu", 7 | 8 | "alertBigScroll": "Jatkamalla selailua,", 9 | "alertBigClick": "Jatkamalla tämän sivuston selailua,", 10 | "alertBig": "hyväksyt kolmansien osapuolien tarjoamia palveluita", 11 | 12 | "alertBigPrivacy": "Tämä sivusto käyttää evästeitä ja antaa sinun hallita niitä.", 13 | "alertSmall": "Hallinnoi palveluja", 14 | "acceptAll": "OK, hyväksy kaikki", 15 | "personalize": "Personoi", 16 | "close": "Sulje", 17 | 18 | "privacyUrl": "Tietosuoja", 19 | 20 | "all": "Kaikkien palveluiden valinta", 21 | 22 | "info": "Yksityisyyden suojaaminen", 23 | "disclaimer": "Hyväksymällä kolmansien osapuolten palvelut, hyväksyt toiminnan kannalta tarpeellisten evästeiden ja seurantateknologioiden käytön.", 24 | "allow": "Hyväksy", 25 | "deny": "Kiellä", 26 | "noCookie": "Tämä palvelu ei käytä evästeitä", 27 | "useCookie": "Tämä palvelu voidaan asentaa", 28 | "useCookieCurrent": "Tämä palvelu on asennettu", 29 | "useNoCookie": "Tämä palvelu ei ole asentanut evästeitä", 30 | "more": "Lue lisää", 31 | "source": "Katso virallinen nettisivu", 32 | "credit": "Evästeiden hallinta: tarteaucitron.js", 33 | "noServices": "Tämä sivusto ei käytä evästeitä, jotka vaativat suostumustasi.", 34 | 35 | "toggleInfoBox": "Näytä/piilota tiedot evästeistä ja niiden säilytyksestä", 36 | "title": "Evästeiden hallintapaneeli", 37 | "cookieDetail": "Evästetiedot", 38 | "ourSite": "sivustollamme", 39 | "newWindow": "uusi ikkuna", 40 | "allowAll": "Hyväksy kaikki evästeet", 41 | "denyAll": "Kiellä kaikki evästeet", 42 | 43 | "icon": "Cookies", 44 | 45 | "fallback": "hylätty.", 46 | 47 | "ads": { 48 | "title": "Mainosverkosto", 49 | "details": "Mainosverkostot saattavat saada tuloja myymällä mainostilaa sivustolla." 50 | }, 51 | "analytic": { 52 | "title": "Yleisön mittaaminen", 53 | "details": "Les services de mesure d'audience permettent de générer des statistiques de fréquentation utiles à l'amélioration du site." 54 | }, 55 | "social": { 56 | "title": "Sosiaaliset verkostot", 57 | "details": "Sosiaaliset verkostot voivat helpottaa sivuston käytettävyyttä ja mainontaa" 58 | }, 59 | "video": { 60 | "title": "Videot", 61 | "details": "Videoiden toistopalvelut auttavat rikastamaan sivuston markkinointia ja kasvattaa sen näkyvyyttä" 62 | }, 63 | 64 | "comment": { 65 | 66 | "title": "Kommentit", 67 | 68 | "details": "Kommentoinnin ylläpito helpottaa kommenttien arkistointia ja roskapostin hallintaa." 69 | }, 70 | "support": { 71 | "title": "Tuki", 72 | "details": "Ohjelmointirajapintoja käytetään eri ohjelmistojen, kuten hakukoneiden, sijaintien tai käännösten, lataamiseen." 73 | }, 74 | "api": { 75 | "title": "Ohjelmointirajapinnat", 76 | "details": "Ohjelmointirajapintoja käytetään eri ohjelmistojen, kuten hakukoneiden, sijaintien tai käännösten, lataamiseen,..." 77 | }, 78 | "other": { 79 | "title": "Muut", 80 | "details": "Palvelut web-sisältöjen näyttämiseen." 81 | }, 82 | 83 | "mandatoryTitle": "Mandatory cookies", 84 | "mandatoryText": "This site uses cookies necessary for its proper functioning which cannot be deactivated." 85 | }; 86 | -------------------------------------------------------------------------------- /etc/tarteaucitron/lang/tarteaucitron.fr.js: -------------------------------------------------------------------------------- 1 | /*global tarteaucitron */ 2 | tarteaucitron.lang = { 3 | 4 | "middleBarHead": "☝ 🍪", 5 | "adblock": "Bonjour! Ce site joue la transparence et vous donne le choix des services tiers à activer.", 6 | "adblock_call": "Merci de désactiver votre adblocker pour commencer la personnalisation.", 7 | "reload": "Recharger la page", 8 | 9 | "alertBigScroll": "En continuant de défiler,", 10 | "alertBigClick": "En poursuivant votre navigation,", 11 | "alertBig": "vous acceptez l'utilisation de services tiers pouvant installer des cookies", 12 | 13 | "alertBigPrivacy": "Ce site utilise des cookies et vous donne le contrôle sur ceux que vous souhaitez activer", 14 | "alertSmall": "Gestion des services", 15 | "acceptAll": "Tout accepter", 16 | "personalize": "Personnaliser", 17 | "close": "Fermer", 18 | 19 | "privacyUrl": "Politique de confidentialité", 20 | 21 | "all": "Préférences pour tous les services", 22 | 23 | "info": "Protection de votre vie privée", 24 | "disclaimer": "En autorisant ces services tiers, vous acceptez le dépôt et la lecture de cookies et l'utilisation de technologies de suivi nécessaires à leur bon fonctionnement.", 25 | "allow": "Autoriser", 26 | "deny": "Interdire", 27 | "noCookie": "Ce service ne dépose aucun cookie.", 28 | "useCookie": "Ce service peut déposer", 29 | "useCookieCurrent": "Ce service a déposé", 30 | "useNoCookie": "Ce service n'a déposé aucun cookie.", 31 | "more": "En savoir plus", 32 | "source": "Voir le site officiel", 33 | "credit": "Gestion des cookies par tarteaucitron.js", 34 | "noServices": "Ce site n'utilise aucun cookie nécessitant votre consentement.", 35 | 36 | "toggleInfoBox": "Afficher/masquer les informations sur le stockage des cookies", 37 | "title": "Panneau de gestion des cookies", 38 | "cookieDetail": "Détail des cookies", 39 | "ourSite": "sur notre site", 40 | "newWindow": "(nouvelle fenêtre)", 41 | "allowAll": "Tout accepter", 42 | "denyAll": "Tout refuser", 43 | 44 | "icon": "Cookies", 45 | 46 | "fallback": "est désactivé.", 47 | 48 | "ads": { 49 | "title": "Régies publicitaires", 50 | "details": "Les régies publicitaires permettent de générer des revenus en commercialisant les espaces publicitaires du site." 51 | }, 52 | "analytic": { 53 | "title": "Mesure d'audience", 54 | "details": "Les services de mesure d'audience permettent de générer des statistiques de fréquentation utiles à l'amélioration du site." 55 | }, 56 | "social": { 57 | "title": "Réseaux sociaux", 58 | "details": "Les réseaux sociaux permettent d'améliorer la convivialité du site et aident à sa promotion via les partages." 59 | }, 60 | "video": { 61 | "title": "Vidéos", 62 | "details": "Les services de partage de vidéo permettent d'enrichir le site de contenu multimédia et augmentent sa visibilité." 63 | }, 64 | "comment": { 65 | "title": "Commentaires", 66 | "details": "Les gestionnaires de commentaires facilitent le dépôt de vos commentaires et luttent contre le spam." 67 | }, 68 | "support": { 69 | "title": "Support", 70 | "details": "Les services de support vous permettent d'entrer en contact avec l'équipe du site et d'aider à son amélioration." 71 | }, 72 | "api": { 73 | "title": "APIs", 74 | "details": "Les APIs permettent de charger des scripts : géolocalisation, moteurs de recherche, traductions, ..." 75 | }, 76 | "other": { 77 | "title": "Autre", 78 | "details": "Services visant à afficher du contenu web." 79 | }, 80 | 81 | "mandatoryTitle": "Cookies obligatoires", 82 | "mandatoryText": "Ce site utilise des cookies nécessaires à son bon fonctionnement. Ils ne peuvent pas être désactivés." 83 | }; 84 | -------------------------------------------------------------------------------- /etc/tarteaucitron/lang/tarteaucitron.hu.js: -------------------------------------------------------------------------------- 1 | /*global tarteaucitron */ 2 | tarteaucitron.lang = { 3 | "middleBarHead": "☝ 🍪", 4 | "adblock": "Szia! Ez a webhely átlátható, és lehetővé teszi a kívánt harmadik fél szolgáltatásainak kiválasztását", 5 | "adblock_call": "A testreszabás megkezdéséhez állítsd le az adblockert, kérlek.", 6 | "reload": "Oldal frissítése", 7 | 8 | "alertBigScroll": "A görgetés folytatásával,", 9 | "alertBigClick": "Ha folytatod a böngészést ezen oldalon,", 10 | "alertBig": "engedélyezed a harmadik fél összes szolgáltatását.", 11 | 12 | "alertBigPrivacy": "A webhely tartalmának megjelenítéséhez és a felhasználói élmény javításához cookie-kat használunk", 13 | "alertSmall": "Szolgáltatások kezelése", 14 | "personalize": "Beállítások", 15 | "acceptAll": "OK, elfogadom", 16 | "close": "Bezár", 17 | 18 | "privacyUrl": "Adatvédelmi irányelvek", 19 | 20 | "all": "Összes szolgáltatás előnyben részesítése", 21 | 22 | "info": "Személyi adataid védelme", 23 | "disclaimer": "A harmadik fél szolgáltatásainak engedélyezésével elfogadja a sütiket és a megfelelő működésükhöz szükséges nyomkövetési technológiák használatát.", 24 | "allow": "Elfogadom", 25 | "deny": "Elutasítom", 26 | "noCookie": "Ez a szolgáltatás nem használ sütit.", 27 | "useCookie": "Ez a szolgáltatás telepíthető", 28 | "useCookieCurrent": "Ez a szolgáltatás telepített", 29 | "useNoCookie": "Ez a szolgáltatás nem telepített sütiket", 30 | "more": "Olvass többet", 31 | "source": "Tekintsd meg a hivatalos weboldalt", 32 | "credit": "Cookie-kezelő: tarteaucitron.js", 33 | "noServices": "Ez a weboldal nem használ olyan sütiket, amelyekhez a beleegyezésed szükséges.", 34 | 35 | "toggleInfoBox": "Információk megjelenítése / elrejtése a süti-tárolással kapcsolatban", 36 | "title": "Süti preferenciák", 37 | "cookieDetail": "Süti adatok a következőhöz:", 38 | "ourSite": "weboldalunkon", 39 | "newWindow": "(új ablak)", 40 | "allowAll": "Elfogadom az öszeset", 41 | "denyAll": "Elutasítom", 42 | 43 | "icon": "Cookies", 44 | 45 | "fallback": "letiltott.", 46 | 47 | "ads": { 48 | "title": "Reklámhálózat", 49 | "details": "A hirdetési hálózatok bevételt teremthetnek azáltal, hogy értékesítik a webhelyen található hirdetési felületet" 50 | }, 51 | "analytic": { 52 | "title": "Közönségmérés", 53 | "details": "A közönségmérési szolgáltatások hasznos statisztikai adatokat generáltak a webhely fejlesztése érdekében." 54 | }, 55 | "social": { 56 | "title": "Közösségi hálózatok", 57 | "details": "A közösségi hálózatok javíthatják a webhely használhatóságát, és elősegíthetik annak promoválását a megosztások révén." 58 | }, 59 | "video": { 60 | "title": "Videók", 61 | "details": "A videomegosztó szolgáltatások hozzájárulnak hasznos multimédiához a webhelyen és növelik annak láthatóságát." 62 | }, 63 | "comment": { 64 | "title": "Kommentek", 65 | "details": "A megjegyzésfigyelők megkönnyítik a megjegyzések kitöltését és a spam elleni küzdelmet." 66 | }, 67 | "support": { 68 | "title": "Támogatás", 69 | "details": "A támogatási szolgáltatások lehetővé teszik, hogy kapcsolatba lépjen a webhely csapatával, és segítsen annak fejlesztésében." 70 | }, 71 | "api": { 72 | "title": "APIk", 73 | "details": "Az API-kat a szkriptek betöltésére használják: földrajzi helymeghatározás, keresőmotorok, fordítások..." 74 | }, 75 | "other": { 76 | "title": "Más", 77 | "details": "Szolgáltatások webtartalom megjelenítésére." 78 | }, 79 | 80 | "mandatoryTitle": "Kötelező sütik", 81 | "mandatoryText": "A webhely tartalmának megjelenítéséhez és a felhasználói bejelentkezéshez sütiket használunk amiket nem lehet kikapcsolni." 82 | }; 83 | -------------------------------------------------------------------------------- /etc/tarteaucitron/lang/tarteaucitron.it.js: -------------------------------------------------------------------------------- 1 | /*global tarteaucitron */ 2 | tarteaucitron.lang = { 3 | "middleBarHead": "☝ 🍪", 4 | "adblock": "Benvenuto! Questo sito ti permette di attivare i servizi di terzi di tua scelta.", 5 | "adblock_call": "Disabilita il tuo adblocker per iniziare la navigazione.", 6 | "reload": "Aggiorna la pagina", 7 | 8 | "alertBigScroll": "Continuando a scorrere,", 9 | "alertBigClick": "Continuando a navigare nel sito,", 10 | "alertBig": "autorizzi l’utilizzo dei cookies inviati da domini di terze parti", 11 | 12 | "alertBigPrivacy": "Questo sito fa uso di cookies e ti consente di decidere se accettarli o rifiutarli", 13 | "alertSmall": "Gestione dei servizi", 14 | "acceptAll": "Ok, accetta tutto", 15 | "personalize": "Personalizza", 16 | "close": "Chiudi", 17 | 18 | "privacyUrl": "Politica sulla riservatezza", 19 | 20 | "all": "Preferenze per tutti i servizi", 21 | 22 | "info": "Tutela della privacy", 23 | "disclaimer": "Abilitando l'uso dei servizi di terze parti, accetti la ricezione dei cookies e l'uso delle tecnologie analitici necessarie al loro funzionamento.", 24 | "allow": "Consenti", 25 | "deny": "Blocca", 26 | "noCookie": "Questo servizio non invia nessun cookie", 27 | "useCookie": "Questo servizio puo' inviare", 28 | "useCookieCurrent": "Questo servizio ha inviato", 29 | "useNoCookie": "Questo servizio non ha inviato nessun cookie", 30 | "more": "Saperne di più", 31 | "source": "Vai al sito ufficiale", 32 | "credit": "Gestione dei cookies da tarteaucitron.js", 33 | 34 | "toggleInfoBox": "Show/hide informations about cookie storage", 35 | "title": "Cookies management panel", 36 | "cookieDetail": "Cookie detail for", 37 | "ourSite": "on our site", 38 | "newWindow": "(new window)", 39 | "allowAll": "Allow all cookies", 40 | "denyAll": "Deny all cookies", 41 | 42 | "icon": "Cookies", 43 | 44 | "fallback": "è disattivato", 45 | 46 | "ads": { 47 | "title": "Regie pubblicitarie", 48 | "details": "Le regie pubblicitarie producono redditi gestendo la commercializzazione degli spazi del sito dedicati alle campagne pubblicitarie" 49 | }, 50 | "analytic": { 51 | "title": "Misura del pubblico", 52 | "details": "I servizi di misura del pubblico permettono di raccogliere le statistiche utili al miglioramento del sito" 53 | }, 54 | "social": { 55 | "title": "Reti sociali", 56 | "details": "Le reti sociali permettono di migliorare l'aspetto conviviale del sito e di sviluppare la condivisione dei contenuti da parte degli utenti a fini promozionali." 57 | }, 58 | "video": { 59 | "title": "Video", 60 | "details": "I servizi di condivisione di video permettono di arricchire il sito di contenuti multimediali e di aumentare la sua visibilità" 61 | }, 62 | "comment": { 63 | "title": "Commenti", 64 | "details": "La gestione dei commenti utente aiuta a gestire la pubblicazione dei commenti e a lottare contro lo spamming" 65 | }, 66 | "support": { 67 | "title": "Supporto", 68 | "details": "I servizi di supporto ti consentono di contattare la team del sito e di contribuire al suo miglioramento" 69 | }, 70 | "api": { 71 | "title": "API", 72 | "details": "Le API permettono di implementare script diversi : geolocalizzazione, motori di ricerca, traduttori..." 73 | }, 74 | "other": { 75 | "title": "Altro", 76 | "details": "Servizi per visualizzare contenuti web." 77 | }, 78 | 79 | "mandatoryTitle": "Mandatory cookies", 80 | "mandatoryText": "This site uses cookies necessary for its proper functioning which cannot be deactivated." 81 | }; 82 | -------------------------------------------------------------------------------- /etc/tarteaucitron/lang/tarteaucitron.ja.js: -------------------------------------------------------------------------------- 1 | /*global tarteaucitron */ 2 | tarteaucitron.lang = { 3 | "middleBarHead": "☝ 🍪", 4 | "adblock": "Hello! This site is transparent and lets you chose the 3rd party services you want to allow.", 5 | "adblock_call": "Please disable your adblocker to start customizing.", 6 | "reload": "Refresh the page", 7 | 8 | "alertBigScroll": "By continuing to scroll,", 9 | "alertBigClick": "If you continue to browse this website,", 10 | "alertBig": "you are allowing all third-party services", 11 | 12 | "alertBigPrivacy": "当サイトはクッキーを利用しております。お客様自身でクッキー利用の設定および管理ができます。", 13 | "alertSmall": "Manage services", 14 | "personalize": "カスタマイズする", 15 | "acceptAll": "全てに同意する", 16 | "close": "Close", 17 | 18 | "privacyUrl": "プライバシーポリシー", 19 | 20 | "all": "Preference for all services", 21 | 22 | "info": "Protecting your privacy", 23 | "disclaimer": "これらの第三者によるサービスを許可することで、サイトの動作に必要なクッキーや他のトラッキング・テクノロジーの使用に同意するものとみなします。", 24 | "allow": "許可", 25 | "deny": "拒否", 26 | "noCookie": "This service does not use cookie.", 27 | "useCookie": "This service can install", 28 | "useCookieCurrent": "このサービスは2つのクッキーを利用します", 29 | "useNoCookie": "This service has not installed any cookie.", 30 | "more": "もっと読む", 31 | "source": "公式サイトで閲覧する", 32 | "credit": "Cookies manager by tarteaucitron.js", 33 | "noServices": "This website does not use any cookie requiring your consent.", 34 | 35 | "toggleInfoBox": "Show/hide informations about cookie storage", 36 | "title": "クッキー利用の管理について", 37 | "cookieDetail": "Cookie detail for", 38 | "ourSite": "on our site", 39 | "newWindow": "(new window)", 40 | "allowAll": "すべてのクッキーを許可する", 41 | "denyAll": "すべてのクッキーを拒否する", 42 | 43 | "icon": "Cookies", 44 | 45 | "fallback": "is disabled.", 46 | 47 | "ads": { 48 | "title": "Advertising network", 49 | "details": "Ad networks can generate revenue by selling advertising space on the site." 50 | }, 51 | "analytic": { 52 | "title": "Audience measurement", 53 | "details": "The audience measurement services used to generate useful statistics attendance to improve the site." 54 | }, 55 | "social": { 56 | "title": "Social networks", 57 | "details": "Social networks can improve the usability of the site and help to promote it via the shares." 58 | }, 59 | "video": { 60 | "title": "Videos", 61 | "details": "Video sharing services help to add rich media on the site and increase its visibility." 62 | }, 63 | "comment": { 64 | "title": "Comments", 65 | "details": "Comments managers facilitate the filing of comments and fight against spam." 66 | }, 67 | "support": { 68 | "title": "Support", 69 | "details": "Support services allow you to get in touch with the site team and help to improve it." 70 | }, 71 | "api": { 72 | "title": "APIs", 73 | "details": "APIs are used to load scripts: geolocation, search engines, translations, ..." 74 | }, 75 | "other": { 76 | "title": "Other", 77 | "details": "Services to display web content." 78 | }, 79 | 80 | "mandatoryTitle": "Mandatory cookies", 81 | "mandatoryText": "This site uses cookies necessary for its proper functioning which cannot be deactivated." 82 | }; 83 | -------------------------------------------------------------------------------- /etc/tarteaucitron/lang/tarteaucitron.lv.js: -------------------------------------------------------------------------------- 1 | /*global tarteaucitron */ 2 | tarteaucitron.lang = { 3 | "middleBarHead": "☝ 🍪", 4 | "adblock": "Szia! Ez a webhely átlátható, és lehetővé teszi a kívánt harmadik fél szolgáltatásainak kiválasztását", 5 | "adblock_call": "A testreszabás megkezdéséhez állítsd le az adblockert, kérlek.", 6 | "reload": "Oldal frissítése", 7 | 8 | "alertBigScroll": "A görgetés folytatásával,", 9 | "alertBigClick": "Ha folytatod a böngészést ezen oldalon,", 10 | "alertBig": "engedélyezed a harmadik fél összes szolgáltatását.", 11 | 12 | "alertBigPrivacy": "A webhely tartalmának megjelenítéséhez és a felhasználói élmény javításához cookie-kat használunk", 13 | "alertSmall": "Szolgáltatások kezelése", 14 | "personalize": "Beállítások", 15 | "acceptAll": "OK, elfogadom", 16 | "close": "Bezár", 17 | 18 | "privacyUrl": "Adatvédelmi irányelvek", 19 | 20 | "all": "Összes szolgáltatás előnyben részesítése", 21 | 22 | "info": "Személyi adataid védelme", 23 | "disclaimer": "A harmadik fél szolgáltatásainak engedélyezésével elfogadja a sütiket és a megfelelő működésükhöz szükséges nyomkövetési technológiák használatát.", 24 | "allow": "Elfogadom", 25 | "deny": "Elutasítom", 26 | "noCookie": "Ez a szolgáltatás nem használ sütit.", 27 | "useCookie": "Ez a szolgáltatás telepíthető", 28 | "useCookieCurrent": "Ez a szolgáltatás telepített", 29 | "useNoCookie": "Ez a szolgáltatás nem telepített sütiket", 30 | "more": "Olvass többet", 31 | "source": "Tekintsd meg a hivatalos weboldalt", 32 | "credit": "Cookie-kezelő: tarteaucitron.js", 33 | "noServices": "Ez a weboldal nem használ olyan sütiket, amelyekhez a beleegyezésed szükséges.", 34 | 35 | "toggleInfoBox": "Információk megjelenítése / elrejtése a süti-tárolással kapcsolatban", 36 | "title": "Süti preferenciák", 37 | "cookieDetail": "Süti adatok a következőhöz:", 38 | "ourSite": "weboldalunkon", 39 | "newWindow": "(új ablak)", 40 | "allowAll": "Elfogadom az öszeset", 41 | "denyAll": "Elutasítom", 42 | 43 | "icon": "Cookies", 44 | 45 | "fallback": "letiltott.", 46 | 47 | "ads": { 48 | "title": "Reklámhálózat", 49 | "details": "A hirdetési hálózatok bevételt teremthetnek azáltal, hogy értékesítik a webhelyen található hirdetési felületet" 50 | }, 51 | "analytic": { 52 | "title": "Közönségmérés", 53 | "details": "A közönségmérési szolgáltatások hasznos statisztikai adatokat generáltak a webhely fejlesztése érdekében." 54 | }, 55 | "social": { 56 | "title": "Közösségi hálózatok", 57 | "details": "A közösségi hálózatok javíthatják a webhely használhatóságát, és elősegíthetik annak promoválását a megosztások révén." 58 | }, 59 | "video": { 60 | "title": "Videók", 61 | "details": "A videomegosztó szolgáltatások hozzájárulnak hasznos multimédiához a webhelyen és növelik annak láthatóságát." 62 | }, 63 | "comment": { 64 | "title": "Kommentek", 65 | "details": "A megjegyzésfigyelők megkönnyítik a megjegyzések kitöltését és a spam elleni küzdelmet." 66 | }, 67 | "support": { 68 | "title": "Támogatás", 69 | "details": "A támogatási szolgáltatások lehetővé teszik, hogy kapcsolatba lépjen a webhely csapatával, és segítsen annak fejlesztésében." 70 | }, 71 | "api": { 72 | "title": "APIk", 73 | "details": "Az API-kat a szkriptek betöltésére használják: földrajzi helymeghatározás, keresőmotorok, fordítások..." 74 | }, 75 | "other": { 76 | "title": "Más", 77 | "details": "Szolgáltatások webtartalom megjelenítésére." 78 | }, 79 | 80 | "mandatoryTitle": "Kötelező sütik", 81 | "mandatoryText": "A webhely tartalmának megjelenítéséhez és a felhasználói bejelentkezéshez sütiket használunk amiket nem lehet kikapcsolni." 82 | }; 83 | -------------------------------------------------------------------------------- /etc/tarteaucitron/lang/tarteaucitron.nl.js: -------------------------------------------------------------------------------- 1 | /*global tarteaucitron */ 2 | tarteaucitron.lang = { 3 | "middleBarHead": "☝ 🍪", 4 | "adblock": "Hallo! Deze site is transparant en laat u de services van derden kiezen die u wilt toestaan.", 5 | "adblock_call": "Schakel uw adblocker uit om te beginnen met aanpassen.", 6 | "reload": "Ververs de pagina", 7 | 8 | "alertBigScroll": "Door te blijven scrollen,", 9 | "alertBigClick": "Als je doorgaat met het surfen op deze website,", 10 | "alertBig": "sta je alle diensten van derden toe", 11 | 12 | "alertBigPrivacy": "Deze site maakt gebruik van cookies en geeft u controle over wat u wilt activeren", 13 | "alertSmall": "Beheer instellingen", 14 | "personalize": "Personaliseer", 15 | "acceptAll": "OK, accepteer alle", 16 | "close": "Sluit", 17 | 18 | "privacyUrl": "Privacybeleid", 19 | 20 | "all": "Voorkeur voor alle diensten", 21 | 22 | "info": "Bescherming van uw privacy", 23 | "disclaimer": "Door deze services van derden toe te staan, accepteert u hun cookies en het gebruik van trackingtechnologieën die nodig zijn voor hun goede werking.", 24 | "allow": "Toestaan", 25 | "deny": "Weigeren", 26 | "noCookie": "Deze service gebruikt geen cookie", 27 | "useCookie": "Deze service kan worden geïnstalleerd", 28 | "useCookieCurrent": "Deze service is geïnstalleerd", 29 | "useNoCookie": "Deze service heeft geen cookies geïnstalleerd.", 30 | "more": "Lees meer", 31 | "source": "Bekijk de officiële website", 32 | "credit": "Cookie manager mogelijk gemaakt door tarteaucitron.js", 33 | 34 | "fallback": "is uitgeschakeld.", 35 | 36 | "toggleInfoBox": "Toon/verberg informatie over cookie opslag", 37 | "title": "Cookies beheer paneel", 38 | "cookieDetail": "Cookie detail voor", 39 | "ourSite": "op onze site", 40 | "newWindow": "(nieuw venster)", 41 | "allowAll": "Sta alle cookies toe", 42 | "denyAll": "Weiger alle cookies", 43 | 44 | "icon": "Cookies", 45 | 46 | "ads": { 47 | "title": "Advertentienetwerk", 48 | "details": "Advertentienetwerken kunnen inkomsten genereren door advertentieruimte op de site te verkopen." 49 | }, 50 | "analytic": { 51 | "title": "Bezoekers meting", 52 | "details": "De bezoekersdiensten voor het publiek worden gebruikt om nuttige statistieken te genereren om de site te verbeteren." 53 | }, 54 | "social": { 55 | "title": "Sociale netwerken", 56 | "details": "Sociale netwerken kunnen de bruikbaarheid van de site verbeteren en helpen deze via de shares te promoten." 57 | }, 58 | "video": { 59 | "title": "Videos", 60 | "details": "Video sharing-services helpen om rich media op de site toe te voegen en de zichtbaarheid ervan te vergroten." 61 | }, 62 | "comment": { 63 | "title": "Comments", 64 | "details": "Commentsmanagers faciliteren het indienen van opmerkingen en het bestrijden van spam." 65 | }, 66 | "support": { 67 | "title": "Support", 68 | "details": "Support diensten stellen u in staat contact op te nemen met het team van de site en helpen het te verbeteren." 69 | }, 70 | "api": { 71 | "title": "APIs", 72 | "details": "APIs worden gebruikt om scripts te laden: geolocatie, zoekmachines, vertalingen, ..." 73 | }, 74 | "other": { 75 | "title": "Overig", 76 | "details": "Diensten om webinhoud weer te geven." 77 | }, 78 | 79 | "mandatoryTitle": "Verplichte cookies", 80 | "mandatoryText": "Deze site maakt gebruik van cookies die nodig zijn voor de goede werking ervan en die niet kunnen worden gedeactiveerd." 81 | }; 82 | -------------------------------------------------------------------------------- /etc/tarteaucitron/lang/tarteaucitron.no.js: -------------------------------------------------------------------------------- 1 | /*global tarteaucitron */ 2 | tarteaucitron.lang = { 3 | "middleBarHead" : "☝ 🍪", 4 | "adblock" : "Hei! Dette nettstedet er gjennomsiktig og lar deg kontrollere hvilke tredjeparts tjenester du vil tillate.", 5 | "adblock_call" : "For å gjøre endringer, vær så snill å deaktivere annonse-blokkering.", 6 | "reload" : "Oppdater side", 7 | 8 | "alertBigScroll" : "Ved å fortsette å scrolle,", 9 | "alertBigClick" : "Dersom du fortsetter å bruke dette nettstedet,", 10 | "alertBig" : "tillater du alle tredjeparts tjenester", 11 | 12 | "alertBigPrivacy" : "Dette nettstedet bruker informasjonskapsler og gir deg kontroll over hva du vil aktivere", 13 | "alertSmall" : "Administrer tjenester", 14 | "personalize" : "Personaliser", 15 | "acceptAll" : "OK, aksepter alt", 16 | "close" : "Steng", 17 | 18 | "privacyUrl" : "Personvernregler", 19 | 20 | "all" : "Preferanse for alle tjenester", 21 | 22 | "info" : "Beskytt ditt personvern", 23 | "disclaimer" : "Ved å tillate disse tredjepartstjenestene godtar du informasjonskapslene deres og bruken av sporingsteknologier som er nødvendige for at de skal fungere korrekt.", 24 | "allow" : "Tillat", 25 | "deny" : "Ikke tillat", 26 | "noCookie" : "Denne tjenesten bruker ikke informasjonskapsel.", 27 | "useCookie" : "Denne tjenesten kan installeres", 28 | "useCookieCurrent" : "Denne tjenesten er installert", 29 | "useNoCookie" : "TDenne tjenesten har ikke installert noen informasjonskapsel.", 30 | "more" : "Les mer", 31 | "source" : "Se den offisielle nettsiden", 32 | "credit" : "Informasjonskapsler styres av tarteaucitron.js", 33 | "noServices" : "Dette nettstedet bruker ingen informasjonskapsler som krever ditt samtykke.", 34 | 35 | "toggleInfoBox" : "Vis / skjul informasjon om lagring av informasjonskapsler", 36 | "title" : "Panel for informasjonskapsler", 37 | "cookieDetail" : "Informasjon om informasjonskapsler for", 38 | "ourSite" : "på nettstedet vårt", 39 | "newWindow" : "(nytt vindu)", 40 | "allowAll" : "Tillat alle informasjonskapsler", 41 | "denyAll" : "Nekt alle informasjonskapsler", 42 | 43 | "icon": "Cookies", 44 | 45 | "fallback" : "er skrudd av.", 46 | 47 | "ads" : { 48 | "title" : "Annonsenettverk", 49 | "details" : "Annonsenettverket kan generere inntekter ved å selge reklameplass på nettstedet." 50 | }, 51 | "analytic" : { 52 | "title" : "Målgruppe målinger", 53 | "details" : "Målgruppens målingstjenester ble brukt til å generere nyttig informasjon for å forbedre nettstedet." 54 | }, 55 | "social" : { 56 | "title" : "Sosiale nettverk", 57 | "details" : "Sosiale nettverk kan forbedre brukervennligheten til nettstedet og bidra til å markedsføre det." 58 | }, 59 | "video" : { 60 | "title" : "Video", 61 | "details" : "Videodelingstjenester hjelper til med å legge til rik media på nettstedet og øke synligheten." 62 | }, 63 | "comment" : { 64 | "title" : "Kommentarer", 65 | "details" : "Kommentaradministratorer legger til rette for arkivering av kommentarer og bekjemper spam." 66 | }, 67 | "support" : { 68 | "title" : "Brukerstøtte", 69 | "details" : "Brukerstøtte lar deg komme i kontakt med nettstedsteamet og bidra til å forbedre nettstedet." 70 | }, 71 | "api" : { 72 | "title" : "API-er", 73 | "details" : "API-er brukes til å laste inn skript: geolokalisering, søkemotorer, oversettelser, ..." 74 | }, 75 | "other" : { 76 | "title" : "Annet", 77 | "details" : "Tjenester for å vise innhold på nettet." 78 | }, 79 | 80 | "mandatoryTitle" : "Obligatoriske informasjonskapsler", 81 | "mandatoryText" : "Dette nettstedet bruker obligatoriske informasjonskapsler som er nødvendige for at nettstedet skal fungere som det skal. Disse kan ikke deaktiveres." 82 | }; -------------------------------------------------------------------------------- /etc/tarteaucitron/lang/tarteaucitron.oc.js: -------------------------------------------------------------------------------- 1 | /*global tarteaucitron */ 2 | tarteaucitron.lang = { 3 | 4 | "middleBarHead": "☝ 🍪", 5 | "adblock": "Bonjorn! Aqueste site jòga la transparéncia e vos dòna la possibilitat de causir los servicis tèrces a activar.", 6 | "adblock_call": "Mercés de desactivar vòstre adblocker per començar la personalizacion.", 7 | "reload": "Recargar la pagina", 8 | 9 | "alertBigScroll": "En contunhant de desfilar,", 10 | "alertBigClick": "En seguissent vòstra navigacion,", 11 | "alertBig": "acceptatz l'utilizacion de servicis tèrces que pòdon installar de cookies", 12 | 13 | "alertBigPrivacy": "Aqueste site utiliza de cookies e vos dòna lo contraròtle sus çò que volètz activar", 14 | "alertSmall": "Gestion dels servicis", 15 | "acceptAll": "OK, tot acceptar", 16 | "personalize": "Personalizar", 17 | "close": "Tampar", 18 | 19 | "privacyUrl": "Politica de confidencialitat", 20 | 21 | "all": "Preferéncias per totes los servicis", 22 | 23 | "info": "Proteccion de vòstra vida privada", 24 | "disclaimer": "En autorizant aquestes servicis tèrces, acceptatz lo depaus e la lectura de cookies e l'utilizacion de tecnologias de seguiment necessaris a lor bon foncionament.", 25 | "allow": "Autorizar", 26 | "deny": "Interdire", 27 | "noCookie": "Aqueste servici daissa pas cap de cookies.", 28 | "useCookie": "Aqueste servici pòt daissar", 29 | "useCookieCurrent": "Aqueste servici a daissat", 30 | "useNoCookie": "Aqueste servici a pas daissat cap de cookies.", 31 | "more": "Ne saber mai", 32 | "source": "Veire lo site oficial", 33 | "credit": "Gestion dels cookies per tarteaucitron.js", 34 | "noServices": "Aqueste site utiliza pas cap de cookies que demandan vòstre consentiment.", 35 | 36 | "toggleInfoBox": "Mostrar/amagar las informacions sus l'emmagazinatge dels cookies", 37 | "title": "Panèl de gestion dels cookies", 38 | "cookieDetail": "Detalh dels cookies", 39 | "ourSite": "sus nòstre site", 40 | "newWindow": "(novèla fenèstra)", 41 | "allowAll": "Autorizar totes los cookies", 42 | "denyAll": "Interdire totes los cookies", 43 | 44 | "icon": "Cookies", 45 | 46 | "fallback": "es desactivat.", 47 | 48 | "ads": { 49 | "title": "Regias publicitàrias", 50 | "details": "Las regias publicitàrias permeton de gerir de revenguts en comercialisant los espacis publicitaris del site." 51 | }, 52 | "analytic": { 53 | "title": "Mesura d'audiéncia", 54 | "details": "Los servicis de mesura d'audiénce permeton de generar d'estatisticas de frequentacion utilas per melhorar lo site." 55 | }, 56 | "social": { 57 | "title": "Malhums socials", 58 | "details": "Los malhums socials permeton de melhorar la convivéncia del site e d'ajudar sa promocion via los partatges." 59 | }, 60 | "video": { 61 | "title": "Vidèos", 62 | "details": "Los servicis de partatge de vidèo permeton d'enriquir lo site de contengut multimèdia e aumentan sa visibilitat." 63 | }, 64 | "comment": { 65 | "title": "Comentaris", 66 | "details": "Los gestionaris de comentaris facilitan lo depaus de vòstres comentaris e lutan contra los messatges indesirables." 67 | }, 68 | "support": { 69 | "title": "Assiténcia", 70 | "details": "Los servicis d'assisténcia vos permeton de dintrar en contacte amb l'equipa del site e d'ajudar a son melhorament." 71 | }, 72 | "api": { 73 | "title": "APIs", 74 | "details": "Las APIs permeton de cargar de scripts : geolocalizacion, motors de recèrca, traduccions, ..." 75 | }, 76 | "other": { 77 | "title": "Autre", 78 | "details": "Servicis que cèrcan a afichar de contengut web." 79 | }, 80 | 81 | "mandatoryTitle": "Cookies necessaris", 82 | "mandatoryText": "Aqueste site utiliza de cookies necessaris pel seu pròpri foncionament que pòdon pas èsser desactivats." 83 | }; 84 | -------------------------------------------------------------------------------- /etc/tarteaucitron/lang/tarteaucitron.pl.js: -------------------------------------------------------------------------------- 1 | /*global tarteaucitron */ 2 | tarteaucitron.lang = { 3 | "middleBarHead": "☝ 🍪", 4 | "adblock": "Witaj! Ta witryna oferuje daje mozliwość wyboru aktywacji usług zewnętrznych.", 5 | "adblock_call": "Prosze wylaczyc adblocker aby rozpoczac dostosowanie do potrzeb uzytkownika.", 6 | "reload": "Odswież stronę", 7 | 8 | "alertBigScroll": "Poprzez kontynuowanie przewijania,", 9 | "alertBigClick": "Pozostając na tej stronie", 10 | "alertBig": "zgadzasz się na korzystanie ze wszystkich zewnetrzynych usług", 11 | 12 | "alertBigPrivacy": "Ta witryna używa plików cookie i pozwala wybrać na które chcesz zezwolić", 13 | "alertSmall": "Zarządzanie usługami", 14 | "personalize": "Personalizacja", 15 | "acceptAll": "OK, akceptuję wszystko", 16 | "close": "zamknij", 17 | 18 | "privacyUrl": "Polityka prywatności", 19 | 20 | "all": "Preferencja dla wszystkich usług", 21 | 22 | "info": "Ochrona prywatności", 23 | "disclaimer": "Zgadzając się na korzystanie z usług zewnętrznych, akceptujesz ich pliki cookies oraz wykorzystanie technologii śledzących, niezbędnych do ich funkcjonowania.", 24 | "allow": "Zezwalaj", 25 | "deny": "Odmów", 26 | "noCookie": "Ta usługa nie korzysta z plików cookie.", 27 | "useCookie": "Ta usługa może zainstalować pliki cookie", 28 | "useCookieCurrent": "Ta usługa zainstalowała pliki cookie", 29 | "useNoCookie": "Ta usługa nie zainstalowała żadnego pliku cookie.", 30 | "more": "Więcej informacji", 31 | "source": "Zobacz oficjalną stronę internetową", 32 | "credit": "Cookies menadżer od tarteaucitron.js", 33 | 34 | "toggleInfoBox": "Pokaż/ukryj informacje o zapisie plików cookie", 35 | "title": "Panel zarządzania plikami cookies", 36 | "cookieDetail": "Szczegóły plików cookie dla", 37 | "ourSite": "na naszej stronie", 38 | "newWindow": "(nowe okno)", 39 | "allowAll": "Zezwól na wszystkie pliki cookies", 40 | "denyAll": "Zablokuj wszystkie pliki cookies", 41 | 42 | "icon": "Cookies", 43 | 44 | "fallback": "jest nieaktywna.", 45 | 46 | "ads": { 47 | "title": "Sieć reklamowa", 48 | "details": "Sieci reklamowe mogą generować przychody ze sprzedaży powierzchni reklamowej na stronie." 49 | }, 50 | "analytic": { 51 | "title": "Pomiar oglądalności", 52 | "details": "Usługi pomiaru oglądalności wykorzystywane są do generowania przydatnych statystyk potrzebnych w doskonaleniu strony." 53 | }, 54 | "social": { 55 | "title": "Portale społecznościowe", 56 | "details": "Sieci społecznościowe mogą poprawić użyteczność serwisu i pomóc w promocji za pośrednictwem udostępniania strony." 57 | }, 58 | "video": { 59 | "title": "Filmy", 60 | "details": "Usługa udostępniania wideo pomoże dodać multimedia do strony i zwiększyć jej ogladalność." 61 | }, 62 | "comment": { 63 | "title": "Komentarze", 64 | "details": "Zarządzanie komentarzami ułatwia komentowanie i zwalcza spam." 65 | }, 66 | "support": { 67 | "title": "Pomoc", 68 | "details": "Usługa pomocy technicznej pozwala skontaktować się z administratorem witryny i pomaga ją udoskonalić." 69 | }, 70 | "api": { 71 | "title": "APIs", 72 | "details": "APIs służą do ładowania skryptów: geolokalizacji, wyszukiwarek, tłumaczenia, ..." 73 | }, 74 | "other": { 75 | "title": "Inne", 76 | "details": "Usługi do wyświetlania treści internetowych." 77 | }, 78 | 79 | "mandatoryTitle": "Mandatory cookies", 80 | "mandatoryText": "This site uses cookies necessary for its proper functioning which cannot be deactivated." 81 | }; 82 | -------------------------------------------------------------------------------- /etc/tarteaucitron/lang/tarteaucitron.pt.js: -------------------------------------------------------------------------------- 1 | /*global tarteaucitron */ 2 | tarteaucitron.lang = { 3 | "middleBarHead": "☝ 🍪", 4 | "adblock": "Olá! Em uma ação de transparência, este site lhe dá a opção de quais serviços de terceiros deseje ativar.", 5 | "adblock_call": "Por favor, desative seu bloqueador de publicidades para poder personalizar.", 6 | "reload": "Atualizar esta página", 7 | 8 | "alertBigScroll": "Ao continuar a rolar,", 9 | "alertBigClick": "Se você continuar a navegação neste site,", 10 | "alertBig": "você estará aceitando todos os serviços de terceiros", 11 | 12 | "alertBigPrivacy": "Este site utiliza cookies e dá-lhe controle sobre o que quer ativar", 13 | "alertSmall": "Gerenciar serviços", 14 | "personalize": "Personalizar", 15 | "acceptAll": "OK, aceitar tudo", 16 | "close": "Fechar", 17 | 18 | "privacyUrl": "Política de Privacidade", 19 | 20 | "all": "Definições dos serviços", 21 | "info": "Proteger sua privacidade", 22 | "disclaimer": "Ao aceitar os serviços terceiros, você aceita o uso de cookies em conjunto a tecnologias de rastreamento que lhe são necessárias para funcionar", 23 | "allow": "Autorizar", 24 | "deny": "Recusar", 25 | "noCookie": "Este serviço não usa cookies.", 26 | "useCookie": "Este serviço pode instalar", 27 | "useCookieCurrent": "Este serviço instalou", 28 | "useNoCookie": "Este serviço não instalou nenhum cookie.", 29 | "more": "Ler mais", 30 | "source": "Ver o site oficial", 31 | "credit": "Gerenciador de cookies por tarteaucitron.js", 32 | 33 | "toggleInfoBox": "Mostrar/ocultar informações sobre armazenamento de cookies", 34 | "title": "Painel de Gerenciamento de Cookies", 35 | "cookieDetail": "Detalhe do Cookie", 36 | "ourSite": "em nosso site", 37 | "newWindow": "(nova janela)", 38 | "allowAll": "Permite todos os cookies", 39 | "denyAll": "Proibe todos cookies", 40 | 41 | "icon": "Cookies", 42 | 43 | "fallback": "está desativado.", 44 | "ads": { 45 | "title": "Rede de anúncios", 46 | "details": "As redes de anúncios podem gerar receitas com a venda de espaço publicitário no site." 47 | }, 48 | "analytic": { 49 | "title": "Medição de audiência", 50 | "details": "Serviços de medição de audiência usados para gerar estatísticas no intuito de melhorar o site." 51 | }, 52 | "social": { 53 | "title": "Rede sociais", 54 | "details": "Rede sociais podem ameliorar o utilização do site e ajudar a promove-lo via compartilhamentos." 55 | }, 56 | "video": { 57 | "title": "Vídeos", 58 | "details": "Serviços de compartilhamento de vídeo adicionam medias no site a aumentam sua visibilidade." 59 | }, 60 | "comment": { 61 | "title": "Comentários", 62 | "details": "Gerenciadores de comentários facilitam o sistema de comentários e lutam contra o spam." 63 | }, 64 | "support": { 65 | "title": "Suporte", 66 | "details": "Serviços de suporte lhe ajudam a entrar em contato com a equipe de suporte." 67 | }, 68 | "api": { 69 | "title": "APIs", 70 | "details": "APIs são usadas para carregar scripts: geolocalização, motores de pesquisa, traduções, ..." 71 | }, 72 | "other": { 73 | "title": "De outros", 74 | "details": "Serviços para exibir conteúdo da web." 75 | }, 76 | 77 | "mandatoryTitle": "Mandatory cookies", 78 | "mandatoryText": "This site uses cookies necessary for its proper functioning which cannot be deactivated." 79 | }; 80 | -------------------------------------------------------------------------------- /etc/tarteaucitron/lang/tarteaucitron.ro.js: -------------------------------------------------------------------------------- 1 | /*global tarteaucitron */ 2 | tarteaucitron.lang = { 3 | "middleBarHead": "☝ 🍪", 4 | "adblock": "Buna! Acest site este transparent și vă permite să alegeți serviciile terță parte pe care doriți să le permiteți.", 5 | "adblock_call": "Dezactivați-vă adblocker-ul pentru a începe personalizarea.", 6 | "reload": "Reincarca Pagina", 7 | 8 | "alertBigScroll": "Continuând să defilați,", 9 | "alertBigClick": "Dacă continuați să răsfoiți acest site,", 10 | "alertBig": "permiteți tuturor serviciilor terță parte", 11 | 12 | "alertBigPrivacy": "Acest site utilizează cookie-uri și vă oferă control asupra a ceea ce doriți să activați", 13 | "alertSmall": "Gestionați serviciile", 14 | "personalize": "Personalizați", 15 | "acceptAll": "OK, acceptați-le pe toate", 16 | "close": "Închide", 17 | 18 | "privacyUrl": "Politica de confidentialitate", 19 | 20 | "all": "Preferință pentru toate serviciile", 21 | 22 | "info": "Protejați-vă confidențialitatea", 23 | "disclaimer": "Permițând acestor servicii terțe părți să acceptați cookie-urile și utilizarea tehnologiilor de urmărire necesare pentru buna funcționare a acestora.", 24 | "allow": "Permite", 25 | "deny": "Refuza", 26 | "noCookie": "Acest serviciu nu utilizează modul cookie.", 27 | "useCookie": "Acest serviciu se poate instala", 28 | "useCookieCurrent": "Acest serviciu a fost instalat", 29 | "useNoCookie": "Acest serviciu nu a instalat niciun cookie.", 30 | "more": "Citeste mai mult", 31 | "source": "Vizualizați site-ul oficial", 32 | "credit": "Cookie manager de către tarteaucitron.js", 33 | 34 | "toggleInfoBox": "Afișați / ascundeți informații despre stocarea modulelor cookie", 35 | "title": "Panoul de gestionare a panourilor cookie", 36 | "cookieDetail": "Detaliile cookie pentru", 37 | "ourSite": "pe site-ul nostru", 38 | "newWindow": "(fereastră nouă)", 39 | "allowAll": "Permiteți toate cookie-urile", 40 | "denyAll": "Respinge toate cookie-urile", 41 | 42 | "icon": "Cookies", 43 | 44 | "fallback": "este dezactivat.", 45 | 46 | "ads": { 47 | "title": "Rețea de publicitate", 48 | "details": "Rețelele publicitare pot genera venituri prin vânzarea de spațiu publicitar pe site." 49 | }, 50 | "analytic": { 51 | "title": "Măsurarea audienței", 52 | "details": "Serviciile de măsurare a audienței utilizate pentru a genera participarea la statistici utile pentru îmbunătățirea site-ului." 53 | }, 54 | "social": { 55 | "title": "Retele sociale", 56 | "details": "Rețelele sociale pot îmbunătăți gradul de utilizare a site-ului și pot ajuta să îl promoveze prin intermediul acțiunilor." 57 | }, 58 | "video": { 59 | "title": "Videoclipuri", 60 | "details": "Serviciile de partajare video ajută la adăugarea de materiale media pe site și la creșterea vizibilității acestora." 61 | }, 62 | "comment": { 63 | "title": "Comentarii", 64 | "details": "Managerii de comentarii facilitează depunerea de comentarii și lupta împotriva spamului." 65 | }, 66 | "support": { 67 | "title": "Susţinere", 68 | "details": "Serviciile de asistență vă permit să contactați echipa site-ului și să vă ajutați să îl îmbunătățiți." 69 | }, 70 | "api": { 71 | "title": "APIs", 72 | "details": "API-urile sunt folosite pentru a încărca scripturi: geolocație, motoare de căutare, traduceri, ..." 73 | }, 74 | "other": { 75 | "title": "Alte", 76 | "details": "Servicii pentru afișarea conținutului web." 77 | }, 78 | 79 | "mandatoryTitle": "Mandatory cookies", 80 | "mandatoryText": "This site uses cookies necessary for its proper functioning which cannot be deactivated." 81 | }; 82 | -------------------------------------------------------------------------------- /etc/tarteaucitron/lang/tarteaucitron.ru.js: -------------------------------------------------------------------------------- 1 | /*global tarteaucitron */ 2 | tarteaucitron.lang = { 3 | "middleBarHead": "☝ 🍪", 4 | "adblock": "Привет! Этот сайт совершенно открытый и позволяет вам выбрать сервисы третьих лиц, которым вы хотите дать доступ.", 5 | "adblock_call": "Пожалуйста дезактивируйте АдБлокер чтобы начать настройку.", 6 | "reload": "Перезагрузите страницу", 7 | 8 | "alertBigScroll": "Продолжая прокрутки", 9 | "alertBigClick": "Если вы продолжаете использовать сайт", 10 | "alertBig": "вы позволяете сервисы третьих лиц", 11 | 12 | "alertBigPrivacy": "Этот сайт использует кукис и позволяет вам контролировать сервисы которые вы хотите активировать", 13 | "alertSmall": "Настройка сервисов", 14 | "personalize": "Персонализировать", 15 | "acceptAll": "Ок, все активировать", 16 | "close": "Закрыть", 17 | 18 | "privacyUrl": "Политика конфиденциальности", 19 | 20 | "all": "Преференция всем сервисам", 21 | 22 | "info": "Защитить вашу конфиденциальность", 23 | "disclaimer": "Активирование сервисов третьих лиц позволяет использование их кукис и технолоний отслеживания необходимых для их функционирования", 24 | "allow": "Позволить", 25 | "deny": "Не позволить", 26 | "noCookie": "Этот сервис не использует кукис.", 27 | "useCookie": "Этот сервис может быть инсталирован", 28 | "useCookieCurrent": "Этот сервис инсталирован", 29 | "useNoCookie": "Этот сервис не использует кукис.", 30 | "more": "Подробнее", 31 | "source": "Посетите официальный сайт", 32 | "credit": "Кукис манаджер tarteaucitron.js", 33 | 34 | "toggleInfoBox": "Show/hide informations about cookie storage", 35 | "title": "Панель управления cookies", 36 | "cookieDetail": "Cookie detail for", 37 | "ourSite": "on our site", 38 | "newWindow": "(new window)", 39 | "allowAll": "Разрешить использование cookies", 40 | "denyAll": "Запретить использование cookies", 41 | 42 | "icon": "Cookies", 43 | 44 | 45 | "fallback": "Деактивирован.", 46 | 47 | "ads": { 48 | "title": "Рекламная сеть", 49 | "details": "Мы позволяем вам аренду нашей рекламной сети." 50 | }, 51 | "analytic": { 52 | "title": "Измерение аудиенции", 53 | "details": "Измерение аудиенции сайта для статистики помогают улучшить предлагаемый сервис." 54 | }, 55 | "social": { 56 | "title": "Социальная сеть", 57 | "details": "Социальная сеть сайтов помогает улучшить предлагаемый сервис через обмен информации." 58 | }, 59 | "video": { 60 | "title": "Видео", 61 | "details": "Обмен видео информации позволяет улучшить сервис и увеличит траффик сайта." 62 | }, 63 | "comment": { 64 | "title": "Комментарии", 65 | "details": "Манаджер комментариев позволяет обмен информации и борьбу со спамом." 66 | }, 67 | "support": { 68 | "title": "Помощь", 69 | "details": "Помощь позволяет вам контактировать напрямую сайт манаджер и улучшить предлагаемый сервис." 70 | }, 71 | "api": { 72 | "title": "АПИ", 73 | "details": "АПИ используются для загрузки скриптов; геолокация, поисковый мотор и переводы..." 74 | }, 75 | "other": { 76 | "title": "Другие", 77 | "details": "Службы для отображения веб-контента." 78 | }, 79 | 80 | "mandatoryTitle": "Mandatory cookies", 81 | "mandatoryText": "This site uses cookies necessary for its proper functioning which cannot be deactivated." 82 | }; 83 | -------------------------------------------------------------------------------- /etc/tarteaucitron/lang/tarteaucitron.se.js: -------------------------------------------------------------------------------- 1 | /*global tarteaucitron */ 2 | tarteaucitron.lang = { 3 | "middleBarHead": "☝ 🍪", 4 | "adblock": "Hej! Denna webbplats är transparent och låter dig välja de tredjeparts tjänster du vill tillåta.", 5 | "adblock_call": "Inaktivera din adblock för att börja anpassa.", 6 | "reload": "Uppdatera sidan", 7 | 8 | "alertBigScroll": "Genom att fortsätta rulla,", 9 | "alertBigClick": "Om du fortsätter att surfa på denna webbplats,", 10 | "alertBig": "du tillåter alla tjänster från tredje part", 11 | 12 | "alertBigPrivacy": "Denna webbplats använder cookies och ger dig kontroll över vad du vill aktivera", 13 | "alertSmall": "Hantera tjänster", 14 | "personalize": "Personifiera", 15 | "acceptAll": "OK, acceptera allt", 16 | "close": "Stänga", 17 | 18 | "privacyUrl": "Integritetspolicy", 19 | 20 | "all": "Preferens för alla tjänster", 21 | 22 | "info": "Skydda din integritet", 23 | "disclaimer": "Genom att tillåta dessa tjänster från tredje part accepterar du deras cookies och användningen av spårningsteknologier som är nödvändiga för att de ska fungera korrekt.", 24 | "allow": "Tillåta", 25 | "deny": "Förneka", 26 | "noCookie": "Den här tjänsten använder inte cookie.", 27 | "useCookie": "Den här tjänsten kan installeras", 28 | "useCookieCurrent": "Den här tjänsten har installerats", 29 | "useNoCookie": "Den här tjänsten har inte installerat någon cookie.", 30 | "more": "Läs mer", 31 | "source": "Visa den officiella webbplatsen", 32 | "credit": "Cookies manager av tarteaucitron.js", 33 | 34 | "toggleInfoBox": "Visa / dölj information om lagring av cookies", 35 | "title": "Cookie- hanteringspanel", 36 | "cookieDetail": "cookie- detalj för", 37 | "ourSite": "på vår webbplats", 38 | "newWindow": "(nytt fönster)", 39 | "allowAll": "Tillåt alla cookie", 40 | "denyAll": "Neka alla cookies", 41 | 42 | "icon": "Cookies", 43 | 44 | "fallback": "är ur funktion.", 45 | 46 | "ads": { 47 | "title": "Annonsnätverk", 48 | "details": "Annonsnätverk kan generera intäkter genom att sälja annonsutrymme på webbplatsen." 49 | }, 50 | "analytic": { 51 | "title": "Publikmätning", 52 | "details": "Publikmätningstjänster som används för att generera användbar statistik närvaro för att förbättra webbplatsen." 53 | }, 54 | 55 | "social": { 56 | "title": "Sociala nätverk", 57 | "details": "Sociala nätverk kan förbättra användbarheten på webbplatsen och bidra till att marknadsföra den via aktierna." 58 | }, 59 | "video": { 60 | "title": "videoklipp", 61 | "details": "Videodelningstjänster hjälper till att lägga till rika medier på webbplatsen och öka synligheten." 62 | }, 63 | "comment": { 64 | "title": "Коментари", 65 | "details": "Kommentarhanterare underlättar inlämning av kommentarer och bekämpar skräppost." 66 | }, 67 | "support": { 68 | "title": "Stöd", 69 | "details": "Supporttjänster gör att du kan komma i kontakt med webbplatsteamet och hjälpa dig att förbättra det." 70 | }, 71 | "api": { 72 | "title": "APIs", 73 | "details": "APIs: er används för att ladda skript: geolocation, sökmotorer, översättningar, ..." 74 | }, 75 | "other": { 76 | "title": "Övrig", 77 | "details": "Tjänster för att visa webbinnehåll." 78 | }, 79 | 80 | "mandatoryTitle": "Mandatory cookies", 81 | "mandatoryText": "This site uses cookies necessary for its proper functioning which cannot be deactivated." 82 | }; 83 | -------------------------------------------------------------------------------- /etc/tarteaucitron/lang/tarteaucitron.sk.js: -------------------------------------------------------------------------------- 1 | /*global tarteaucitron */ 2 | tarteaucitron.lang = { 3 | "middleBarHead": "☝ 🍪", 4 | "adblock": "Ahoj! Táto stránka je transparentná a umožňuje vám vybrať služby tretích strán, ktoré chcete povoliť.", 5 | "adblock_call": "Prosím, vypnite blokovanie reklám k začatiu prispôsobovania", 6 | "reload": "Obnovte stránku", 7 | 8 | "alertBigScroll": "Pokračovaním v posúvaní,", 9 | "alertBigClick": "Ak budete pokračovať v prehliadaní tejto webovej stránky,", 10 | "alertBig": "povoľujete všetky služby tretích strán", 11 | 12 | "alertBigPrivacy": "Táto stránka používa cookies a dáva vám kontrolu nad tým, čo chcete aktivovať", 13 | "alertSmall": "Spravovať služby", 14 | "personalize": "Prispôsobiť", 15 | "acceptAll": "OK, prijať všetko", 16 | "close": "Zatvoriť", 17 | 18 | "privacyUrl": "Zásady ochrany osobných údajov", 19 | 20 | "all": "Prednosť pre všetky služby", 21 | 22 | "info": "Ochrana vášho súkromia", 23 | "disclaimer": "Povolením týchto služieb tretích strán, prijímate ich cookies a používanie sledovacích technológií potrebných pre ich správne fungovanie.", 24 | "allow": "Povoliť", 25 | "deny": "Odmietnúť", 26 | "noCookie": "Táto služba nepoužíva cookies.", 27 | "useCookie": "Túto službu je možné nainštalovať", 28 | "useCookieCurrent": "Táto služba je nainštalovaná", 29 | "useNoCookie": "Táto služba nenainštalovala žiadny súbor cookie.", 30 | "more": "Čítaj viac", 31 | "source": "Pozrite si oficiálnu webovú stránku", 32 | "credit": "Správca súborov cookie od tarteaucitron.js", 33 | "noServices": "Táto webová stránka nepoužíva žiadny súbor cookie, ktorý vyžaduje váš súhlas.", 34 | 35 | "toggleInfoBox": "Zobraziť/skryť informácie o ukladaní súborov cookie", 36 | "title": "Panel riadenia súborov cookie", 37 | "cookieDetail": "Podrobnosti súboru cookie pre", 38 | "ourSite": "na našich stránkach", 39 | "newWindow": "(nové okno)", 40 | "allowAll": "Povoľte všetky súbory cookie", 41 | "denyAll": "Odmietnuť všetky súbory cookie", 42 | 43 | "icon": "Cookies", 44 | 45 | "fallback": "je zakázané.", 46 | 47 | "ads": { 48 | "title": "Reklamná sieť", 49 | "details": "Reklamné siete môžu generovať príjmy predajom reklamného priestoru na webe." 50 | }, 51 | "analytic": { 52 | "title": "Meranie publika", 53 | "details": "Služby merania publika používané na generovanie užitočnej štatistickej účasti na zlepšenie stránky." 54 | }, 55 | "social": { 56 | "title": "Sociálne siete", 57 | "details": "Sociálne siete môžu zlepšiť použiteľnosť stránky a pomôcť ju propagovať prostredníctvom akcií." 58 | }, 59 | "video": { 60 | "title": "Videá", 61 | "details": "Služby zdieľania videa pomáhajú pridať na web bohatý obsah a zvýšiť jeho viditeľnosť." 62 | }, 63 | "comment": { 64 | "title": "Komentáre", 65 | "details": "Manažéri komentárov uľahčujú zadávanie komentárov a bojujú proti spamu." 66 | }, 67 | "support": { 68 | "title": "Podpora", 69 | "details": "Podporné služby vám umožňujú skontaktovať sa s tímom stránok a pomôcť vám ich vylepšiť." 70 | }, 71 | "api": { 72 | "title": "APIs", 73 | "details": "Rozhrania API sa používajú na načítanie skriptov: geolokácia, vyhľadávače, preklady, ..." 74 | }, 75 | "other": { 76 | "title": "Ostatné", 77 | "details": "Služby na zobrazovanie webového obsahu." 78 | }, 79 | 80 | "mandatoryTitle": "Mandatory cookies", 81 | "mandatoryText": "This site uses cookies necessary for its proper functioning which cannot be deactivated." 82 | }; 83 | -------------------------------------------------------------------------------- /etc/tarteaucitron/lang/tarteaucitron.sv.js: -------------------------------------------------------------------------------- 1 | /*global tarteaucitron */ 2 | tarteaucitron.lang = { 3 | "middleBarHead": "☝ 🍪", 4 | "adblock": "Hej! Denna webbplats är transparent och låter dig välja de tredjeparts tjänster du vill tillåta.", 5 | "adblock_call": "Inaktivera din adblock för att börja anpassa.", 6 | "reload": "Uppdatera sidan", 7 | 8 | "alertBigScroll": "Genom att fortsätta rulla,", 9 | "alertBigClick": "Om du fortsätter att surfa på denna webbplats,", 10 | "alertBig": "du tillåter alla tjänster från tredje part", 11 | 12 | "alertBigPrivacy": "Denna webbplats använder cookies och ger dig kontroll över vad du vill aktivera", 13 | "alertSmall": "Hantera tjänster", 14 | "personalize": "Personifiera", 15 | "acceptAll": "OK, acceptera allt", 16 | "close": "Stänga", 17 | 18 | "privacyUrl": "Integritetspolicy", 19 | 20 | "all": "Preferens för alla tjänster", 21 | 22 | "info": "Skydda din integritet", 23 | "disclaimer": "Genom att tillåta dessa tjänster från tredje part accepterar du deras cookies och användningen av spårningsteknologier som är nödvändiga för att de ska fungera korrekt.", 24 | "allow": "Tillåta", 25 | "deny": "Förneka", 26 | "noCookie": "Den här tjänsten använder inte cookie.", 27 | "useCookie": "Den här tjänsten kan installeras", 28 | "useCookieCurrent": "Den här tjänsten har installerats", 29 | "useNoCookie": "Den här tjänsten har inte installerat någon cookie.", 30 | "more": "Läs mer", 31 | "source": "Visa den officiella webbplatsen", 32 | "credit": "Cookies manager av tarteaucitron.js", 33 | 34 | "toggleInfoBox": "Visa / dölj information om lagring av cookies", 35 | "title": "Cookie- hanteringspanel", 36 | "cookieDetail": "cookie- detalj för", 37 | "ourSite": "på vår webbplats", 38 | "newWindow": "(nytt fönster)", 39 | "allowAll": "Tillåt alla cookie", 40 | "denyAll": "Neka alla cookies", 41 | 42 | "icon": "Cookies", 43 | 44 | "fallback": "är ur funktion.", 45 | 46 | "ads": { 47 | "title": "Annonsnätverk", 48 | "details": "Annonsnätverk kan generera intäkter genom att sälja annonsutrymme på webbplatsen." 49 | }, 50 | "analytic": { 51 | "title": "Publikmätning", 52 | "details": "Publikmätningstjänster som används för att generera användbar statistik närvaro för att förbättra webbplatsen." 53 | }, 54 | 55 | "social": { 56 | "title": "Sociala nätverk", 57 | "details": "Sociala nätverk kan förbättra användbarheten på webbplatsen och bidra till att marknadsföra den via aktierna." 58 | }, 59 | "video": { 60 | "title": "videoklipp", 61 | "details": "Videodelningstjänster hjälper till att lägga till rika medier på webbplatsen och öka synligheten." 62 | }, 63 | "comment": { 64 | "title": "Коментари", 65 | "details": "Kommentarhanterare underlättar inlämning av kommentarer och bekämpar skräppost." 66 | }, 67 | "support": { 68 | "title": "Stöd", 69 | "details": "Supporttjänster gör att du kan komma i kontakt med webbplatsteamet och hjälpa dig att förbättra det." 70 | }, 71 | "api": { 72 | "title": "APIs", 73 | "details": "APIs: er används för att ladda skript: geolocation, sökmotorer, översättningar, ..." 74 | }, 75 | "other": { 76 | "title": "Övrig", 77 | "details": "Tjänster för att visa webbinnehåll." 78 | }, 79 | 80 | "mandatoryTitle": "Mandatory cookies", 81 | "mandatoryText": "This site uses cookies necessary for its proper functioning which cannot be deactivated." 82 | }; 83 | -------------------------------------------------------------------------------- /etc/tarteaucitron/lang/tarteaucitron.tr.js: -------------------------------------------------------------------------------- 1 | /*global tarteaucitron */ 2 | tarteaucitron.lang = { 3 | 4 | "middleBarHead": "☝ 🍪", 5 | "adblock": "Merhaba! Bu site şeffaflıkla oynar ve size etkinleştirilecek üçüncü taraf hizmetleri seçeneği sunar.", 6 | "adblock_call": "Kişiselleştirmeye başlamak için lütfen reklam engelleyicinizi devre dışı bırakın.", 7 | "reload": "Sayfayı yeniden yükle", 8 | 9 | "alertBigScroll": "Kaydırma devam edien,", 10 | "alertBigClick": "Navigasyonunuza devam ederek,", 11 | "alertBig": "çerez yükleyebilecek üçüncü taraf hizmetlerinin kullanımını kabul edersiniz", 12 | 13 | "alertBigPrivacy": "Bu site çerezleri kullanır ve etkinleştirmek istediklerinizi kontrol etmenizi sağlar", 14 | "alertSmall": "Hizmet yönetimi", 15 | "acceptAll": "evet, her şeyi kabul edin", 16 | "personalize": "kişiselleştirmek", 17 | "close": "kapat", 18 | 19 | "privacyUrl": "Gizlilik Politikası", 20 | 21 | "all": "Tüm hizmetler için tercihler", 22 | 23 | "info": "Gizliliğinin korunması", 24 | "disclaimer": "Bu üçüncü taraf hizmetlerini yetkilendirerek, çerezlerin depolanmasını ve okunmasını ve düzgün çalışması için gerekli izleme teknolojilerinin kullanımını kabul ediyorsunuz.", 25 | "allow": "izin", 26 | "deny": "yasak", 27 | "noCookie": "Bu hizmet çerez yerleştirmez.", 28 | "useCookie": "Bu hizmet para yatırabilir", 29 | "useCookieCurrent": "Bu hizmet sunuldu", 30 | "useNoCookie": "Bu hizmet herhangi bir çerez yerleştirmedi.", 31 | "more": "Daha fazlasını öğrenin", 32 | "source": "web sitesine bakın", 33 | "credit": "Çerez yönetimi tarteaucitron.js", 34 | "noServices": "Bu site, onayınızı gerektiren hiçbir çerez kullanmıyor.", 35 | 36 | "toggleInfoBox": "Çerezlerin depolanmasıyla ilgili bilgileri göster / gizle", 37 | "title": "Çerez yönetimi paneli", 38 | "cookieDetail": "Ayrıntı çerezleri", 39 | "ourSite": "sitemizde", 40 | "newWindow": "(yeni pencere)", 41 | "allowAll": "Tüm çerezlere izin verin", 42 | "denyAll": "Tüm çerezleri yasaklayın", 43 | 44 | "icon": "Cookies", 45 | 46 | "fallback": "devre dışı.", 47 | 48 | "ads": { 49 | "title": "Reklam yönetimi", 50 | "details": "Reklam ajansları, sitedeki reklam alanını pazarlayarak gelir elde etmenizi sağlar." 51 | }, 52 | "analytic": { 53 | "title": "Kitle ölçümü", 54 | "details": "Kitle ölçüm hizmetleri, siteyi geliştirmek için yararlı katılım istatistikleri oluşturur." 55 | }, 56 | "social": { 57 | "title": "Sosyal Medya", 58 | "details": "Sosyal ağlar sitenin kullanım kolaylığını geliştirir ve paylaşım yoluyla sitenin tanıtımına yardımcı olur." 59 | }, 60 | "video": { 61 | "title": "Videolar", 62 | "details": "Video paylaşım hizmetleri siteyi multimedya içeriğiyle zenginleştirir ve görünürlüğünü artırır.\n" + 63 | "\n" 64 | }, 65 | "comment": { 66 | "title": "yorumlar\n", 67 | "details": "Yorum yöneticileri yorumlarınızın gönderilmesini kolaylaştırır ve spam ile mücadele eder.", 68 | }, 69 | "support": { 70 | "title": "destek", 71 | "details": "Destek hizmetleri, site ekibiyle iletişim kurmanıza ve ekibinizi geliştirmenize yardımcı olur.\n" + 72 | "\n" 73 | }, 74 | "api": { 75 | "title": "APIs", 76 | "details": "APIs komut dosyalarının yüklenmesine izin verir: coğrafi konum, arama motorları, çeviriler, ..." 77 | }, 78 | "other": { 79 | "title": "diğer\n", 80 | "details": "Web içeriğini görüntüleme hizmetleri." 81 | }, 82 | 83 | "mandatoryTitle": "Mandatory cookies", 84 | "mandatoryText": "This site uses cookies necessary for its proper functioning which cannot be deactivated." 85 | }; 86 | -------------------------------------------------------------------------------- /etc/tarteaucitron/lang/tarteaucitron.vi.js: -------------------------------------------------------------------------------- 1 | /*global tarteaucitron */ 2 | tarteaucitron.lang = { 3 | "middleBarHead": "☝ 🍪", 4 | "adblock": "Xin chào! Trang web này minh bạch và cho phép bạn chọn dịch vụ bên thứ 3 mà bạn muốn cho phép.", 5 | "adblock_call": "Vui lòng vô hiệu hóa trình chặn quảng cáo của bạn để bắt đầu tùy chỉnh.", 6 | "reload": "Làm mới trang", 7 | 8 | "alertBigScroll": "tiếp tục cuộn,", 9 | "alertBigClick": "Nếu bạn tiếp tục truy cập trang web này,", 10 | "alertBig": "bạn đang cho phép tất cả các dịch vụ của bên thứ ba", 11 | 12 | "alertBigPrivacy": "Trang web này sử dụng cookie và cung cấp cho bạn quyền kiểm soát những gì bạn muốn kích hoạt", 13 | "alertSmall": "Quản lý dịch vụ", 14 | "acceptAll": "OK, đồng ý", 15 | "personalize": "Cá nhân", 16 | "close": "Đóng", 17 | 18 | "privacyUrl": "Chính sách bảo mật", 19 | 20 | "all": "Ưu tiên cho tất cả các dịch vụ", 21 | 22 | "info": "Bảo vệ sự riêng tư của bạn", 23 | "disclaimer": "Bằng cách cho phép các dịch vụ bên thứ ba này, bạn chấp nhận cookie của họ và sử dụng các công nghệ theo dõi cần thiết cho hoạt động đúng đắn của họ.", 24 | "allow": "Cho phép", 25 | "deny": "Từ chối", 26 | "noCookie": "Dịch vụ này không sử dụng cookie.", 27 | "useCookie": "Dịch vụ này có thể cài đặt", 28 | "useCookieCurrent": "Dịch vụ này đã được cài đặt", 29 | "useNoCookie": "Dịch vụ này không được cài đặt bất cứ cookie nào.", 30 | "more": "Xem thêm", 31 | "source": "Xam trang web chính thức", 32 | "credit": "Cookies được quản lý bằng tarteaucitron.js", 33 | "noServices": "Trang web này không sử dụng bất kì cookie nào yêu cầu sự chấp thuận của bạn.", 34 | 35 | "toggleInfoBox": "Hiển thị / ẩn thông tin về lưu trữ cookie", 36 | "title": "Bảng quản lý cookie", 37 | "cookieDetail": "Cookie chi tiết", 38 | "ourSite": "trên site của chúng ta", 39 | "newWindow": "(Cửa sổ mới)", 40 | "allowAll": "Cho phép tất cả các Cookies", 41 | "denyAll": "Từ chối cất cả cookies", 42 | 43 | "icon": "Cookies", 44 | 45 | "fallback": "tắt.", 46 | 47 | "ads": { 48 | "title": "Mạng quảng cáo", 49 | "details": "Mạng quảng cáo có thể tạo doanh thu bằng cách bán không gian quảng cáo trên trang web." 50 | }, 51 | "analytic": { 52 | "title": "Đo lường hành vi người dùng", 53 | "details": "Công cụ đo lường hành vi người dùng cập nhật những thống kê hữu ích nhằm nâng cao chất lượng phục vụ của website." 54 | }, 55 | "social": { 56 | "title": "Các mạng xã hội", 57 | "details": "Mạng xã hội có thể cải thiện khả năng sử dụng của trang web và giúp quảng bá nó thông qua các chia sẻ." 58 | }, 59 | "video": { 60 | "title": "Các video", 61 | "details": "Dịch vụ chia sẻ video giúp thêm phương tiện phong phú trên trang web và tăng khả năng hiển thị của nó." 62 | }, 63 | "comment": { 64 | "title": "Bình luận", 65 | "details": "Quản lý comments tạo điều kiện cho việc gửi ý kiến và chống thư rác." 66 | }, 67 | "support": { 68 | "title": "Hỗ trợ", 69 | "details": "Các dịch vụ hỗ trợ cho phép bạn liên lạc với nhóm trang web và giúp cải thiện nó." 70 | }, 71 | "api": { 72 | "title": "APIs", 73 | "details": "APIs được sử dụng để load: geolocation, search engines, translations, ..." 74 | }, 75 | "other": { 76 | "title": "Dịch vụ khác", 77 | "details": "Dịch vụ hiển thị nội dung web." 78 | }, 79 | 80 | "mandatoryTitle": "Mandatory cookies", 81 | "mandatoryText": "This site uses cookies necessary for its proper functioning which cannot be deactivated." 82 | }; 83 | -------------------------------------------------------------------------------- /etc/tarteaucitron/lang/tarteaucitron.zh.js: -------------------------------------------------------------------------------- 1 | /*global tarteaucitron */ 2 | tarteaucitron.lang = { 3 | "adblock": "您好!这是一个透明的网站,您可以选择激活不同的第三方服务。", 4 | "adblock_call": "感谢您停用广告拦截功能并开始个性化设置。", 5 | "reload": "重新加载页面", 6 | 7 | "alertBigScroll": "继续划屏,", 8 | "alertBigClick": "继续浏览,", 9 | "alertBig": "即表示您同意第三方服务安装cookie", 10 | 11 | "alertBigPrivacy": "这个网站使用cookie, 并让您可以控制想要激活的内容。", 12 | "alertSmall": "服务管理", 13 | "acceptAll": "好的,全部接受", 14 | "personalize": "个性化", 15 | "close": "关闭", 16 | 17 | "privacyUrl": "保密政策", 18 | 19 | "all": "所有服务的偏好设置", 20 | 21 | "disclaimer": "通过授权这些第三方服务,您同意存储和读取cookie,并使用其正常运行所需的跟踪技术。", 22 | "allow": "允许", 23 | "deny": "禁用", 24 | "noCookie": "此服务不存储任何cookie。", 25 | "useCookie": "此服务可以存储", 26 | "useCookieCurrent": "此服务已存储", 27 | "useNoCookie": "此服务未存储任何cookie。", 28 | "more": "了解更多", 29 | "source": "查看官网", 30 | "credit": "通过tarteaucitron.js管理cookie", 31 | 32 | "toggleInfoBox": "显示/隐藏cookie存储信息。", 33 | "title": "Cookie管理面板", 34 | "cookieDetail": "Cookie详情", 35 | "ourSite": "显示在我们的网站上", 36 | "newWindow": "(新建窗口)", 37 | "allowAll": "允许", 38 | "denyAll": "禁用", 39 | 40 | "icon": "Cookies", 41 | 42 | "fallback": "已禁用。", 43 | 44 | "ads": { 45 | "title": "广告组", 46 | "details": "广告组通过营销网站上的广告空间来产生收入." 47 | }, 48 | "analytic": { 49 | "title": "受众测量", 50 | "details": "受众测量服务可以生成对站点改进有用的访问统计数据。" 51 | }, 52 | "social": { 53 | "title": "社交网络", 54 | "details": "社交网络有助于提高网站的用户友好性,并通过分享帮助推广。" 55 | }, 56 | "video": { 57 | "title": "视频", 58 | "details": "视频共享服务丰富网站的多媒体内容,提高网站知名度。" 59 | }, 60 | "comment": { 61 | "title": "评论", 62 | "details": "评论管理器使您的评论更容易提交,并避免垃圾邮件。" 63 | }, 64 | "support": { 65 | "title": "支持", 66 | "details": "支持服务使您能够与网站团队联系并帮助改进网站." 67 | }, 68 | "api": { 69 | "title": "API", 70 | "details": "API允许加载脚本:地理位置、搜索引擎、翻译……" 71 | }, 72 | "other": { 73 | "title": "其他", 74 | "details": "旨在显示网页内容的服务。" 75 | }, 76 | 77 | "mandatoryTitle": "Mandatory cookies", 78 | "mandatoryText": "This site uses cookies necessary for its proper functioning which cannot be deactivated." 79 | }; 80 | -------------------------------------------------------------------------------- /etc/tarteaucitron/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "tarteaucitronjs", 3 | "version": "1.9.0", 4 | "description": "Comply to the European cookie law", 5 | "dependencies": {}, 6 | "devDependencies": {}, 7 | "scripts": { 8 | "test": "echo \"Error: no test specified\" && exit 1" 9 | }, 10 | "repository": { 11 | "type": "git", 12 | "url": "git+https://github.com/AmauriC/tarteaucitron.js.git" 13 | }, 14 | "keywords": [ 15 | "cookie", 16 | "law", 17 | "rgpd", 18 | "gdpr", 19 | "cookie" 20 | ], 21 | "author": "Amauri.IO", 22 | "license": "MIT", 23 | "bugs": { 24 | "url": "https://github.com/AmauriC/tarteaucitron.js/issues" 25 | }, 26 | "homepage": "https://github.com/AmauriC/tarteaucitron.js#readme" 27 | } 28 | -------------------------------------------------------------------------------- /etc/tarteaucitron_init.js: -------------------------------------------------------------------------------- 1 | tarteaucitron.init({ 2 | "privacyUrl": "https://github.com/metaflow/apex-recoil/blob/main/docs/privacy-policy.md", /* Privacy policy url */ 3 | 4 | "hashtag": "#cookies", /* Open the panel with this hashtag */ 5 | "cookieName": "tarteaucitron", /* Cookie name */ 6 | 7 | "orientation": "bottom", /* Banner position (top - bottom - middle - popup) */ 8 | 9 | "groupServices": false, /* Group services by category */ 10 | 11 | "showAlertSmall": false, /* Show the small banner on bottom right */ 12 | "cookieslist": false, /* Show the cookie list */ 13 | 14 | "showIcon": false, /* Show cookie icon to manage cookies */ 15 | // "iconSrc": "", /* Optionnal: URL or base64 encoded image */ 16 | "iconPosition": "BottomRight", /* Position of the icon between BottomRight, BottomLeft, TopRight and TopLeft */ 17 | 18 | "adblocker": false, /* Show a Warning if an adblocker is detected */ 19 | 20 | "DenyAllCta" : true, /* Show the deny all button */ 21 | "AcceptAllCta" : true, /* Show the accept all button when highPrivacy on */ 22 | "highPrivacy": true, /* HIGHLY RECOMMANDED Disable auto consent */ 23 | 24 | "handleBrowserDNTRequest": false, /* If Do Not Track == 1, disallow all */ 25 | 26 | "removeCredit": false, /* Remove credit link */ 27 | "moreInfoLink": true, /* Show more info link */ 28 | "useExternalCss": false, /* If false, the tarteaucitron.css file will be loaded */ 29 | 30 | //"cookieDomain": ".my-multisite-domaine.fr", /* Shared cookie for subdomain website */ 31 | 32 | "readmoreLink": "", /* Change the default readmore link pointing to tarteaucitron.io */ 33 | 34 | "mandatory": false /* Show a message about mandatory cookies */ 35 | }); 36 | 37 | tarteaucitron.user.gtagUa = 'G-961MVSXWCZ'; 38 | (tarteaucitron.job = tarteaucitron.job || []).push('gtag'); -------------------------------------------------------------------------------- /etc/trail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/metaflow/apex-recoil/10e7359208f10687bf321d5955d4d6c245c42ac1/etc/trail.png -------------------------------------------------------------------------------- /etc/volume_off_white_24dp.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /etc/volume_up_white_24dp.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /gulpfile.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright 2021 Mikhail Goncharov 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | var gulp = require('gulp'), 18 | browserify = require('browserify'), 19 | source = require('vinyl-source-stream'), 20 | tsify = require('tsify'), 21 | fancy_log = require('fancy-log'), 22 | watchify = require("watchify"), 23 | gutil = require("gulp-util"), 24 | wait = require("gulp-wait"), 25 | livereload = require('gulp-livereload'), 26 | sass = require('gulp-sass')(require('sass')), 27 | maps = require('gulp-sourcemaps'), 28 | jsonSass = require('json-sass'), 29 | fs = require('fs'), 30 | concat = require('gulp-concat'), 31 | uglify = require('gulp-uglify'), 32 | cleanCSS = require('gulp-clean-css'), 33 | buffer = require('vinyl-buffer'), 34 | clean = require('gulp-clean'); 35 | 36 | sass.compiler = require('sass'); 37 | 38 | function compile_sass() { 39 | gutil.log(gutil.colors.green('Compiling styles...')); 40 | return gulp.src('./*.scss') 41 | .pipe(maps.init()) 42 | .pipe(sass().on('error', sass.logError)) 43 | .pipe(maps.write()) 44 | .pipe(gulp.dest('./public')) 45 | .pipe(livereload()); 46 | } 47 | 48 | function theme_sass() { 49 | gutil.log(gutil.colors.green('Compiling theme JSON to SASS...')); 50 | return fs.createReadStream('theme.json') 51 | .pipe(jsonSass({ 52 | prefix: '$theme: ', 53 | })) 54 | .pipe(fs.createWriteStream('theme.scss')); 55 | } 56 | 57 | function scripts(watch) { 58 | var b = browserify({ 59 | basedir: '.', 60 | debug: true, // Setting to false removes the source mapping data. 61 | entries: [ 62 | // TS files to transpile and bundle. 63 | 'client/main.ts', 64 | ], 65 | cache: {}, 66 | packageCache: {} 67 | }).plugin(tsify); 68 | 69 | var rebundle = function () { 70 | gutil.log(gutil.colors.green('Bundling scripts...')); 71 | return b.bundle() 72 | .on('error', fancy_log) 73 | .pipe(source('bundle.js')) 74 | .pipe(gulp.dest('./public')) 75 | .pipe(wait(1000)) 76 | .pipe(livereload()); 77 | }; 78 | 79 | if (watch) { 80 | b = watchify(b); 81 | b.on('update', rebundle); 82 | } 83 | return rebundle(); 84 | } 85 | 86 | gulp.task('sass', compile_sass); 87 | gulp.task('scripts', function (done) { 88 | scripts(false).on('end', done); 89 | }); 90 | 91 | gulp.task('watch-scripts', function (done) { 92 | scripts(true).on('end', done); 93 | }); 94 | 95 | gulp.task('watch', gulp.series( 96 | function () { 97 | return gulp 98 | .src('public/*', { read: false, allowEmpty: true }) 99 | .pipe(clean()); 100 | }, 101 | copy_assets, 102 | theme_sass, 103 | compile_sass, 104 | 'watch-scripts', 105 | function () { 106 | livereload(); 107 | livereload.listen(); 108 | gulp.watch(['etc/**/*.*'], copy_assets); 109 | gulp.watch(['theme.json'], theme_sass); 110 | gulp.watch(['*.scss'], compile_sass); 111 | } 112 | )); 113 | 114 | gulp.task('public', gulp.series( 115 | function () { 116 | return gulp 117 | .src('public/*', { read: false, allowEmpty: true }) 118 | .pipe(clean()); 119 | }, 120 | copy_assets, 121 | theme_sass, 122 | compile_sass, 123 | function (done) { scripts(false).on('end', done); } 124 | )); 125 | 126 | gulp.task('js', function () { 127 | return browserify({ 128 | basedir: '.', 129 | debug: false, 130 | entries: [ 131 | 'client/main.ts', 132 | ], 133 | cache: {}, 134 | packageCache: {} 135 | }).plugin(tsify) 136 | .bundle() 137 | .pipe(source('bundle.js')) 138 | .pipe(buffer()) 139 | .pipe(uglify()) 140 | .pipe(gulp.dest('./static')); 141 | }); 142 | 143 | var pug = require('gulp-pug'); 144 | gulp.task('templates', function () { 145 | return gulp.src('./views/*.pug') 146 | .pipe(pug({ 147 | locals: { 148 | 'title': 'Apex Legends Recoils' 149 | } 150 | })) 151 | .pipe(gulp.dest('./static/')) 152 | }); 153 | 154 | function copy_assets() { 155 | return gulp 156 | .src(['./assets/**/*.*', './etc/**/*.*']) 157 | .pipe(gulp.dest('public')); 158 | } 159 | 160 | gulp.task('assets-static', function () { 161 | return gulp 162 | .src(['./assets/**/*.*'], { base: './assets' }) 163 | .pipe(gulp.dest('static')); 164 | }); 165 | 166 | gulp.task('etc-static', function () { 167 | return gulp 168 | .src(['./etc/**/*.*']) 169 | .pipe(gulp.dest('static')); 170 | }); 171 | 172 | gulp.task('clean-static', function () { 173 | return gulp.src('static', { read: false, allowEmpty: true }) 174 | .pipe(clean()); 175 | }); 176 | 177 | gulp.task('css-static', function () { 178 | return gulp.src('./style.scss') 179 | .pipe(sass().on('error', sass.logError)) 180 | .pipe(cleanCSS()) 181 | .pipe(gulp.dest('static')); 182 | }); 183 | 184 | gulp.task('static', gulp.series('clean-static', 'css-static', 'js', 'templates', 'assets-static', 'etc-static')); -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "app", 3 | "version": "0.0.0", 4 | "private": true, 5 | "scripts": { 6 | "start": "nodemon ./bin/www", 7 | "watch": "gulp watch", 8 | "tsc": "tsc", 9 | "dev": "npm-run-all -p -r start watch", 10 | "static": "gulp static" 11 | }, 12 | "dependencies": { 13 | "@types/express": "~4.17.21", 14 | "@types/howler": "~2.2.11", 15 | "@types/json-diff": "~1.0.3", 16 | "@types/stats-lite": "~2.2.2", 17 | "browserify-breakdown": "~1.0.4", 18 | "cookie-parser": "~1.4.6", 19 | "debug": "~4.3.4", 20 | "express": "~4.18.3", 21 | "gulp-clean-css": "~4.3.0", 22 | "gulp-concat": "~2.6.1", 23 | "gulp-uglify": "~3.0.2", 24 | "hotkeys-js": "~3.13.7", 25 | "howler": "~2.2.4", 26 | "http-errors": "~2.0.0", 27 | "json-diff": "~1.0.6", 28 | "json-sass": "~1.3.5", 29 | "konva": "~9.3.6", 30 | "morgan": "~1.10.0", 31 | "node-compass": "0.2.4", 32 | "pug": "~3.0.2", 33 | "stats-lite": "~2.2.0", 34 | "ts-assert-exists": "~1.0.5", 35 | "tslib": "~2.6.2", 36 | "vinyl-buffer": "~1.0.1" 37 | }, 38 | "devDependencies": { 39 | "browser-sync": "~3.0.2", 40 | "browserify": "~17.0.0", 41 | "fancy-log": "~2.0.0", 42 | "gulp": "~4.0.2", 43 | "gulp-clean": "~0.4.0", 44 | "gulp-livereload": "~4.0.2", 45 | "gulp-pug": "^5.0.0", 46 | "gulp-sass": "~5.1.0", 47 | "gulp-sourcemaps": "~3.0.0", 48 | "gulp-typescript": "~6.0.0-alpha.1", 49 | "gulp-util": "~3.0.8", 50 | "gulp-wait": "0.0.2", 51 | "nodemon": "~3.1.0", 52 | "npm-run-all": "~4.1.5", 53 | "sass": "~1.72.0", 54 | "tsify": "~5.0.4", 55 | "typescript": "~5.4.2", 56 | "vinyl-source-stream": "~2.0.0", 57 | "watchify": "~4.0.0", 58 | "webpack-bundle-size-analyzer": "~3.1.0" 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /processing/.gitignore: -------------------------------------------------------------------------------- 1 | .ipynb_checkpoints -------------------------------------------------------------------------------- /processing/Pipfile: -------------------------------------------------------------------------------- 1 | [[source]] 2 | url = "https://pypi.org/simple" 3 | verify_ssl = true 4 | name = "pypi" 5 | 6 | [packages] 7 | jupyterlab = "*" 8 | seaborn = "*" 9 | matplotlib = "*" 10 | numpy = "*" 11 | 12 | [dev-packages] 13 | -------------------------------------------------------------------------------- /processing/gen_recoil_inc.py: -------------------------------------------------------------------------------- 1 | import json 2 | import io 3 | 4 | def extend(lst, desired_length, fill_value=None): 5 | return lst + [fill_value] * (desired_length - len(lst)) 6 | 7 | with open('../client/specs.json') as f: 8 | data = json.load(f) 9 | 10 | msize = max([o['mags'][-1]['size'] for o in data]) 11 | rcount = len(data) 12 | print(len(data), 'recoils, max length', msize) 13 | 14 | with io.StringIO() as output: 15 | output.write(f'const int RECOILS_LENGTH = {rcount};\n') 16 | output.write(f'const String names[] = ' + '{"' + '","'.join(x['name'] for x in data) + '"};\n') 17 | output.write(f'const int sizes[] = ' + '{' + ','.join(str(x["mags"][-1]['size']) for x in data) + '};\n') 18 | 19 | output.write(f'const PROGMEM float XDATA[] = ' + '{') 20 | for i, o in enumerate(data): 21 | if i > 0: 22 | output.write(',') 23 | output.write(f'{",".join([str(x) for x in extend(o["x"], msize, 0)])}') 24 | output.write('};\n') 25 | 26 | output.write(f'const PROGMEM float YDATA[] = ' + '{') 27 | for i, o in enumerate(data): 28 | if i > 0: 29 | output.write(',') 30 | output.write(f'{",".join([str(x) for x in extend(o["y"], msize, 0)])}') 31 | output.write('};\n') 32 | 33 | output.write(f'const PROGMEM float TDATA[] = ' + '{') 34 | for i, o in enumerate(data): 35 | if i > 0: 36 | output.write(',') 37 | output.write(f'{",".join([str(x) for x in extend(o["time_points"], msize, 0)])}') 38 | output.write('};\n') 39 | 40 | output_str = output.getvalue() 41 | 42 | print(output_str) 43 | with open('../arduino_mouse/src/recoil.inc', 'w') as file: 44 | file.write(output_str) -------------------------------------------------------------------------------- /reset.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright 2021 Mikhail Goncharov 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | *, *:before, *:after{ 18 | box-sizing: border-box; 19 | } 20 | 21 | html, body, div, span, object, iframe, figure, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, code, em, img, small, strike, strong, sub, sup, tt, b, u, i, ol, ul, li, fieldset, form, label, table, caption, tbody, tfoot, thead, tr, th, td, main, canvas, embed, footer, header, nav, section, video{ 22 | margin: 0; 23 | padding: 0; 24 | border: 0; 25 | font-size: 100%; 26 | font: inherit; 27 | vertical-align: baseline; 28 | text-rendering: optimizeLegibility; 29 | -webkit-font-smoothing: antialiased; 30 | text-size-adjust: none; 31 | } 32 | 33 | footer, header, nav, section, main{ 34 | display: block; 35 | } 36 | 37 | body{ 38 | line-height: 1; 39 | } 40 | 41 | ol, ul { 42 | list-style: none; 43 | } 44 | 45 | blockquote, q y{ 46 | quotes: none; 47 | } 48 | 49 | blockquote:before, blockquote:after, q:before, q:after{ 50 | content: ''; 51 | content: none; 52 | } 53 | 54 | table{ 55 | border-collapse: collapse; 56 | border-spacing: 0; 57 | } 58 | 59 | input{ 60 | -webkit-appearance: none; 61 | border-radius: 0; 62 | &[type="checkbox"] { 63 | -webkit-appearance: checkbox; 64 | } 65 | } -------------------------------------------------------------------------------- /theme.json: -------------------------------------------------------------------------------- 1 | { 2 | "background": "#121212", 3 | "foreground": "#F9F9F9", 4 | "active": "#f9c74f", 5 | "selection": "#90be6d", 6 | "helper": "#adb5bd", 7 | "error": "#f94144", 8 | "focusBorder": "#181a1f", 9 | "red": "#704040", 10 | "green": "#407040", 11 | "yellow": "#707040", 12 | "attachment_1": "#a8a8a8", 13 | "attachment_2": "#51a8d6", 14 | "attachment_3": "#b237c8", 15 | "colorStartCircle": "hsl(120, 50%, 25%)", 16 | "colorHintPath": "hsl(0, 0%, 48%)", 17 | "scoreGradient": ["rgb(191, 64, 64)", "rgb(191, 89, 64)", "rgb(191, 115, 64)", "rgb(191, 140, 64)", "rgb(191, 166, 64)", "rgb(191, 191, 64)", "rgb(159, 172, 57)", "rgb(128, 153, 51)", "rgb(96, 134, 45)", "rgb(64, 115, 38)", "rgb(32, 96, 32)"] 18 | } -------------------------------------------------------------------------------- /theme.scss: -------------------------------------------------------------------------------- 1 | $theme: ( 2 | background: #121212, 3 | foreground: #F9F9F9, 4 | active: #f9c74f, 5 | selection: #90be6d, 6 | helper: #adb5bd, 7 | error: #f94144, 8 | focusBorder: #181a1f, 9 | red: #704040, 10 | green: #407040, 11 | yellow: #707040, 12 | attachment_1: #a8a8a8, 13 | attachment_2: #51a8d6, 14 | attachment_3: #b237c8, 15 | colorStartCircle: hsl(120, 50%, 25%), 16 | colorHintPath: hsl(0, 0%, 48%), 17 | scoreGradient: (rgb(191, 64, 64), rgb(191, 89, 64), rgb(191, 115, 64), rgb(191, 140, 64), rgb(191, 166, 64), rgb(191, 191, 64), rgb(159, 172, 57), rgb(128, 153, 51), rgb(96, 134, 45), rgb(64, 115, 38), rgb(32, 96, 32)) 18 | ); -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | /* Visit https://aka.ms/tsconfig.json to read more about this file */ 4 | "resolveJsonModule": true, 5 | /* Basic Options */ 6 | // "incremental": true, /* Enable incremental compilation */ 7 | "target": "ES5", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */ 8 | "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */ 9 | "lib": ["es6", "dom", "es2019"], /* Specify library files to be included in the compilation. */ 10 | // "allowJs": true, /* Allow javascript files to be compiled. */ 11 | // "checkJs": true, /* Report errors in .js files. */ 12 | // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ 13 | // "declaration": true, /* Generates corresponding '.d.ts' file. */ 14 | // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ 15 | "sourceMap": true, /* Generates corresponding '.map' file. */ 16 | // "outFile": "./", /* Concatenate and emit output to single file. */ 17 | "outDir": "public/javascripts", /* Redirect output structure to the directory. */ 18 | // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ 19 | // "composite": true, /* Enable project compilation */ 20 | // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ 21 | // "removeComments": true, /* Do not emit comments to output. */ 22 | // "noEmit": true, /* Do not emit outputs. */ 23 | "importHelpers": true, /* Import emit helpers from 'tslib'. */ 24 | // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ 25 | // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ 26 | 27 | /* Strict Type-Checking Options */ 28 | "strict": true, /* Enable all strict type-checking options. */ 29 | // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ 30 | // "strictNullChecks": true, /* Enable strict null checks. */ 31 | // "strictFunctionTypes": true, /* Enable strict checking of function types. */ 32 | // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ 33 | // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ 34 | // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ 35 | // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ 36 | 37 | /* Additional Checks */ 38 | // "noUnusedLocals": true, /* Report errors on unused locals. */ 39 | // "noUnusedParameters": true, /* Report errors on unused parameters. */ 40 | // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ 41 | // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ 42 | 43 | /* Module Resolution Options */ 44 | "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ 45 | // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ 46 | // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ 47 | // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ 48 | // "typeRoots": [], /* List of folders to include type definitions from. */ 49 | // "types": [], /* Type declaration files to be included in compilation. */ 50 | // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ 51 | "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ 52 | // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ 53 | // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ 54 | 55 | /* Source Map Options */ 56 | // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ 57 | // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ 58 | // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ 59 | "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ 60 | 61 | /* Experimental Options */ 62 | "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ 63 | // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ 64 | 65 | /* Advanced Options */ 66 | "skipLibCheck": true, /* Skip type checking of declaration files. */ 67 | "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */ 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /views/editor.pug: -------------------------------------------------------------------------------- 1 | //- 2 | //- Copyright 2021 Mikhail Goncharov 3 | //- 4 | //- Licensed under the Apache License, Version 2.0 (the "License"); 5 | //- you may not use this file except in compliance with the License. 6 | //- You may obtain a copy of the License at 7 | //- 8 | //- https://www.apache.org/licenses/LICENSE-2.0 9 | //- 10 | //- Unless required by applicable law or agreed to in writing, software 11 | //- distributed under the License is distributed on an "AS IS" BASIS, 12 | //- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | //- See the License for the specific language governing permissions and 14 | //- limitations under the License. 15 | 16 | extends layout 17 | block content 18 | #editor 19 | #tools 20 | input(type="file" id="file-selector" multiple) 21 | p#filename 22 | p 23 | input(type='text' id='threshold') 24 | | threshold 25 | p 26 | input(type='checkbox' id='auto-targets') 27 | | auto targets 28 | p 29 | input(type='text' id='target-from') 30 | | target from 31 | p 32 | input(type='text' id='target-to') 33 | | target to 34 | button#accept-auto convert auto 35 | p 36 | input(type='checkbox' id='enable-threshold') 37 | | enable threshold 38 | p 39 | input(type='checkbox' id='connect-hover') 40 | | connect on hover 41 | p 42 | input(type='text' id='weapon') 43 | | weapon 44 | p 45 | input(type='text' id='barrel') 46 | | barrel (0..3) 47 | p 48 | input(type='text' id='stock') 49 | | stock (0..3) 50 | p 51 | input(type='text' id='distance') 52 | | raw distance 53 | p comment 54 | textarea#comment(cols="30", rows="2") 55 | button#clear clear 56 | p#count 57 | #text 58 | #stage -------------------------------------------------------------------------------- /views/layout.pug: -------------------------------------------------------------------------------- 1 | //- 2 | //- Copyright 2021 Mikhail Goncharov 3 | //- 4 | //- Licensed under the Apache License, Version 2.0 (the "License"); 5 | //- you may not use this file except in compliance with the License. 6 | //- You may obtain a copy of the License at 7 | //- 8 | //- https://www.apache.org/licenses/LICENSE-2.0 9 | //- 10 | //- Unless required by applicable law or agreed to in writing, software 11 | //- distributed under the License is distributed on an "AS IS" BASIS, 12 | //- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | //- See the License for the specific language governing permissions and 14 | //- limitations under the License. 15 | doctype html 16 | html 17 | head 18 | meta(charset='utf-8') 19 | meta(name='description' content='Improve tracking in Apex Legends game by learning and training weapon recoil (or spray) patterns. Namely: R-99, R-301, Flatline, Spitfire, Volt, Devotion, Havoc, Alternator, Prowler and RE-45.') 20 | meta(name="viewport" content="width=device-width, initial-scale=1") 21 | title=title 22 | link(rel='stylesheet', href='/style.css') 23 | link(rel="icon", type="image/png", sizes="32x32" href="/favicon-32x32.png") 24 | link(rel="icon", type="image/png", sizes="16x16" href="/favicon-16x16.png") 25 | body 26 | block content 27 | script(src='/tarteaucitron/tarteaucitron.js') 28 | script(src='/tarteaucitron_init.js') 29 | //- script(src="/plotly-latest.min.js") 30 | script(src="/plotly-cartesian.min.js") 31 | script(src='/plot.js') 32 | script(src='/bundle.js') --------------------------------------------------------------------------------