+ */
+
+return array(
+ 'year' => ':count жил',
+ 'y' => ':count жил',
+ 'month' => ':count Ñар',
+ 'm' => ':count Ñар',
+ 'week' => ':count долоо хоног',
+ 'w' => ':count долоо хоног',
+ 'day' => ':count өдөр',
+ 'd' => ':count өдөр',
+ 'hour' => ':count цаг',
+ 'h' => ':countц',
+ 'minute' => ':count минут',
+ 'min' => ':countм',
+ 'second' => ':count Ñекунд',
+ 's' => ':countÑ',
+
+ 'ago' => ':timeн өмнө',
+ 'year_ago' => ':count жилий',
+ 'month_ago' => ':count Ñары',
+ 'day_ago' => ':count хоногий',
+ 'hour_ago' => ':count цагий',
+ 'minute_ago' => ':count минуты',
+ 'second_ago' => ':count Ñекунды',
+
+ 'from_now' => 'Ð¾Ð´Ð¾Ð¾Ð³Ð¾Ð¾Ñ :time',
+ 'year_from_now' => ':count жилийн дараа',
+ 'month_from_now' => ':count Ñарын дараа',
+ 'day_from_now' => ':count хоногийн дараа',
+ 'hour_from_now' => ':count цагийн дараа',
+ 'minute_from_now' => ':count минутын дараа',
+ 'second_from_now' => ':count Ñекундын дараа',
+
+ // Does it required to make translation for before, after as follows? hmm, I think we've made it with ago and from now keywords already. Anyway, I've included it just in case of undesired action...
+ 'after' => ':timeн дараа',
+ 'year_after' => ':count жилий',
+ 'month_after' => ':count Ñары',
+ 'day_after' => ':count хоногий',
+ 'hour_after' => ':count цагий',
+ 'minute_after' => ':count минуты',
+ 'second_after' => ':count Ñекунды',
+ 'before' => ':timeн өмнө',
+ 'year_before' => ':count жилий',
+ 'month_before' => ':count Ñары',
+ 'day_before' => ':count хоногий',
+ 'hour_before' => ':count цагий',
+ 'minute_before' => ':count минуты',
+ 'second_before' => ':count Ñекунды',
+);
diff --git a/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/ms.php b/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/ms.php
new file mode 100644
index 0000000..ef57422
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/ms.php
@@ -0,0 +1,31 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+return array(
+ 'year' => ':count tahun',
+ 'y' => ':count tahun',
+ 'month' => ':count bulan',
+ 'm' => ':count bulan',
+ 'week' => ':count minggu',
+ 'w' => ':count minggu',
+ 'day' => ':count hari',
+ 'd' => ':count hari',
+ 'hour' => ':count jam',
+ 'h' => ':count jam',
+ 'minute' => ':count minit',
+ 'min' => ':count minit',
+ 'second' => ':count saat',
+ 's' => ':count saat',
+ 'ago' => ':time yang lalu',
+ 'from_now' => ':time dari sekarang',
+ 'after' => ':time selepas',
+ 'before' => ':time sebelum',
+);
diff --git a/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/my.php b/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/my.php
new file mode 100644
index 0000000..e8e491e
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/my.php
@@ -0,0 +1,37 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+return array(
+ 'year' => ':count နှစ်|:count နှစ်',
+ 'y' => ':count နှစ်|:count နှစ်',
+ 'month' => ':count လ|:count လ',
+ 'm' => ':count လ|:count လ',
+ 'week' => ':count ပá€á€º|:count ပá€á€º',
+ 'w' => ':count ပá€á€º|:count ပá€á€º',
+ 'day' => ':count ရက်|:count ရက်',
+ 'd' => ':count ရက်|:count ရက်',
+ 'hour' => ':count နာရီ|:count နာရီ',
+ 'h' => ':count နာရီ|:count နာရီ',
+ 'minute' => ':count မá€á€”စ်|:count မá€á€”စ်',
+ 'min' => ':count မá€á€”စ်|:count မá€á€”စ်',
+ 'second' => ':count စက္ကန့်|:count စက္ကန့်',
+ 's' => ':count စက္ကန့်|:count စက္ကန့်',
+ 'ago' => 'လွန်á€á€²á€·á€žá€±á€¬ :time က',
+ 'from_now' => 'ယá€á€¯á€™á€¾á€…áနောက် :time အကြာ',
+ 'after' => ':time ကြာပြီးနောက်',
+ 'before' => ':time မá€á€á€¯á€„်á€á€„်',
+ 'diff_now' => 'အá€á€¯á€œá€±á€¸á€á€„်',
+ 'diff_yesterday' => 'မနေ့က',
+ 'diff_tomorrow' => 'မနက်ဖြန်',
+ 'diff_before_yesterday' => 'á€á€™á€¼á€”်နေ့က',
+ 'diff_after_tomorrow' => 'á€á€˜á€€á€ºá€á€«',
+ 'period_recurrences' => ':count ကြá€á€™á€º',
+);
diff --git a/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/ne.php b/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/ne.php
new file mode 100644
index 0000000..0b528df
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/ne.php
@@ -0,0 +1,31 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+return array(
+ 'year' => ':count वरà¥à¤·',
+ 'y' => ':count वरà¥à¤·',
+ 'month' => ':count महिना',
+ 'm' => ':count महिना',
+ 'week' => ':count हपà¥à¤¤à¤¾',
+ 'w' => ':count हपà¥à¤¤à¤¾',
+ 'day' => ':count दिन',
+ 'd' => ':count दिन',
+ 'hour' => ':count घणà¥à¤Ÿà¤¾',
+ 'h' => ':count घणà¥à¤Ÿà¤¾',
+ 'minute' => ':count मिनेट',
+ 'min' => ':count मिनेट',
+ 'second' => ':count सेकेणà¥à¤¡',
+ 's' => ':count सेकेणà¥à¤¡',
+ 'ago' => ':time पहिले',
+ 'from_now' => ':time देखि',
+ 'after' => ':time पछि',
+ 'before' => ':time अघि',
+);
diff --git a/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/nl.php b/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/nl.php
new file mode 100644
index 0000000..ec5a88e
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/nl.php
@@ -0,0 +1,36 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+return array(
+ 'year' => ':count jaar',
+ 'y' => ':count jaar',
+ 'month' => ':count maand|:count maanden',
+ 'm' => ':count maand|:count maanden',
+ 'week' => ':count week|:count weken',
+ 'w' => ':count week|:count weken',
+ 'day' => ':count dag|:count dagen',
+ 'd' => ':count dag|:count dagen',
+ 'hour' => ':count uur',
+ 'h' => ':count uur',
+ 'minute' => ':count minuut|:count minuten',
+ 'min' => ':count minuut|:count minuten',
+ 'second' => ':count seconde|:count seconden',
+ 's' => ':count seconde|:count seconden',
+ 'ago' => ':time geleden',
+ 'from_now' => 'over :time',
+ 'after' => ':time later',
+ 'before' => ':time eerder',
+ 'diff_now' => 'nu',
+ 'diff_yesterday' => 'gisteren',
+ 'diff_tomorrow' => 'morgen',
+ 'diff_after_tomorrow' => 'overmorgen',
+ 'diff_before_yesterday' => 'eergisteren',
+);
diff --git a/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/no.php b/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/no.php
new file mode 100644
index 0000000..a6ece06
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/no.php
@@ -0,0 +1,36 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+return array(
+ 'year' => ':count år|:count år',
+ 'y' => ':count år|:count år',
+ 'month' => ':count måned|:count måneder',
+ 'm' => ':count måned|:count måneder',
+ 'week' => ':count uke|:count uker',
+ 'w' => ':count uke|:count uker',
+ 'day' => ':count dag|:count dager',
+ 'd' => ':count dag|:count dager',
+ 'hour' => ':count time|:count timer',
+ 'h' => ':count time|:count timer',
+ 'minute' => ':count minutt|:count minutter',
+ 'min' => ':count minutt|:count minutter',
+ 'second' => ':count sekund|:count sekunder',
+ 's' => ':count sekund|:count sekunder',
+ 'ago' => ':time siden',
+ 'from_now' => 'om :time',
+ 'after' => ':time etter',
+ 'before' => ':time før',
+ 'diff_now' => 'akkurat nå',
+ 'diff_yesterday' => 'i går',
+ 'diff_tomorrow' => 'i morgen',
+ 'diff_before_yesterday' => 'i forgårs',
+ 'diff_after_tomorrow' => 'i overmorgen',
+);
diff --git a/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/oc.php b/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/oc.php
new file mode 100644
index 0000000..e89e94c
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/oc.php
@@ -0,0 +1,44 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+\Symfony\Component\Translation\PluralizationRules::set(function ($number) {
+ return $number == 1 ? 0 : 1;
+}, 'oc');
+
+return array(
+ 'year' => ':count an|:count ans',
+ 'y' => ':count an|:count ans',
+ 'month' => ':count mes|:count meses',
+ 'm' => ':count mes|:count meses',
+ 'week' => ':count setmana|:count setmanas',
+ 'w' => ':count setmana|:count setmanas',
+ 'day' => ':count jorn|:count jorns',
+ 'd' => ':count jorn|:count jorns',
+ 'hour' => ':count ora|:count oras',
+ 'h' => ':count ora|:count oras',
+ 'minute' => ':count minuta|:count minutas',
+ 'min' => ':count minuta|:count minutas',
+ 'second' => ':count segonda|:count segondas',
+ 's' => ':count segonda|:count segondas',
+ 'ago' => 'fa :time',
+ 'from_now' => 'dins :time',
+ 'after' => ':time aprèp',
+ 'before' => ':time abans',
+ 'diff_now' => 'ara meteis',
+ 'diff_yesterday' => 'ièr',
+ 'diff_tomorrow' => 'deman',
+ 'diff_before_yesterday' => 'ièr delà ',
+ 'diff_after_tomorrow' => 'deman passat',
+ 'period_recurrences' => ':count còp|:count còps',
+ 'period_interval' => 'cada :interval',
+ 'period_start_date' => 'de :date',
+ 'period_end_date' => 'fins a :date',
+);
diff --git a/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/pl.php b/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/pl.php
new file mode 100644
index 0000000..2308af2
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/pl.php
@@ -0,0 +1,36 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+return array(
+ 'year' => ':count rok|:count lata|:count lat',
+ 'y' => ':countr|:countl',
+ 'month' => ':count miesiąc|:count miesiące|:count miesięcy',
+ 'm' => ':countmies',
+ 'week' => ':count tydzień|:count tygodnie|:count tygodni',
+ 'w' => ':counttyg',
+ 'day' => ':count dzień|:count dni|:count dni',
+ 'd' => ':countd',
+ 'hour' => ':count godzina|:count godziny|:count godzin',
+ 'h' => ':countg',
+ 'minute' => ':count minuta|:count minuty|:count minut',
+ 'min' => ':countm',
+ 'second' => ':count sekunda|:count sekundy|:count sekund',
+ 's' => ':counts',
+ 'ago' => ':time temu',
+ 'from_now' => ':time od teraz',
+ 'after' => ':time po',
+ 'before' => ':time przed',
+ 'diff_now' => 'przed chwilÄ…',
+ 'diff_yesterday' => 'wczoraj',
+ 'diff_tomorrow' => 'jutro',
+ 'diff_before_yesterday' => 'przedwczoraj',
+ 'diff_after_tomorrow' => 'pojutrze',
+);
diff --git a/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/ps.php b/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/ps.php
new file mode 100644
index 0000000..15c3296
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/ps.php
@@ -0,0 +1,31 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+return array(
+ 'year' => ':count کال|:count کاله',
+ 'y' => ':countکال|:countکاله',
+ 'month' => ':count مياشت|:count مياشتي',
+ 'm' => ':countمياشت|:countمياشتي',
+ 'week' => ':count اونÛ|:count اونÛ',
+ 'w' => ':countاونÛ|:countاونÛ',
+ 'day' => ':count ورÚ|:count ورÚÙŠ',
+ 'd' => ':countورÚ|:countورÚÙŠ',
+ 'hour' => ':count ساعت|:count ساعته',
+ 'h' => ':countساعت|:countساعته',
+ 'minute' => ':count دقيقه|:count دقيقÛ',
+ 'min' => ':countدقيقه|:countدقيقÛ',
+ 'second' => ':count ثانيه|:count ثانيÛ',
+ 's' => ':countثانيه|:countثانيÛ',
+ 'ago' => ':time دمخه',
+ 'from_now' => ':time له اوس څخه',
+ 'after' => ':time وروسته',
+ 'before' => ':time دمخه',
+);
diff --git a/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/pt.php b/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/pt.php
new file mode 100644
index 0000000..392b121
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/pt.php
@@ -0,0 +1,31 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+return array(
+ 'year' => ':count ano|:count anos',
+ 'y' => ':count ano|:count anos',
+ 'month' => ':count mês|:count meses',
+ 'm' => ':count mês|:count meses',
+ 'week' => ':count semana|:count semanas',
+ 'w' => ':count semana|:count semanas',
+ 'day' => ':count dia|:count dias',
+ 'd' => ':count dia|:count dias',
+ 'hour' => ':count hora|:count horas',
+ 'h' => ':count hora|:count horas',
+ 'minute' => ':count minuto|:count minutos',
+ 'min' => ':count minuto|:count minutos',
+ 'second' => ':count segundo|:count segundos',
+ 's' => ':count segundo|:count segundos',
+ 'ago' => ':time atrás',
+ 'from_now' => 'em :time',
+ 'after' => ':time depois',
+ 'before' => ':time antes',
+);
diff --git a/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/pt_BR.php b/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/pt_BR.php
new file mode 100644
index 0000000..1f84eac
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/pt_BR.php
@@ -0,0 +1,40 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+return array(
+ 'year' => ':count ano|:count anos',
+ 'y' => ':counta|:counta',
+ 'month' => ':count mês|:count meses',
+ 'm' => ':countm|:countm',
+ 'week' => ':count semana|:count semanas',
+ 'w' => ':countsem|:countsem',
+ 'day' => ':count dia|:count dias',
+ 'd' => ':countd|:countd',
+ 'hour' => ':count hora|:count horas',
+ 'h' => ':counth|:counth',
+ 'minute' => ':count minuto|:count minutos',
+ 'min' => ':countmin|:countmin',
+ 'second' => ':count segundo|:count segundos',
+ 's' => ':counts|:counts',
+ 'ago' => 'há :time',
+ 'from_now' => 'em :time',
+ 'after' => 'após :time',
+ 'before' => ':time atrás',
+ 'diff_now' => 'agora',
+ 'diff_yesterday' => 'ontem',
+ 'diff_tomorrow' => 'amanhã',
+ 'diff_before_yesterday' => 'anteontem',
+ 'diff_after_tomorrow' => 'depois de amanhã',
+ 'period_recurrences' => 'uma|:count vez',
+ 'period_interval' => 'toda :interval',
+ 'period_start_date' => 'de :date',
+ 'period_end_date' => 'até :date',
+);
diff --git a/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/ro.php b/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/ro.php
new file mode 100644
index 0000000..cc16724
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/ro.php
@@ -0,0 +1,31 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+return array(
+ 'year' => 'un an|:count ani|:count ani',
+ 'y' => 'un an|:count ani|:count ani',
+ 'month' => 'o lună|:count luni|:count luni',
+ 'm' => 'o lună|:count luni|:count luni',
+ 'week' => 'o săptămână|:count săptămâni|:count săptămâni',
+ 'w' => 'o săptămână|:count săptămâni|:count săptămâni',
+ 'day' => 'o zi|:count zile|:count zile',
+ 'd' => 'o zi|:count zile|:count zile',
+ 'hour' => 'o oră|:count ore|:count ore',
+ 'h' => 'o oră|:count ore|:count ore',
+ 'minute' => 'un minut|:count minute|:count minute',
+ 'min' => 'un minut|:count minute|:count minute',
+ 'second' => 'o secundă|:count secunde|:count secunde',
+ 's' => 'o secundă|:count secunde|:count secunde',
+ 'ago' => 'acum :time',
+ 'from_now' => ':time de acum',
+ 'after' => 'peste :time',
+ 'before' => 'acum :time',
+);
diff --git a/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/ru.php b/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/ru.php
new file mode 100644
index 0000000..6a83fb1
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/ru.php
@@ -0,0 +1,31 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+return array(
+ 'year' => ':count год|:count года|:count лет',
+ 'y' => ':count г|:count г|:count л',
+ 'month' => ':count меÑÑц|:count меÑÑца|:count меÑÑцев',
+ 'm' => ':count м|:count м|:count м',
+ 'week' => ':count неделю|:count недели|:count недель',
+ 'w' => ':count н|:count н|:count н',
+ 'day' => ':count день|:count днÑ|:count дней',
+ 'd' => ':count д|:count д|:count д',
+ 'hour' => ':count чаÑ|:count чаÑа|:count чаÑов',
+ 'h' => ':count ч|:count ч|:count ч',
+ 'minute' => ':count минуту|:count минуты|:count минут',
+ 'min' => ':count мин|:count мин|:count мин',
+ 'second' => ':count Ñекунду|:count Ñекунды|:count Ñекунд',
+ 's' => ':count Ñ|:count Ñ|:count Ñ',
+ 'ago' => ':time назад',
+ 'from_now' => 'через :time',
+ 'after' => ':time поÑле',
+ 'before' => ':time до',
+);
diff --git a/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/sh.php b/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/sh.php
new file mode 100644
index 0000000..57f287a
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/sh.php
@@ -0,0 +1,35 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+\Symfony\Component\Translation\PluralizationRules::set(function ($number) {
+ return ((1 == $number % 10) && (11 != $number % 100)) ? 0 : ((($number % 10 >= 2) && ($number % 10 <= 4) && (($number % 100 < 10) || ($number % 100 >= 20))) ? 1 : 2);
+}, 'sh');
+
+return array(
+ 'year' => ':count godina|:count godine|:count godina',
+ 'y' => ':count godina|:count godine|:count godina',
+ 'month' => ':count mesec|:count meseca|:count meseci',
+ 'm' => ':count mesec|:count meseca|:count meseci',
+ 'week' => ':count nedelja|:count nedelje|:count nedelja',
+ 'w' => ':count nedelja|:count nedelje|:count nedelja',
+ 'day' => ':count dan|:count dana|:count dana',
+ 'd' => ':count dan|:count dana|:count dana',
+ 'hour' => ':count Äas|:count Äasa|:count Äasova',
+ 'h' => ':count Äas|:count Äasa|:count Äasova',
+ 'minute' => ':count minut|:count minuta|:count minuta',
+ 'min' => ':count minut|:count minuta|:count minuta',
+ 'second' => ':count sekund|:count sekunda|:count sekundi',
+ 's' => ':count sekund|:count sekunda|:count sekundi',
+ 'ago' => 'pre :time',
+ 'from_now' => 'za :time',
+ 'after' => 'nakon :time',
+ 'before' => ':time raniјe',
+);
diff --git a/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/sk.php b/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/sk.php
new file mode 100644
index 0000000..6101344
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/sk.php
@@ -0,0 +1,38 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+return array(
+ 'year' => 'rok|:count roky|:count rokov',
+ 'y' => 'rok|:count roky|:count rokov',
+ 'month' => 'mesiac|:count mesiace|:count mesiacov',
+ 'm' => 'mesiac|:count mesiace|:count mesiacov',
+ 'week' => 'týždeň|:count týždne|:count týždňov',
+ 'w' => 'týždeň|:count týždne|:count týždňov',
+ 'day' => 'deň|:count dni|:count dnÃ',
+ 'd' => 'deň|:count dni|:count dnÃ',
+ 'hour' => 'hodinu|:count hodiny|:count hodÃn',
+ 'h' => 'hodinu|:count hodiny|:count hodÃn',
+ 'minute' => 'minútu|:count minúty|:count minút',
+ 'min' => 'minútu|:count minúty|:count minút',
+ 'second' => 'sekundu|:count sekundy|:count sekúnd',
+ 's' => 'sekundu|:count sekundy|:count sekúnd',
+ 'ago' => 'pred :time',
+ 'from_now' => 'za :time',
+ 'after' => 'o :time neskôr',
+ 'before' => ':time predtým',
+ 'year_ago' => 'rokom|:count rokmi|:count rokmi',
+ 'month_ago' => 'mesiacom|:count mesiacmi|:count mesiacmi',
+ 'week_ago' => 'týždňom|:count týždňami|:count týždňami',
+ 'day_ago' => 'dňom|:count dňami|:count dňami',
+ 'hour_ago' => 'hodinou|:count hodinami|:count hodinami',
+ 'minute_ago' => 'minútou|:count minútami|:count minútami',
+ 'second_ago' => 'sekundou|:count sekundami|:count sekundami',
+);
diff --git a/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/sl.php b/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/sl.php
new file mode 100644
index 0000000..06686d1
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/sl.php
@@ -0,0 +1,43 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+return array(
+ 'year' => ':count leto|:count leti|:count leta|:count let',
+ 'y' => ':count leto|:count leti|:count leta|:count let',
+ 'month' => ':count mesec|:count meseca|:count mesece|:count mesecev',
+ 'm' => ':count mesec|:count meseca|:count mesece|:count mesecev',
+ 'week' => ':count teden|:count tedna|:count tedne|:count tednov',
+ 'w' => ':count teden|:count tedna|:count tedne|:count tednov',
+ 'day' => ':count dan|:count dni|:count dni|:count dni',
+ 'd' => ':count dan|:count dni|:count dni|:count dni',
+ 'hour' => ':count uro|:count uri|:count ure|:count ur',
+ 'h' => ':count uro|:count uri|:count ure|:count ur',
+ 'minute' => ':count minuto|:count minuti|:count minute|:count minut',
+ 'min' => ':count minuto|:count minuti|:count minute|:count minut',
+ 'second' => ':count sekundo|:count sekundi|:count sekunde|:count sekund',
+ 's' => ':count sekundo|:count sekundi|:count sekunde|:count sekund',
+ 'year_ago' => ':count letom|:count leti|:count leti|:count leti',
+ 'month_ago' => ':count mesecem|:count meseci|:count meseci|:count meseci',
+ 'week_ago' => ':count tednom|:count tednoma|:count tedni|:count tedni',
+ 'day_ago' => ':count dnem|:count dnevoma|:count dnevi|:count dnevi',
+ 'hour_ago' => ':count uro|:count urama|:count urami|:count urami',
+ 'minute_ago' => ':count minuto|:count minutama|:count minutami|:count minutami',
+ 'second_ago' => ':count sekundo|:count sekundama|:count sekundami|:count sekundami',
+ 'ago' => 'pred :time',
+ 'from_now' => 'Äez :time',
+ 'after' => 'Äez :time',
+ 'before' => 'pred :time',
+ 'diff_now' => 'ravnokar',
+ 'diff_yesterday' => 'vÄeraj',
+ 'diff_tomorrow' => 'jutri',
+ 'diff_before_yesterday' => 'predvÄerajÅ¡njim',
+ 'diff_after_tomorrow' => 'pojutrišnjem',
+);
diff --git a/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/sq.php b/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/sq.php
new file mode 100644
index 0000000..6e138a0
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/sq.php
@@ -0,0 +1,31 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+return array(
+ 'year' => ':count vit|:count vjet',
+ 'y' => ':count vit|:count vjet',
+ 'month' => ':count muaj|:count muaj',
+ 'm' => ':count muaj|:count muaj',
+ 'week' => ':count javë|:count javë',
+ 'w' => ':count javë|:count javë',
+ 'day' => ':count ditë|:count ditë',
+ 'd' => ':count ditë|:count ditë',
+ 'hour' => ':count orë|:count orë',
+ 'h' => ':count orë|:count orë',
+ 'minute' => ':count minutë|:count minuta',
+ 'min' => ':count minutë|:count minuta',
+ 'second' => ':count sekondë|:count sekonda',
+ 's' => ':count sekondë|:count sekonda',
+ 'ago' => ':time më parë',
+ 'from_now' => ':time nga tani',
+ 'after' => ':time pas',
+ 'before' => ':time para',
+);
diff --git a/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/sr.php b/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/sr.php
new file mode 100644
index 0000000..5a10642
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/sr.php
@@ -0,0 +1,37 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+return array(
+ 'year' => ':count godina|:count godine|:count godina',
+ 'y' => ':count godina|:count godine|:count godina',
+ 'month' => ':count mesec|:count meseca|:count meseci',
+ 'm' => ':count mesec|:count meseca|:count meseci',
+ 'week' => ':count nedelja|:count nedelje|:count nedelja',
+ 'w' => ':count nedelja|:count nedelje|:count nedelja',
+ 'day' => ':count dan|:count dana|:count dana',
+ 'd' => ':count dan|:count dana|:count dana',
+ 'hour' => ':count sat|:count sata|:count sati',
+ 'h' => ':count sat|:count sata|:count sati',
+ 'minute' => ':count minut|:count minuta |:count minuta',
+ 'min' => ':count minut|:count minuta |:count minuta',
+ 'second' => ':count sekund|:count sekunde|:count sekunde',
+ 's' => ':count sekund|:count sekunde|:count sekunde',
+ 'ago' => 'pre :time',
+ 'from_now' => ':time od sada',
+ 'after' => 'nakon :time',
+ 'before' => 'pre :time',
+
+ 'year_from_now' => '{1,21,31,41,51} :count godinu|{2,3,4,22,23,24,32,33,34,42,43,44,52,53,54} :count godine|[5,Inf[ :count godina',
+ 'year_ago' => '{1,21,31,41,51} :count godinu|{2,3,4,22,23,24,32,33,34,42,43,44,52,53,54} :count godine|[5,Inf[ :count godina',
+
+ 'week_from_now' => '{1} :count nedelju|{2,3,4} :count nedelje|[5,Inf[ :count nedelja',
+ 'week_ago' => '{1} :count nedelju|{2,3,4} :count nedelje|[5,Inf[ :count nedelja',
+);
diff --git a/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/sr_Cyrl.php b/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/sr_Cyrl.php
new file mode 100644
index 0000000..2db83ed
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/sr_Cyrl.php
@@ -0,0 +1,43 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+return array(
+ 'year' => '{2,3,4,22,23,24,32,33,34,42,43,44,52,53,54}:count године|[0,Inf[ :count година',
+ 'y' => ':count г.',
+ 'month' => '{1} :count меÑец|{2,3,4}:count меÑеца|[5,Inf[ :count меÑеци',
+ 'm' => ':count м.',
+ 'week' => '{1} :count недеља|{2,3,4}:count недеље|[5,Inf[ :count недеља',
+ 'w' => ':count нед.',
+ 'day' => '{1,21,31} :count дан|[2,Inf[ :count дана',
+ 'd' => ':count д.',
+ 'hour' => '{1,21} :count Ñат|{2,3,4,22,23,24}:count Ñата|[5,Inf[ :count Ñати',
+ 'h' => ':count ч.',
+ 'minute' => '{1,21,31,41,51} :count минут|[2,Inf[ :count минута',
+ 'min' => ':count мин.',
+ 'second' => '{1,21,31,41,51} :count Ñекунд|{2,3,4,22,23,24,32,33,34,42,43,44,52,53,54}:count Ñекунде|[5,Inf[:count Ñекунди',
+ 's' => ':count Ñек.',
+ 'ago' => 'пре :time',
+ 'from_now' => 'за :time',
+ 'after' => ':time након',
+ 'before' => ':time пре',
+
+ 'year_from_now' => '{1,21,31,41,51} :count годину|{2,3,4,22,23,24,32,33,34,42,43,44,52,53,54} :count године|[5,Inf[ :count година',
+ 'year_ago' => '{1,21,31,41,51} :count годину|{2,3,4,22,23,24,32,33,34,42,43,44,52,53,54} :count године|[5,Inf[ :count година',
+
+ 'week_from_now' => '{1} :count недељу|{2,3,4} :count недеље|[5,Inf[ :count недеља',
+ 'week_ago' => '{1} :count недељу|{2,3,4} :count недеље|[5,Inf[ :count недеља',
+
+ 'diff_now' => 'управо Ñада',
+ 'diff_yesterday' => 'јуче',
+ 'diff_tomorrow' => 'Ñутра',
+ 'diff_before_yesterday' => 'прекјуче',
+ 'diff_after_tomorrow' => 'прекоÑутра',
+);
diff --git a/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/sr_Cyrl_ME.php b/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/sr_Cyrl_ME.php
new file mode 100644
index 0000000..18214c4
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/sr_Cyrl_ME.php
@@ -0,0 +1,43 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+return array(
+ 'year' => '{2,3,4,22,23,24,32,33,34,42,43,44,52,53,54}:count године|[0,Inf[ :count година',
+ 'y' => ':count г.',
+ 'month' => '{1} :count мјеÑец|{2,3,4}:count мјеÑеца|[5,Inf[ :count мјеÑеци',
+ 'm' => ':count мј.',
+ 'week' => '{1} :count недјеља|{2,3,4}:count недјеље|[5,Inf[ :count недјеља',
+ 'w' => ':count нед.',
+ 'day' => '{1,21,31} :count дан|[2,Inf[ :count дана',
+ 'd' => ':count д.',
+ 'hour' => '{1,21} :count Ñат|{2,3,4,22,23,24}:count Ñата|[5,Inf[ :count Ñати',
+ 'h' => ':count ч.',
+ 'minute' => '{1,21,31,41,51} :count минут|[2,Inf[ :count минута',
+ 'min' => ':count мин.',
+ 'second' => '{1,21,31,41,51} :count Ñекунд|{2,3,4,22,23,24,32,33,34,42,43,44,52,53,54}:count Ñекунде|[5,Inf[:count Ñекунди',
+ 's' => ':count Ñек.',
+ 'ago' => 'прије :time',
+ 'from_now' => 'за :time',
+ 'after' => ':time након',
+ 'before' => ':time прије',
+
+ 'year_from_now' => '{1,21,31,41,51} :count годину|{2,3,4,22,23,24,32,33,34,42,43,44,52,53,54} :count године|[5,Inf[ :count година',
+ 'year_ago' => '{1,21,31,41,51} :count годину|{2,3,4,22,23,24,32,33,34,42,43,44,52,53,54} :count године|[5,Inf[ :count година',
+
+ 'week_from_now' => '{1} :count недјељу|{2,3,4} :count недјеље|[5,Inf[ :count недјеља',
+ 'week_ago' => '{1} :count недјељу|{2,3,4} :count недјеље|[5,Inf[ :count недјеља',
+
+ 'diff_now' => 'управо Ñада',
+ 'diff_yesterday' => 'јуче',
+ 'diff_tomorrow' => 'Ñутра',
+ 'diff_before_yesterday' => 'прекјуче',
+ 'diff_after_tomorrow' => 'прекоÑјутра',
+);
diff --git a/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/sr_Latn_ME.php b/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/sr_Latn_ME.php
new file mode 100644
index 0000000..2d2e288
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/sr_Latn_ME.php
@@ -0,0 +1,43 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+return array(
+ 'year' => '{2,3,4,22,23,24,32,33,34,42,43,44,52,53,54}:count godine|[0,Inf[ :count godina',
+ 'y' => ':count g.',
+ 'month' => '{1} :count mjesec|{2,3,4}:count mjeseca|[5,Inf[ :count mjeseci',
+ 'm' => ':count mj.',
+ 'week' => '{1} :count nedjelja|{2,3,4}:count nedjelje|[5,Inf[ :count nedjelja',
+ 'w' => ':count ned.',
+ 'day' => '{1,21,31} :count dan|[2,Inf[ :count dana',
+ 'd' => ':count d.',
+ 'hour' => '{1,21} :count sat|{2,3,4,22,23,24}:count sata|[5,Inf[ :count sati',
+ 'h' => ':count Ä.',
+ 'minute' => '{1,21,31,41,51} :count minut|[2,Inf[ :count minuta',
+ 'min' => ':count min.',
+ 'second' => '{1,21,31,41,51} :count sekund|{2,3,4,22,23,24,32,33,34,42,43,44,52,53,54}:count sekunde|[5,Inf[:count sekundi',
+ 's' => ':count sek.',
+ 'ago' => 'prije :time',
+ 'from_now' => 'za :time',
+ 'after' => ':time nakon',
+ 'before' => ':time prije',
+
+ 'year_from_now' => '{1,21,31,41,51} :count godinu|{2,3,4,22,23,24,32,33,34,42,43,44,52,53,54} :count godine|[5,Inf[ :count godina',
+ 'year_ago' => '{1,21,31,41,51} :count godinu|{2,3,4,22,23,24,32,33,34,42,43,44,52,53,54} :count godine|[5,Inf[ :count godina',
+
+ 'week_from_now' => '{1} :count nedjelju|{2,3,4} :count nedjelje|[5,Inf[ :count nedjelja',
+ 'week_ago' => '{1} :count nedjelju|{2,3,4} :count nedjelje|[5,Inf[ :count nedjelja',
+
+ 'diff_now' => 'upravo sada',
+ 'diff_yesterday' => 'juÄe',
+ 'diff_tomorrow' => 'sutra',
+ 'diff_before_yesterday' => 'prekjuÄe',
+ 'diff_after_tomorrow' => 'preksutra',
+);
diff --git a/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/sr_ME.php b/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/sr_ME.php
new file mode 100644
index 0000000..7ebf6f0
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/sr_ME.php
@@ -0,0 +1,12 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+return require __DIR__.'/sr_Latn_ME.php';
diff --git a/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/sv.php b/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/sv.php
new file mode 100644
index 0000000..89a03b4
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/sv.php
@@ -0,0 +1,31 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+return array(
+ 'year' => ':count år|:count år',
+ 'y' => ':count år|:count år',
+ 'month' => ':count månad|:count månader',
+ 'm' => ':count månad|:count månader',
+ 'week' => ':count vecka|:count veckor',
+ 'w' => ':count vecka|:count veckor',
+ 'day' => ':count dag|:count dagar',
+ 'd' => ':count dag|:count dagar',
+ 'hour' => ':count timme|:count timmar',
+ 'h' => ':count timme|:count timmar',
+ 'minute' => ':count minut|:count minuter',
+ 'min' => ':count minut|:count minuter',
+ 'second' => ':count sekund|:count sekunder',
+ 's' => ':count sekund|:count sekunder',
+ 'ago' => ':time sedan',
+ 'from_now' => 'om :time',
+ 'after' => ':time efter',
+ 'before' => ':time före',
+);
diff --git a/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/sw.php b/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/sw.php
new file mode 100644
index 0000000..52f0342
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/sw.php
@@ -0,0 +1,31 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+return array(
+ 'year' => 'mwaka 1|miaka :count',
+ 'y' => 'mwaka 1|miaka :count',
+ 'month' => 'mwezi 1|miezi :count',
+ 'm' => 'mwezi 1|miezi :count',
+ 'week' => 'wiki 1|wiki :count',
+ 'w' => 'wiki 1|wiki :count',
+ 'day' => 'siku 1|siku :count',
+ 'd' => 'siku 1|siku :count',
+ 'hour' => 'saa 1|masaa :count',
+ 'h' => 'saa 1|masaa :count',
+ 'minute' => 'dakika 1|dakika :count',
+ 'min' => 'dakika 1|dakika :count',
+ 'second' => 'sekunde 1|sekunde :count',
+ 's' => 'sekunde 1|sekunde :count',
+ 'ago' => ':time ziliyopita',
+ 'from_now' => ':time kwanzia sasa',
+ 'after' => ':time baada',
+ 'before' => ':time kabla',
+);
diff --git a/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/th.php b/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/th.php
new file mode 100644
index 0000000..88bb4ac
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/th.php
@@ -0,0 +1,31 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+return array(
+ 'year' => ':count ปี',
+ 'y' => ':count ปี',
+ 'month' => ':count เดืà¸à¸™',
+ 'm' => ':count เดืà¸à¸™',
+ 'week' => ':count สัปดาห์',
+ 'w' => ':count สัปดาห์',
+ 'day' => ':count วัน',
+ 'd' => ':count วัน',
+ 'hour' => ':count ชั่วโมง',
+ 'h' => ':count ชั่วโมง',
+ 'minute' => ':count นาที',
+ 'min' => ':count นาที',
+ 'second' => ':count วินาที',
+ 's' => ':count วินาที',
+ 'ago' => ':timeที่à¹à¸¥à¹‰à¸§',
+ 'from_now' => ':timeต่à¸à¸ˆà¸²à¸à¸™à¸µà¹‰',
+ 'after' => ':timeหลังจาà¸à¸™à¸µà¹‰',
+ 'before' => ':timeà¸à¹ˆà¸à¸™',
+);
diff --git a/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/tr.php b/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/tr.php
new file mode 100644
index 0000000..6a9dfed
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/tr.php
@@ -0,0 +1,31 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+return array(
+ 'year' => ':count yıl',
+ 'y' => ':count yıl',
+ 'month' => ':count ay',
+ 'm' => ':count ay',
+ 'week' => ':count hafta',
+ 'w' => ':count hafta',
+ 'day' => ':count gün',
+ 'd' => ':count gün',
+ 'hour' => ':count saat',
+ 'h' => ':count saat',
+ 'minute' => ':count dakika',
+ 'min' => ':count dakika',
+ 'second' => ':count saniye',
+ 's' => ':count saniye',
+ 'ago' => ':time önce',
+ 'from_now' => ':time sonra',
+ 'after' => ':time sonra',
+ 'before' => ':time önce',
+);
diff --git a/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/uk.php b/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/uk.php
new file mode 100644
index 0000000..8d08eaa
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/uk.php
@@ -0,0 +1,40 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+return array(
+ 'year' => ':count рік|:count роки|:count років',
+ 'y' => ':count рік|:count роки|:count років',
+ 'month' => ':count міÑÑць|:count міÑÑці|:count міÑÑців',
+ 'm' => ':count міÑÑць|:count міÑÑці|:count міÑÑців',
+ 'week' => ':count тиждень|:count тижні|:count тижнів',
+ 'w' => ':count тиждень|:count тижні|:count тижнів',
+ 'day' => ':count день|:count дні|:count днів',
+ 'd' => ':count день|:count дні|:count днів',
+ 'hour' => ':count година|:count години|:count годин',
+ 'h' => ':count година|:count години|:count годин',
+ 'minute' => ':count хвилину|:count хвилини|:count хвилин',
+ 'min' => ':count хвилину|:count хвилини|:count хвилин',
+ 'second' => ':count Ñекунду|:count Ñекунди|:count Ñекунд',
+ 's' => ':count Ñекунду|:count Ñекунди|:count Ñекунд',
+ 'ago' => ':time тому',
+ 'from_now' => 'через :time',
+ 'after' => ':time піÑлÑ',
+ 'before' => ':time до',
+ 'diff_now' => 'щойно',
+ 'diff_yesterday' => 'вчора',
+ 'diff_tomorrow' => 'завтра',
+ 'diff_before_yesterday' => 'позавчора',
+ 'diff_after_tomorrow' => 'піÑлÑзавтра',
+ 'period_recurrences' => 'один раз|:count рази|:count разів',
+ 'period_interval' => 'кожні :interval',
+ 'period_start_date' => 'з :date',
+ 'period_end_date' => 'до :date',
+);
diff --git a/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/ur.php b/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/ur.php
new file mode 100644
index 0000000..3c5f7ed
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/ur.php
@@ -0,0 +1,24 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+return array(
+ 'year' => ':count سال',
+ 'month' => ':count ماه',
+ 'week' => ':count ÛÙØªÛ’',
+ 'day' => ':count روز',
+ 'hour' => ':count گھنٹے',
+ 'minute' => ':count منٹ',
+ 'second' => ':count سیکنڈ',
+ 'ago' => ':time Ù¾ÛÙ„Û’',
+ 'from_now' => ':time بعد',
+ 'after' => ':time بعد',
+ 'before' => ':time Ù¾ÛÙ„Û’',
+);
diff --git a/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/uz.php b/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/uz.php
new file mode 100644
index 0000000..1cb6f71
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/uz.php
@@ -0,0 +1,31 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+return array(
+ 'year' => ':count yil',
+ 'y' => ':count yil',
+ 'month' => ':count oy',
+ 'm' => ':count oy',
+ 'week' => ':count hafta',
+ 'w' => ':count hafta',
+ 'day' => ':count kun',
+ 'd' => ':count kun',
+ 'hour' => ':count soat',
+ 'h' => ':count soat',
+ 'minute' => ':count daqiqa',
+ 'min' => ':count daq',
+ 'second' => ':count soniya',
+ 's' => ':count s',
+ 'ago' => ':time avval',
+ 'from_now' => ':time dan keyin',
+ 'after' => ':time keyin',
+ 'before' => ':time oldin',
+);
diff --git a/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/vi.php b/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/vi.php
new file mode 100644
index 0000000..3f9838d
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/vi.php
@@ -0,0 +1,31 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+return array(
+ 'year' => ':count năm',
+ 'y' => ':count năm',
+ 'month' => ':count tháng',
+ 'm' => ':count tháng',
+ 'week' => ':count tuần',
+ 'w' => ':count tuần',
+ 'day' => ':count ngà y',
+ 'd' => ':count ngà y',
+ 'hour' => ':count giá»',
+ 'h' => ':count giá»',
+ 'minute' => ':count phút',
+ 'min' => ':count phút',
+ 'second' => ':count giây',
+ 's' => ':count giây',
+ 'ago' => ':time trước',
+ 'from_now' => ':time từ bây giá»',
+ 'after' => ':time sau',
+ 'before' => ':time trước',
+);
diff --git a/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/zh.php b/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/zh.php
new file mode 100644
index 0000000..9e1f6ca
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/zh.php
@@ -0,0 +1,31 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+return array(
+ 'year' => ':countå¹´',
+ 'y' => ':countå¹´',
+ 'month' => ':count个月',
+ 'm' => ':count个月',
+ 'week' => ':count周',
+ 'w' => ':count周',
+ 'day' => ':count天',
+ 'd' => ':count天',
+ 'hour' => ':countå°æ—¶',
+ 'h' => ':countå°æ—¶',
+ 'minute' => ':count分钟',
+ 'min' => ':count分钟',
+ 'second' => ':countç§’',
+ 's' => ':countç§’',
+ 'ago' => ':timeå‰',
+ 'from_now' => 'è·çŽ°åœ¨:time',
+ 'after' => ':timeåŽ',
+ 'before' => ':timeå‰',
+);
diff --git a/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/zh_TW.php b/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/zh_TW.php
new file mode 100644
index 0000000..c848723
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Lang/zh_TW.php
@@ -0,0 +1,31 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+return array(
+ 'year' => ':countå¹´',
+ 'y' => ':countå¹´',
+ 'month' => ':count月',
+ 'm' => ':count月',
+ 'week' => ':count週',
+ 'w' => ':count週',
+ 'day' => ':count天',
+ 'd' => ':count天',
+ 'hour' => ':countå°æ™‚',
+ 'h' => ':countå°æ™‚',
+ 'minute' => ':count分é˜',
+ 'min' => ':count分é˜',
+ 'second' => ':countç§’',
+ 's' => ':countç§’',
+ 'ago' => ':timeå‰',
+ 'from_now' => 'è·ç¾åœ¨:time',
+ 'after' => ':time後',
+ 'before' => ':timeå‰',
+);
diff --git a/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Laravel/ServiceProvider.php b/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Laravel/ServiceProvider.php
new file mode 100644
index 0000000..4d83b0c
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Laravel/ServiceProvider.php
@@ -0,0 +1,37 @@
+app['events'];
+ if ($events instanceof EventDispatcher || $events instanceof Dispatcher) {
+ $events->listen(class_exists('Illuminate\Foundation\Events\LocaleUpdated') ? 'Illuminate\Foundation\Events\LocaleUpdated' : 'locale.changed', function () use ($service) {
+ $service->updateLocale();
+ });
+ $service->updateLocale();
+ }
+ }
+
+ public function updateLocale()
+ {
+ $translator = $this->app['translator'];
+ if ($translator instanceof Translator || $translator instanceof IlluminateTranslator) {
+ Carbon::setLocale($translator->getLocale());
+ }
+ }
+
+ public function register()
+ {
+ // Needed for Laravel < 5.3 compatibility
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Translator.php b/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Translator.php
new file mode 100644
index 0000000..12115b0
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Translator.php
@@ -0,0 +1,143 @@
+addLoader('array', new Translation\Loader\ArrayLoader());
+ parent::__construct($locale, $formatter, $cacheDir, $debug);
+ }
+
+ /**
+ * Reset messages of a locale (all locale if no locale passed).
+ * Remove custom messages and reload initial messages from matching
+ * file in Lang directory.
+ *
+ * @param string|null $locale
+ *
+ * @return bool
+ */
+ public function resetMessages($locale = null)
+ {
+ if ($locale === null) {
+ static::$messages = array();
+
+ return true;
+ }
+
+ if (file_exists($filename = __DIR__.'/Lang/'.$locale.'.php')) {
+ static::$messages[$locale] = require $filename;
+ $this->addResource('array', static::$messages[$locale], $locale);
+
+ return true;
+ }
+
+ return false;
+ }
+
+ /**
+ * Init messages language from matching file in Lang directory.
+ *
+ * @param string $locale
+ *
+ * @return bool
+ */
+ protected function loadMessagesFromFile($locale)
+ {
+ if (isset(static::$messages[$locale])) {
+ return true;
+ }
+
+ return $this->resetMessages($locale);
+ }
+
+ /**
+ * Set messages of a locale and take file first if present.
+ *
+ * @param string $locale
+ * @param array $messages
+ *
+ * @return $this
+ */
+ public function setMessages($locale, $messages)
+ {
+ $this->loadMessagesFromFile($locale);
+ $this->addResource('array', $messages, $locale);
+ static::$messages[$locale] = array_merge(
+ isset(static::$messages[$locale]) ? static::$messages[$locale] : array(),
+ $messages
+ );
+
+ return $this;
+ }
+
+ /**
+ * Get messages of a locale, if none given, return all the
+ * languages.
+ *
+ * @param string|null $locale
+ *
+ * @return array
+ */
+ public function getMessages($locale = null)
+ {
+ return $locale === null ? static::$messages : static::$messages[$locale];
+ }
+
+ /**
+ * Set the current translator locale and indicate if the source locale file exists
+ *
+ * @param string $locale locale ex. en
+ *
+ * @return bool
+ */
+ public function setLocale($locale)
+ {
+ $locale = preg_replace_callback('/[-_]([a-z]{2,})/', function ($matches) {
+ // _2-letters is a region, _3+-letters is a variant
+ return '_'.call_user_func(strlen($matches[1]) > 2 ? 'ucfirst' : 'strtoupper', $matches[1]);
+ }, strtolower($locale));
+
+ if ($this->loadMessagesFromFile($locale)) {
+ parent::setLocale($locale);
+
+ return true;
+ }
+
+ return false;
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Upgrade.php b/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Upgrade.php
new file mode 100644
index 0000000..26449ff
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/Carbon/Upgrade.php
@@ -0,0 +1,150 @@
+ '5.8.0',
+ 'laravel/cashier' => '9.0.1',
+ 'illuminate/support' => '5.8.0',
+ 'laravel/dusk' => '5.0.0',
+ );
+
+ protected static $otherLibraries = array(
+ 'spatie/laravel-analytics' => '3.6.4',
+ 'jenssegers/date' => '3.5.0',
+ );
+
+ /**
+ * @param \UpdateHelper\UpdateHelper $helper
+ */
+ public function check(UpdateHelper $helper)
+ {
+ $helper->write(array(
+ 'Carbon 1 is deprecated, see how to migrate to Carbon 2.',
+ 'https://carbon.nesbot.com/docs/#api-carbon-2',
+ ));
+
+ if (static::SUGGEST_ON_UPDATE || static::ASK_ON_UPDATE || $helper->getIo()->isVerbose()) {
+ $laravelUpdate = array();
+
+ foreach (static::$laravelLibraries as $name => $version) {
+ if ($helper->hasAsDependency($name) && $helper->isDependencyLesserThan($name, $version)) {
+ $laravelUpdate[$name] = $version;
+ }
+ }
+
+ if (count($laravelUpdate)) {
+ $output = array(
+ ' Please consider upgrading your Laravel dependencies to be compatible with Carbon 2:',
+ );
+
+ foreach ($laravelUpdate as $name => $version) {
+ $output[] = " - $name at least to version $version";
+ }
+
+ $output[] = '';
+ $output[] = " If you can't update Laravel, check https://carbon.nesbot.com/ to see how to";
+ $output[] = ' install Carbon 2 using alias version and our adapter kylekatarnls/laravel-carbon-2';
+ $output[] = '';
+
+ $helper->write($output);
+ }
+
+ foreach (static::$otherLibraries as $name => $version) {
+ if ($helper->hasAsDependency($name) && $helper->isDependencyLesserThan($name, $version)) {
+ $helper->write(" Please consider upgrading $name at least to $version to be compatible with Carbon 2.\n");
+ }
+ }
+
+ if (static::ASK_ON_UPDATE) {
+ static::askForUpgrade($helper);
+
+ return;
+ }
+ }
+
+ $path = implode(DIRECTORY_SEPARATOR, array('.', 'vendor', 'bin', 'upgrade-carbon'));
+
+ if (!file_exists($path)) {
+ $path = realpath(__DIR__.'/../../bin/upgrade-carbon');
+ }
+
+ $helper->write(
+ ' You can run '.escapeshellarg($path).
+ ' to get help in updating carbon and other frameworks and libraries that depend on it.'
+ );
+ }
+
+ private static function getUpgradeQuestion($upgrades)
+ {
+ $message = "Do you want us to try the following upgrade:\n";
+
+ foreach ($upgrades as $name => $version) {
+ $message .= " - $name: $version\n";
+ }
+
+ return $message.'[Y/N] ';
+ }
+
+ public static function askForUpgrade(UpdateHelper $helper, $upgradeIfNotInteractive = false)
+ {
+ $upgrades = array(
+ 'nesbot/carbon' => '^2.0.0',
+ );
+
+ foreach (array(static::$laravelLibraries, static::$otherLibraries) as $libraries) {
+ foreach ($libraries as $name => $version) {
+ if ($helper->hasAsDependency($name) && $helper->isDependencyLesserThan($name, $version)) {
+ $upgrades[$name] = "^$version";
+ }
+ }
+ }
+
+ $shouldUpgrade = $helper->isInteractive()
+ ? $helper->getIo()->askConfirmation(static::getUpgradeQuestion($upgrades))
+ : $upgradeIfNotInteractive;
+
+ if ($shouldUpgrade) {
+ $helper->setDependencyVersions($upgrades)->update();
+ }
+ }
+
+ public static function upgrade(ScriptEvent $event = null)
+ {
+ if (!$event) {
+ $composer = new Composer();
+ $baseDir = __DIR__.'/../..';
+
+ if (file_exists("$baseDir/autoload.php")) {
+ $baseDir .= '/..';
+ }
+
+ $composer->setConfig(new Config(true, $baseDir));
+ $event = new ScriptEvent(
+ 'upgrade-carbon',
+ $composer,
+ new ConsoleIO(new StringInput(''), new ConsoleOutput(), new HelperSet(array(
+ new QuestionHelper(),
+ )))
+ );
+ }
+
+ static::askForUpgrade(new UpdateHelper($event), true);
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/JsonSerializable.php b/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/JsonSerializable.php
new file mode 100644
index 0000000..d34060b
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/nesbot/carbon/src/JsonSerializable.php
@@ -0,0 +1,18 @@
+json_encode,
+ * which is a value of any type other than a resource.
+ *
+ * @since 5.4.0
+ */
+ public function jsonSerialize();
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/polyfill-mbstring/LICENSE b/plugins/vdomah/jwtauth/vendor/symfony/polyfill-mbstring/LICENSE
new file mode 100644
index 0000000..4cd8bdd
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/polyfill-mbstring/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2015-2019 Fabien Potencier
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is furnished
+to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/polyfill-mbstring/Mbstring.php b/plugins/vdomah/jwtauth/vendor/symfony/polyfill-mbstring/Mbstring.php
new file mode 100644
index 0000000..15503bc
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/polyfill-mbstring/Mbstring.php
@@ -0,0 +1,847 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Polyfill\Mbstring;
+
+/**
+ * Partial mbstring implementation in PHP, iconv based, UTF-8 centric.
+ *
+ * Implemented:
+ * - mb_chr - Returns a specific character from its Unicode code point
+ * - mb_convert_encoding - Convert character encoding
+ * - mb_convert_variables - Convert character code in variable(s)
+ * - mb_decode_mimeheader - Decode string in MIME header field
+ * - mb_encode_mimeheader - Encode string for MIME header XXX NATIVE IMPLEMENTATION IS REALLY BUGGED
+ * - mb_decode_numericentity - Decode HTML numeric string reference to character
+ * - mb_encode_numericentity - Encode character to HTML numeric string reference
+ * - mb_convert_case - Perform case folding on a string
+ * - mb_detect_encoding - Detect character encoding
+ * - mb_get_info - Get internal settings of mbstring
+ * - mb_http_input - Detect HTTP input character encoding
+ * - mb_http_output - Set/Get HTTP output character encoding
+ * - mb_internal_encoding - Set/Get internal character encoding
+ * - mb_list_encodings - Returns an array of all supported encodings
+ * - mb_ord - Returns the Unicode code point of a character
+ * - mb_output_handler - Callback function converts character encoding in output buffer
+ * - mb_scrub - Replaces ill-formed byte sequences with substitute characters
+ * - mb_strlen - Get string length
+ * - mb_strpos - Find position of first occurrence of string in a string
+ * - mb_strrpos - Find position of last occurrence of a string in a string
+ * - mb_str_split - Convert a string to an array
+ * - mb_strtolower - Make a string lowercase
+ * - mb_strtoupper - Make a string uppercase
+ * - mb_substitute_character - Set/Get substitution character
+ * - mb_substr - Get part of string
+ * - mb_stripos - Finds position of first occurrence of a string within another, case insensitive
+ * - mb_stristr - Finds first occurrence of a string within another, case insensitive
+ * - mb_strrchr - Finds the last occurrence of a character in a string within another
+ * - mb_strrichr - Finds the last occurrence of a character in a string within another, case insensitive
+ * - mb_strripos - Finds position of last occurrence of a string within another, case insensitive
+ * - mb_strstr - Finds first occurrence of a string within another
+ * - mb_strwidth - Return width of string
+ * - mb_substr_count - Count the number of substring occurrences
+ *
+ * Not implemented:
+ * - mb_convert_kana - Convert "kana" one from another ("zen-kaku", "han-kaku" and more)
+ * - mb_ereg_* - Regular expression with multibyte support
+ * - mb_parse_str - Parse GET/POST/COOKIE data and set global variable
+ * - mb_preferred_mime_name - Get MIME charset string
+ * - mb_regex_encoding - Returns current encoding for multibyte regex as string
+ * - mb_regex_set_options - Set/Get the default options for mbregex functions
+ * - mb_send_mail - Send encoded mail
+ * - mb_split - Split multibyte string using regular expression
+ * - mb_strcut - Get part of string
+ * - mb_strimwidth - Get truncated string with specified width
+ *
+ * @author Nicolas Grekas
+ *
+ * @internal
+ */
+final class Mbstring
+{
+ const MB_CASE_FOLD = PHP_INT_MAX;
+
+ private static $encodingList = array('ASCII', 'UTF-8');
+ private static $language = 'neutral';
+ private static $internalEncoding = 'UTF-8';
+ private static $caseFold = array(
+ array('µ', 'ſ', "\xCD\x85", 'ς', "\xCF\x90", "\xCF\x91", "\xCF\x95", "\xCF\x96", "\xCF\xB0", "\xCF\xB1", "\xCF\xB5", "\xE1\xBA\x9B", "\xE1\xBE\xBE"),
+ array('μ', 's', 'ι', 'σ', 'β', 'θ', 'φ', 'Ï€', 'κ', 'Ï', 'ε', "\xE1\xB9\xA1", 'ι'),
+ );
+
+ public static function mb_convert_encoding($s, $toEncoding, $fromEncoding = null)
+ {
+ if (\is_array($fromEncoding) || false !== strpos($fromEncoding, ',')) {
+ $fromEncoding = self::mb_detect_encoding($s, $fromEncoding);
+ } else {
+ $fromEncoding = self::getEncoding($fromEncoding);
+ }
+
+ $toEncoding = self::getEncoding($toEncoding);
+
+ if ('BASE64' === $fromEncoding) {
+ $s = base64_decode($s);
+ $fromEncoding = $toEncoding;
+ }
+
+ if ('BASE64' === $toEncoding) {
+ return base64_encode($s);
+ }
+
+ if ('HTML-ENTITIES' === $toEncoding || 'HTML' === $toEncoding) {
+ if ('HTML-ENTITIES' === $fromEncoding || 'HTML' === $fromEncoding) {
+ $fromEncoding = 'Windows-1252';
+ }
+ if ('UTF-8' !== $fromEncoding) {
+ $s = iconv($fromEncoding, 'UTF-8//IGNORE', $s);
+ }
+
+ return preg_replace_callback('/[\x80-\xFF]+/', array(__CLASS__, 'html_encoding_callback'), $s);
+ }
+
+ if ('HTML-ENTITIES' === $fromEncoding) {
+ $s = html_entity_decode($s, ENT_COMPAT, 'UTF-8');
+ $fromEncoding = 'UTF-8';
+ }
+
+ return iconv($fromEncoding, $toEncoding.'//IGNORE', $s);
+ }
+
+ public static function mb_convert_variables($toEncoding, $fromEncoding, &$a = null, &$b = null, &$c = null, &$d = null, &$e = null, &$f = null)
+ {
+ $vars = array(&$a, &$b, &$c, &$d, &$e, &$f);
+
+ $ok = true;
+ array_walk_recursive($vars, function (&$v) use (&$ok, $toEncoding, $fromEncoding) {
+ if (false === $v = Mbstring::mb_convert_encoding($v, $toEncoding, $fromEncoding)) {
+ $ok = false;
+ }
+ });
+
+ return $ok ? $fromEncoding : false;
+ }
+
+ public static function mb_decode_mimeheader($s)
+ {
+ return iconv_mime_decode($s, 2, self::$internalEncoding);
+ }
+
+ public static function mb_encode_mimeheader($s, $charset = null, $transferEncoding = null, $linefeed = null, $indent = null)
+ {
+ trigger_error('mb_encode_mimeheader() is bugged. Please use iconv_mime_encode() instead', E_USER_WARNING);
+ }
+
+ public static function mb_decode_numericentity($s, $convmap, $encoding = null)
+ {
+ if (null !== $s && !\is_scalar($s) && !(\is_object($s) && \method_exists($s, '__toString'))) {
+ trigger_error('mb_decode_numericentity() expects parameter 1 to be string, '.\gettype($s).' given', E_USER_WARNING);
+
+ return null;
+ }
+
+ if (!\is_array($convmap) || !$convmap) {
+ return false;
+ }
+
+ if (null !== $encoding && !\is_scalar($encoding)) {
+ trigger_error('mb_decode_numericentity() expects parameter 3 to be string, '.\gettype($s).' given', E_USER_WARNING);
+
+ return ''; // Instead of null (cf. mb_encode_numericentity).
+ }
+
+ $s = (string) $s;
+ if ('' === $s) {
+ return '';
+ }
+
+ $encoding = self::getEncoding($encoding);
+
+ if ('UTF-8' === $encoding) {
+ $encoding = null;
+ if (!preg_match('//u', $s)) {
+ $s = @iconv('UTF-8', 'UTF-8//IGNORE', $s);
+ }
+ } else {
+ $s = iconv($encoding, 'UTF-8//IGNORE', $s);
+ }
+
+ $cnt = floor(\count($convmap) / 4) * 4;
+
+ for ($i = 0; $i < $cnt; $i += 4) {
+ // collector_decode_htmlnumericentity ignores $convmap[$i + 3]
+ $convmap[$i] += $convmap[$i + 2];
+ $convmap[$i + 1] += $convmap[$i + 2];
+ }
+
+ $s = preg_replace_callback('/(?:0*([0-9]+)|x0*([0-9a-fA-F]+))(?!&);?/', function (array $m) use ($cnt, $convmap) {
+ $c = isset($m[2]) ? (int) hexdec($m[2]) : $m[1];
+ for ($i = 0; $i < $cnt; $i += 4) {
+ if ($c >= $convmap[$i] && $c <= $convmap[$i + 1]) {
+ return Mbstring::mb_chr($c - $convmap[$i + 2]);
+ }
+ }
+
+ return $m[0];
+ }, $s);
+
+ if (null === $encoding) {
+ return $s;
+ }
+
+ return iconv('UTF-8', $encoding.'//IGNORE', $s);
+ }
+
+ public static function mb_encode_numericentity($s, $convmap, $encoding = null, $is_hex = false)
+ {
+ if (null !== $s && !\is_scalar($s) && !(\is_object($s) && \method_exists($s, '__toString'))) {
+ trigger_error('mb_encode_numericentity() expects parameter 1 to be string, '.\gettype($s).' given', E_USER_WARNING);
+
+ return null;
+ }
+
+ if (!\is_array($convmap) || !$convmap) {
+ return false;
+ }
+
+ if (null !== $encoding && !\is_scalar($encoding)) {
+ trigger_error('mb_encode_numericentity() expects parameter 3 to be string, '.\gettype($s).' given', E_USER_WARNING);
+
+ return null; // Instead of '' (cf. mb_decode_numericentity).
+ }
+
+ if (null !== $is_hex && !\is_scalar($is_hex)) {
+ trigger_error('mb_encode_numericentity() expects parameter 4 to be boolean, '.\gettype($s).' given', E_USER_WARNING);
+
+ return null;
+ }
+
+ $s = (string) $s;
+ if ('' === $s) {
+ return '';
+ }
+
+ $encoding = self::getEncoding($encoding);
+
+ if ('UTF-8' === $encoding) {
+ $encoding = null;
+ if (!preg_match('//u', $s)) {
+ $s = @iconv('UTF-8', 'UTF-8//IGNORE', $s);
+ }
+ } else {
+ $s = iconv($encoding, 'UTF-8//IGNORE', $s);
+ }
+
+ static $ulenMask = array("\xC0" => 2, "\xD0" => 2, "\xE0" => 3, "\xF0" => 4);
+
+ $cnt = floor(\count($convmap) / 4) * 4;
+ $i = 0;
+ $len = \strlen($s);
+ $result = '';
+
+ while ($i < $len) {
+ $ulen = $s[$i] < "\x80" ? 1 : $ulenMask[$s[$i] & "\xF0"];
+ $uchr = substr($s, $i, $ulen);
+ $i += $ulen;
+ $c = self::mb_ord($uchr);
+
+ for ($j = 0; $j < $cnt; $j += 4) {
+ if ($c >= $convmap[$j] && $c <= $convmap[$j + 1]) {
+ $cOffset = ($c + $convmap[$j + 2]) & $convmap[$j + 3];
+ $result .= $is_hex ? sprintf('%X;', $cOffset) : ''.$cOffset.';';
+ continue 2;
+ }
+ }
+ $result .= $uchr;
+ }
+
+ if (null === $encoding) {
+ return $result;
+ }
+
+ return iconv('UTF-8', $encoding.'//IGNORE', $result);
+ }
+
+ public static function mb_convert_case($s, $mode, $encoding = null)
+ {
+ $s = (string) $s;
+ if ('' === $s) {
+ return '';
+ }
+
+ $encoding = self::getEncoding($encoding);
+
+ if ('UTF-8' === $encoding) {
+ $encoding = null;
+ if (!preg_match('//u', $s)) {
+ $s = @iconv('UTF-8', 'UTF-8//IGNORE', $s);
+ }
+ } else {
+ $s = iconv($encoding, 'UTF-8//IGNORE', $s);
+ }
+
+ if (MB_CASE_TITLE == $mode) {
+ static $titleRegexp = null;
+ if (null === $titleRegexp) {
+ $titleRegexp = self::getData('titleCaseRegexp');
+ }
+ $s = preg_replace_callback($titleRegexp, array(__CLASS__, 'title_case'), $s);
+ } else {
+ if (MB_CASE_UPPER == $mode) {
+ static $upper = null;
+ if (null === $upper) {
+ $upper = self::getData('upperCase');
+ }
+ $map = $upper;
+ } else {
+ if (self::MB_CASE_FOLD === $mode) {
+ $s = str_replace(self::$caseFold[0], self::$caseFold[1], $s);
+ }
+
+ static $lower = null;
+ if (null === $lower) {
+ $lower = self::getData('lowerCase');
+ }
+ $map = $lower;
+ }
+
+ static $ulenMask = array("\xC0" => 2, "\xD0" => 2, "\xE0" => 3, "\xF0" => 4);
+
+ $i = 0;
+ $len = \strlen($s);
+
+ while ($i < $len) {
+ $ulen = $s[$i] < "\x80" ? 1 : $ulenMask[$s[$i] & "\xF0"];
+ $uchr = substr($s, $i, $ulen);
+ $i += $ulen;
+
+ if (isset($map[$uchr])) {
+ $uchr = $map[$uchr];
+ $nlen = \strlen($uchr);
+
+ if ($nlen == $ulen) {
+ $nlen = $i;
+ do {
+ $s[--$nlen] = $uchr[--$ulen];
+ } while ($ulen);
+ } else {
+ $s = substr_replace($s, $uchr, $i - $ulen, $ulen);
+ $len += $nlen - $ulen;
+ $i += $nlen - $ulen;
+ }
+ }
+ }
+ }
+
+ if (null === $encoding) {
+ return $s;
+ }
+
+ return iconv('UTF-8', $encoding.'//IGNORE', $s);
+ }
+
+ public static function mb_internal_encoding($encoding = null)
+ {
+ if (null === $encoding) {
+ return self::$internalEncoding;
+ }
+
+ $encoding = self::getEncoding($encoding);
+
+ if ('UTF-8' === $encoding || false !== @iconv($encoding, $encoding, ' ')) {
+ self::$internalEncoding = $encoding;
+
+ return true;
+ }
+
+ return false;
+ }
+
+ public static function mb_language($lang = null)
+ {
+ if (null === $lang) {
+ return self::$language;
+ }
+
+ switch ($lang = strtolower($lang)) {
+ case 'uni':
+ case 'neutral':
+ self::$language = $lang;
+
+ return true;
+ }
+
+ return false;
+ }
+
+ public static function mb_list_encodings()
+ {
+ return array('UTF-8');
+ }
+
+ public static function mb_encoding_aliases($encoding)
+ {
+ switch (strtoupper($encoding)) {
+ case 'UTF8':
+ case 'UTF-8':
+ return array('utf8');
+ }
+
+ return false;
+ }
+
+ public static function mb_check_encoding($var = null, $encoding = null)
+ {
+ if (null === $encoding) {
+ if (null === $var) {
+ return false;
+ }
+ $encoding = self::$internalEncoding;
+ }
+
+ return self::mb_detect_encoding($var, array($encoding)) || false !== @iconv($encoding, $encoding, $var);
+ }
+
+ public static function mb_detect_encoding($str, $encodingList = null, $strict = false)
+ {
+ if (null === $encodingList) {
+ $encodingList = self::$encodingList;
+ } else {
+ if (!\is_array($encodingList)) {
+ $encodingList = array_map('trim', explode(',', $encodingList));
+ }
+ $encodingList = array_map('strtoupper', $encodingList);
+ }
+
+ foreach ($encodingList as $enc) {
+ switch ($enc) {
+ case 'ASCII':
+ if (!preg_match('/[\x80-\xFF]/', $str)) {
+ return $enc;
+ }
+ break;
+
+ case 'UTF8':
+ case 'UTF-8':
+ if (preg_match('//u', $str)) {
+ return 'UTF-8';
+ }
+ break;
+
+ default:
+ if (0 === strncmp($enc, 'ISO-8859-', 9)) {
+ return $enc;
+ }
+ }
+ }
+
+ return false;
+ }
+
+ public static function mb_detect_order($encodingList = null)
+ {
+ if (null === $encodingList) {
+ return self::$encodingList;
+ }
+
+ if (!\is_array($encodingList)) {
+ $encodingList = array_map('trim', explode(',', $encodingList));
+ }
+ $encodingList = array_map('strtoupper', $encodingList);
+
+ foreach ($encodingList as $enc) {
+ switch ($enc) {
+ default:
+ if (strncmp($enc, 'ISO-8859-', 9)) {
+ return false;
+ }
+ // no break
+ case 'ASCII':
+ case 'UTF8':
+ case 'UTF-8':
+ }
+ }
+
+ self::$encodingList = $encodingList;
+
+ return true;
+ }
+
+ public static function mb_strlen($s, $encoding = null)
+ {
+ $encoding = self::getEncoding($encoding);
+ if ('CP850' === $encoding || 'ASCII' === $encoding) {
+ return \strlen($s);
+ }
+
+ return @iconv_strlen($s, $encoding);
+ }
+
+ public static function mb_strpos($haystack, $needle, $offset = 0, $encoding = null)
+ {
+ $encoding = self::getEncoding($encoding);
+ if ('CP850' === $encoding || 'ASCII' === $encoding) {
+ return strpos($haystack, $needle, $offset);
+ }
+
+ $needle = (string) $needle;
+ if ('' === $needle) {
+ trigger_error(__METHOD__.': Empty delimiter', E_USER_WARNING);
+
+ return false;
+ }
+
+ return iconv_strpos($haystack, $needle, $offset, $encoding);
+ }
+
+ public static function mb_strrpos($haystack, $needle, $offset = 0, $encoding = null)
+ {
+ $encoding = self::getEncoding($encoding);
+ if ('CP850' === $encoding || 'ASCII' === $encoding) {
+ return strrpos($haystack, $needle, $offset);
+ }
+
+ if ($offset != (int) $offset) {
+ $offset = 0;
+ } elseif ($offset = (int) $offset) {
+ if ($offset < 0) {
+ if (0 > $offset += self::mb_strlen($needle)) {
+ $haystack = self::mb_substr($haystack, 0, $offset, $encoding);
+ }
+ $offset = 0;
+ } else {
+ $haystack = self::mb_substr($haystack, $offset, 2147483647, $encoding);
+ }
+ }
+
+ $pos = iconv_strrpos($haystack, $needle, $encoding);
+
+ return false !== $pos ? $offset + $pos : false;
+ }
+
+ public static function mb_str_split($string, $split_length = 1, $encoding = null)
+ {
+ if (null !== $string && !\is_scalar($string) && !(\is_object($string) && \method_exists($string, '__toString'))) {
+ trigger_error('mb_str_split() expects parameter 1 to be string, '.\gettype($string).' given', E_USER_WARNING);
+
+ return null;
+ }
+
+ if (1 > $split_length = (int) $split_length) {
+ trigger_error('The length of each segment must be greater than zero', E_USER_WARNING);
+
+ return false;
+ }
+
+ if (null === $encoding) {
+ $encoding = mb_internal_encoding();
+ }
+
+ if ('UTF-8' === $encoding = self::getEncoding($encoding)) {
+ $rx = '/(';
+ while (65535 < $split_length) {
+ $rx .= '.{65535}';
+ $split_length -= 65535;
+ }
+ $rx .= '.{'.$split_length.'})/us';
+
+ return preg_split($rx, $string, null, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
+ }
+
+ $result = array();
+ $length = mb_strlen($string, $encoding);
+
+ for ($i = 0; $i < $length; $i += $split_length) {
+ $result[] = mb_substr($string, $i, $split_length, $encoding);
+ }
+
+ return $result;
+ }
+
+ public static function mb_strtolower($s, $encoding = null)
+ {
+ return self::mb_convert_case($s, MB_CASE_LOWER, $encoding);
+ }
+
+ public static function mb_strtoupper($s, $encoding = null)
+ {
+ return self::mb_convert_case($s, MB_CASE_UPPER, $encoding);
+ }
+
+ public static function mb_substitute_character($c = null)
+ {
+ if (0 === strcasecmp($c, 'none')) {
+ return true;
+ }
+
+ return null !== $c ? false : 'none';
+ }
+
+ public static function mb_substr($s, $start, $length = null, $encoding = null)
+ {
+ $encoding = self::getEncoding($encoding);
+ if ('CP850' === $encoding || 'ASCII' === $encoding) {
+ return (string) substr($s, $start, null === $length ? 2147483647 : $length);
+ }
+
+ if ($start < 0) {
+ $start = iconv_strlen($s, $encoding) + $start;
+ if ($start < 0) {
+ $start = 0;
+ }
+ }
+
+ if (null === $length) {
+ $length = 2147483647;
+ } elseif ($length < 0) {
+ $length = iconv_strlen($s, $encoding) + $length - $start;
+ if ($length < 0) {
+ return '';
+ }
+ }
+
+ return (string) iconv_substr($s, $start, $length, $encoding);
+ }
+
+ public static function mb_stripos($haystack, $needle, $offset = 0, $encoding = null)
+ {
+ $haystack = self::mb_convert_case($haystack, self::MB_CASE_FOLD, $encoding);
+ $needle = self::mb_convert_case($needle, self::MB_CASE_FOLD, $encoding);
+
+ return self::mb_strpos($haystack, $needle, $offset, $encoding);
+ }
+
+ public static function mb_stristr($haystack, $needle, $part = false, $encoding = null)
+ {
+ $pos = self::mb_stripos($haystack, $needle, 0, $encoding);
+
+ return self::getSubpart($pos, $part, $haystack, $encoding);
+ }
+
+ public static function mb_strrchr($haystack, $needle, $part = false, $encoding = null)
+ {
+ $encoding = self::getEncoding($encoding);
+ if ('CP850' === $encoding || 'ASCII' === $encoding) {
+ return strrchr($haystack, $needle, $part);
+ }
+ $needle = self::mb_substr($needle, 0, 1, $encoding);
+ $pos = iconv_strrpos($haystack, $needle, $encoding);
+
+ return self::getSubpart($pos, $part, $haystack, $encoding);
+ }
+
+ public static function mb_strrichr($haystack, $needle, $part = false, $encoding = null)
+ {
+ $needle = self::mb_substr($needle, 0, 1, $encoding);
+ $pos = self::mb_strripos($haystack, $needle, $encoding);
+
+ return self::getSubpart($pos, $part, $haystack, $encoding);
+ }
+
+ public static function mb_strripos($haystack, $needle, $offset = 0, $encoding = null)
+ {
+ $haystack = self::mb_convert_case($haystack, self::MB_CASE_FOLD, $encoding);
+ $needle = self::mb_convert_case($needle, self::MB_CASE_FOLD, $encoding);
+
+ return self::mb_strrpos($haystack, $needle, $offset, $encoding);
+ }
+
+ public static function mb_strstr($haystack, $needle, $part = false, $encoding = null)
+ {
+ $pos = strpos($haystack, $needle);
+ if (false === $pos) {
+ return false;
+ }
+ if ($part) {
+ return substr($haystack, 0, $pos);
+ }
+
+ return substr($haystack, $pos);
+ }
+
+ public static function mb_get_info($type = 'all')
+ {
+ $info = array(
+ 'internal_encoding' => self::$internalEncoding,
+ 'http_output' => 'pass',
+ 'http_output_conv_mimetypes' => '^(text/|application/xhtml\+xml)',
+ 'func_overload' => 0,
+ 'func_overload_list' => 'no overload',
+ 'mail_charset' => 'UTF-8',
+ 'mail_header_encoding' => 'BASE64',
+ 'mail_body_encoding' => 'BASE64',
+ 'illegal_chars' => 0,
+ 'encoding_translation' => 'Off',
+ 'language' => self::$language,
+ 'detect_order' => self::$encodingList,
+ 'substitute_character' => 'none',
+ 'strict_detection' => 'Off',
+ );
+
+ if ('all' === $type) {
+ return $info;
+ }
+ if (isset($info[$type])) {
+ return $info[$type];
+ }
+
+ return false;
+ }
+
+ public static function mb_http_input($type = '')
+ {
+ return false;
+ }
+
+ public static function mb_http_output($encoding = null)
+ {
+ return null !== $encoding ? 'pass' === $encoding : 'pass';
+ }
+
+ public static function mb_strwidth($s, $encoding = null)
+ {
+ $encoding = self::getEncoding($encoding);
+
+ if ('UTF-8' !== $encoding) {
+ $s = iconv($encoding, 'UTF-8//IGNORE', $s);
+ }
+
+ $s = preg_replace('/[\x{1100}-\x{115F}\x{2329}\x{232A}\x{2E80}-\x{303E}\x{3040}-\x{A4CF}\x{AC00}-\x{D7A3}\x{F900}-\x{FAFF}\x{FE10}-\x{FE19}\x{FE30}-\x{FE6F}\x{FF00}-\x{FF60}\x{FFE0}-\x{FFE6}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}]/u', '', $s, -1, $wide);
+
+ return ($wide << 1) + iconv_strlen($s, 'UTF-8');
+ }
+
+ public static function mb_substr_count($haystack, $needle, $encoding = null)
+ {
+ return substr_count($haystack, $needle);
+ }
+
+ public static function mb_output_handler($contents, $status)
+ {
+ return $contents;
+ }
+
+ public static function mb_chr($code, $encoding = null)
+ {
+ if (0x80 > $code %= 0x200000) {
+ $s = \chr($code);
+ } elseif (0x800 > $code) {
+ $s = \chr(0xC0 | $code >> 6).\chr(0x80 | $code & 0x3F);
+ } elseif (0x10000 > $code) {
+ $s = \chr(0xE0 | $code >> 12).\chr(0x80 | $code >> 6 & 0x3F).\chr(0x80 | $code & 0x3F);
+ } else {
+ $s = \chr(0xF0 | $code >> 18).\chr(0x80 | $code >> 12 & 0x3F).\chr(0x80 | $code >> 6 & 0x3F).\chr(0x80 | $code & 0x3F);
+ }
+
+ if ('UTF-8' !== $encoding = self::getEncoding($encoding)) {
+ $s = mb_convert_encoding($s, $encoding, 'UTF-8');
+ }
+
+ return $s;
+ }
+
+ public static function mb_ord($s, $encoding = null)
+ {
+ if ('UTF-8' !== $encoding = self::getEncoding($encoding)) {
+ $s = mb_convert_encoding($s, 'UTF-8', $encoding);
+ }
+
+ if (1 === \strlen($s)) {
+ return \ord($s);
+ }
+
+ $code = ($s = unpack('C*', substr($s, 0, 4))) ? $s[1] : 0;
+ if (0xF0 <= $code) {
+ return (($code - 0xF0) << 18) + (($s[2] - 0x80) << 12) + (($s[3] - 0x80) << 6) + $s[4] - 0x80;
+ }
+ if (0xE0 <= $code) {
+ return (($code - 0xE0) << 12) + (($s[2] - 0x80) << 6) + $s[3] - 0x80;
+ }
+ if (0xC0 <= $code) {
+ return (($code - 0xC0) << 6) + $s[2] - 0x80;
+ }
+
+ return $code;
+ }
+
+ private static function getSubpart($pos, $part, $haystack, $encoding)
+ {
+ if (false === $pos) {
+ return false;
+ }
+ if ($part) {
+ return self::mb_substr($haystack, 0, $pos, $encoding);
+ }
+
+ return self::mb_substr($haystack, $pos, null, $encoding);
+ }
+
+ private static function html_encoding_callback(array $m)
+ {
+ $i = 1;
+ $entities = '';
+ $m = unpack('C*', htmlentities($m[0], ENT_COMPAT, 'UTF-8'));
+
+ while (isset($m[$i])) {
+ if (0x80 > $m[$i]) {
+ $entities .= \chr($m[$i++]);
+ continue;
+ }
+ if (0xF0 <= $m[$i]) {
+ $c = (($m[$i++] - 0xF0) << 18) + (($m[$i++] - 0x80) << 12) + (($m[$i++] - 0x80) << 6) + $m[$i++] - 0x80;
+ } elseif (0xE0 <= $m[$i]) {
+ $c = (($m[$i++] - 0xE0) << 12) + (($m[$i++] - 0x80) << 6) + $m[$i++] - 0x80;
+ } else {
+ $c = (($m[$i++] - 0xC0) << 6) + $m[$i++] - 0x80;
+ }
+
+ $entities .= ''.$c.';';
+ }
+
+ return $entities;
+ }
+
+ private static function title_case(array $s)
+ {
+ return self::mb_convert_case($s[1], MB_CASE_UPPER, 'UTF-8').self::mb_convert_case($s[2], MB_CASE_LOWER, 'UTF-8');
+ }
+
+ private static function getData($file)
+ {
+ if (file_exists($file = __DIR__.'/Resources/unidata/'.$file.'.php')) {
+ return require $file;
+ }
+
+ return false;
+ }
+
+ private static function getEncoding($encoding)
+ {
+ if (null === $encoding) {
+ return self::$internalEncoding;
+ }
+
+ if ('UTF-8' === $encoding) {
+ return 'UTF-8';
+ }
+
+ $encoding = strtoupper($encoding);
+
+ if ('8BIT' === $encoding || 'BINARY' === $encoding) {
+ return 'CP850';
+ }
+
+ if ('UTF8' === $encoding) {
+ return 'UTF-8';
+ }
+
+ return $encoding;
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/polyfill-mbstring/README.md b/plugins/vdomah/jwtauth/vendor/symfony/polyfill-mbstring/README.md
new file mode 100644
index 0000000..4efb599
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/polyfill-mbstring/README.md
@@ -0,0 +1,13 @@
+Symfony Polyfill / Mbstring
+===========================
+
+This component provides a partial, native PHP implementation for the
+[Mbstring](https://php.net/mbstring) extension.
+
+More information can be found in the
+[main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md).
+
+License
+=======
+
+This library is released under the [MIT license](LICENSE).
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php b/plugins/vdomah/jwtauth/vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php
new file mode 100644
index 0000000..e6fbfa6
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php
@@ -0,0 +1,1096 @@
+ 'a',
+ 'B' => 'b',
+ 'C' => 'c',
+ 'D' => 'd',
+ 'E' => 'e',
+ 'F' => 'f',
+ 'G' => 'g',
+ 'H' => 'h',
+ 'I' => 'i',
+ 'J' => 'j',
+ 'K' => 'k',
+ 'L' => 'l',
+ 'M' => 'm',
+ 'N' => 'n',
+ 'O' => 'o',
+ 'P' => 'p',
+ 'Q' => 'q',
+ 'R' => 'r',
+ 'S' => 's',
+ 'T' => 't',
+ 'U' => 'u',
+ 'V' => 'v',
+ 'W' => 'w',
+ 'X' => 'x',
+ 'Y' => 'y',
+ 'Z' => 'z',
+ 'À' => 'à ',
+ 'Ã' => 'á',
+ 'Â' => 'â',
+ 'Ã' => 'ã',
+ 'Ä' => 'ä',
+ 'Ã…' => 'Ã¥',
+ 'Æ' => 'æ',
+ 'Ç' => 'ç',
+ 'È' => 'è',
+ 'É' => 'é',
+ 'Ê' => 'ê',
+ 'Ë' => 'ë',
+ 'Ì' => 'ì',
+ 'Ã' => 'Ã',
+ 'Î' => 'î',
+ 'Ã' => 'ï',
+ 'Ã' => 'ð',
+ 'Ñ' => 'ñ',
+ 'Ò' => 'ò',
+ 'Ó' => 'ó',
+ 'Ô' => 'ô',
+ 'Õ' => 'õ',
+ 'Ö' => 'ö',
+ 'Ø' => 'ø',
+ 'Ù' => 'ù',
+ 'Ú' => 'ú',
+ 'Û' => 'û',
+ 'Ü' => 'ü',
+ 'Ã' => 'ý',
+ 'Þ' => 'þ',
+ 'Ä€' => 'Ä',
+ 'Ă' => 'ă',
+ 'Ä„' => 'Ä…',
+ 'Ć' => 'ć',
+ 'Ĉ' => 'ĉ',
+ 'ÄŠ' => 'Ä‹',
+ 'ÄŒ' => 'Ä',
+ 'ÄŽ' => 'Ä',
+ 'Ä' => 'Ä‘',
+ 'Ä’' => 'Ä“',
+ 'Ä”' => 'Ä•',
+ 'Ä–' => 'Ä—',
+ 'Ę' => 'ę',
+ 'Äš' => 'Ä›',
+ 'Äœ' => 'Ä',
+ 'Äž' => 'ÄŸ',
+ 'Ä ' => 'Ä¡',
+ 'Ä¢' => 'Ä£',
+ 'Ĥ' => 'ĥ',
+ 'Ħ' => 'ħ',
+ 'Ĩ' => 'ĩ',
+ 'Ī' => 'ī',
+ 'Ĭ' => 'Ä',
+ 'Į' => 'į',
+ 'İ' => 'i',
+ 'IJ' => 'ij',
+ 'Ĵ' => 'ĵ',
+ 'Ķ' => 'ķ',
+ 'Ĺ' => 'ĺ',
+ 'Ļ' => 'ļ',
+ 'Ľ' => 'ľ',
+ 'Ä¿' => 'Å€',
+ 'Å' => 'Å‚',
+ 'Ń' => 'ń',
+ 'Ņ' => 'ņ',
+ 'Ň' => 'ň',
+ 'ÅŠ' => 'Å‹',
+ 'ÅŒ' => 'Å',
+ 'ÅŽ' => 'Å',
+ 'Å' => 'Å‘',
+ 'Å’' => 'Å“',
+ 'Å”' => 'Å•',
+ 'Å–' => 'Å—',
+ 'Ř' => 'ř',
+ 'Åš' => 'Å›',
+ 'Åœ' => 'Å',
+ 'Åž' => 'ÅŸ',
+ 'Å ' => 'Å¡',
+ 'Å¢' => 'Å£',
+ 'Ť' => 'ť',
+ 'Ŧ' => 'ŧ',
+ 'Ũ' => 'ũ',
+ 'Ū' => 'ū',
+ 'Ŭ' => 'Å',
+ 'Ů' => 'ů',
+ 'Ű' => 'ű',
+ 'Ų' => 'ų',
+ 'Ŵ' => 'ŵ',
+ 'Ŷ' => 'ŷ',
+ 'Ÿ' => 'ÿ',
+ 'Ź' => 'ź',
+ 'Ż' => 'ż',
+ 'Ž' => 'ž',
+ 'Æ' => 'É“',
+ 'Ƃ' => 'ƃ',
+ 'Æ„' => 'Æ…',
+ 'Ɔ' => 'ɔ',
+ 'Ƈ' => 'ƈ',
+ 'Ɖ' => 'ɖ',
+ 'ÆŠ' => 'É—',
+ 'Ƌ' => 'ƌ',
+ 'ÆŽ' => 'Ç',
+ 'Æ' => 'É™',
+ 'Æ' => 'É›',
+ 'Æ‘' => 'Æ’',
+ 'Æ“' => 'É ',
+ 'Æ”' => 'É£',
+ 'Æ–' => 'É©',
+ 'Ɨ' => 'ɨ',
+ 'Ƙ' => 'ƙ',
+ 'Ɯ' => 'ɯ',
+ 'Æ' => 'ɲ',
+ 'Ɵ' => 'ɵ',
+ 'Æ ' => 'Æ¡',
+ 'Æ¢' => 'Æ£',
+ 'Ƥ' => 'ƥ',
+ 'Ʀ' => 'ʀ',
+ 'Ƨ' => 'ƨ',
+ 'Ʃ' => 'ʃ',
+ 'Ƭ' => 'Æ',
+ 'Ʈ' => 'ʈ',
+ 'Ư' => 'ư',
+ 'Ʊ' => 'ʊ',
+ 'Ʋ' => 'ʋ',
+ 'Ƴ' => 'ƴ',
+ 'Ƶ' => 'ƶ',
+ 'Æ·' => 'Ê’',
+ 'Ƹ' => 'ƹ',
+ 'Ƽ' => 'ƽ',
+ 'DŽ' => 'dž',
+ 'Dž' => 'dž',
+ 'LJ' => 'lj',
+ 'Lj' => 'lj',
+ 'NJ' => 'nj',
+ 'Nj' => 'nj',
+ 'Ç' => 'ÇŽ',
+ 'Ç' => 'Ç',
+ 'Ç‘' => 'Ç’',
+ 'Ç“' => 'Ç”',
+ 'Ç•' => 'Ç–',
+ 'Ǘ' => 'ǘ',
+ 'Ç™' => 'Çš',
+ 'Ǜ' => 'ǜ',
+ 'Çž' => 'ÇŸ',
+ 'Ç ' => 'Ç¡',
+ 'Ç¢' => 'Ç£',
+ 'Ǥ' => 'ǥ',
+ 'Ǧ' => 'ǧ',
+ 'Ǩ' => 'ǩ',
+ 'Ǫ' => 'ǫ',
+ 'Ǭ' => 'Ç',
+ 'Ǯ' => 'ǯ',
+ 'DZ' => 'dz',
+ 'Dz' => 'dz',
+ 'Ǵ' => 'ǵ',
+ 'Ƕ' => 'ƕ',
+ 'Ç·' => 'Æ¿',
+ 'Ǹ' => 'ǹ',
+ 'Ǻ' => 'ǻ',
+ 'Ǽ' => 'ǽ',
+ 'Ǿ' => 'ǿ',
+ 'È€' => 'È',
+ 'Ȃ' => 'ȃ',
+ 'È„' => 'È…',
+ 'Ȇ' => 'ȇ',
+ 'Ȉ' => 'ȉ',
+ 'ÈŠ' => 'È‹',
+ 'ÈŒ' => 'È',
+ 'ÈŽ' => 'È',
+ 'È' => 'È‘',
+ 'È’' => 'È“',
+ 'È”' => 'È•',
+ 'È–' => 'È—',
+ 'Ș' => 'ș',
+ 'Èš' => 'È›',
+ 'Èœ' => 'È',
+ 'Èž' => 'ÈŸ',
+ 'È ' => 'Æž',
+ 'È¢' => 'È£',
+ 'Ȥ' => 'ȥ',
+ 'Ȧ' => 'ȧ',
+ 'Ȩ' => 'ȩ',
+ 'Ȫ' => 'ȫ',
+ 'Ȭ' => 'È',
+ 'Ȯ' => 'ȯ',
+ 'Ȱ' => 'ȱ',
+ 'Ȳ' => 'ȳ',
+ 'Ⱥ' => 'ⱥ',
+ 'Ȼ' => 'ȼ',
+ 'Ƚ' => 'ƚ',
+ 'Ⱦ' => 'ⱦ',
+ 'É' => 'É‚',
+ 'Ƀ' => 'ƀ',
+ 'Ʉ' => 'ʉ',
+ 'Ʌ' => 'ʌ',
+ 'Ɇ' => 'ɇ',
+ 'Ɉ' => 'ɉ',
+ 'ÉŠ' => 'É‹',
+ 'ÉŒ' => 'É',
+ 'ÉŽ' => 'É',
+ 'Ͱ' => 'ͱ',
+ 'Ͳ' => 'ͳ',
+ 'Ͷ' => 'ͷ',
+ 'Ϳ' => 'ϳ',
+ 'Ά' => 'ά',
+ 'Έ' => 'Î',
+ 'Ή' => 'ή',
+ 'Ί' => 'ί',
+ 'Ό' => 'ό',
+ 'ÎŽ' => 'Ï',
+ 'Î' => 'ÏŽ',
+ 'Α' => 'α',
+ 'Β' => 'β',
+ 'Γ' => 'γ',
+ 'Δ' => 'δ',
+ 'Ε' => 'ε',
+ 'Ζ' => 'ζ',
+ 'Η' => 'η',
+ 'Θ' => 'θ',
+ 'Ι' => 'ι',
+ 'Κ' => 'κ',
+ 'Λ' => 'λ',
+ 'Μ' => 'μ',
+ 'Î' => 'ν',
+ 'Ξ' => 'ξ',
+ 'Ο' => 'ο',
+ 'Î ' => 'Ï€',
+ 'Ρ' => 'Ï',
+ 'Σ' => 'σ',
+ 'Τ' => 'τ',
+ 'Î¥' => 'Ï…',
+ 'Φ' => 'φ',
+ 'Χ' => 'χ',
+ 'Ψ' => 'ψ',
+ 'Ω' => 'ω',
+ 'Ϊ' => 'ϊ',
+ 'Ϋ' => 'ϋ',
+ 'Ï' => 'Ï—',
+ 'Ϙ' => 'ϙ',
+ 'Ïš' => 'Ï›',
+ 'Ïœ' => 'Ï',
+ 'Ïž' => 'ÏŸ',
+ 'Ï ' => 'Ï¡',
+ 'Ï¢' => 'Ï£',
+ 'Ϥ' => 'ϥ',
+ 'Ϧ' => 'ϧ',
+ 'Ϩ' => 'ϩ',
+ 'Ϫ' => 'ϫ',
+ 'Ϭ' => 'Ï',
+ 'Ϯ' => 'ϯ',
+ 'ϴ' => 'θ',
+ 'Ϸ' => 'ϸ',
+ 'Ϲ' => 'ϲ',
+ 'Ϻ' => 'ϻ',
+ 'Ͻ' => 'ͻ',
+ 'Ͼ' => 'ͼ',
+ 'Ͽ' => 'ͽ',
+ 'Ѐ' => 'Ñ',
+ 'Ð' => 'Ñ‘',
+ 'Ђ' => 'ђ',
+ 'Ѓ' => 'ѓ',
+ 'Є' => 'є',
+ 'Ð…' => 'Ñ•',
+ 'І' => 'і',
+ 'Ї' => 'ї',
+ 'Ј' => 'ј',
+ 'Љ' => 'љ',
+ 'Њ' => 'њ',
+ 'Ћ' => 'ћ',
+ 'Ќ' => 'ќ',
+ 'Ð' => 'Ñ',
+ 'ÐŽ' => 'Ñž',
+ 'Ð' => 'ÑŸ',
+ 'Ð' => 'а',
+ 'Б' => 'б',
+ 'В' => 'в',
+ 'Г' => 'г',
+ 'Д' => 'д',
+ 'Е' => 'е',
+ 'Ж' => 'ж',
+ 'З' => 'з',
+ 'И' => 'и',
+ 'Й' => 'й',
+ 'К' => 'к',
+ 'Л' => 'л',
+ 'М' => 'м',
+ 'Ð' => 'н',
+ 'О' => 'о',
+ 'П' => 'п',
+ 'Ð ' => 'Ñ€',
+ 'С' => 'Ñ',
+ 'Т' => 'т',
+ 'У' => 'у',
+ 'Ф' => 'ф',
+ 'Ð¥' => 'Ñ…',
+ 'Ц' => 'ц',
+ 'Ч' => 'ч',
+ 'Ш' => 'ш',
+ 'Щ' => 'щ',
+ 'Ъ' => 'ъ',
+ 'Ы' => 'ы',
+ 'Ь' => 'ь',
+ 'Ð' => 'Ñ',
+ 'Ю' => 'ю',
+ 'Я' => 'Ñ',
+ 'Ñ ' => 'Ñ¡',
+ 'Ñ¢' => 'Ñ£',
+ 'Ѥ' => 'ѥ',
+ 'Ѧ' => 'ѧ',
+ 'Ѩ' => 'ѩ',
+ 'Ѫ' => 'ѫ',
+ 'Ѭ' => 'Ñ',
+ 'Ѯ' => 'ѯ',
+ 'Ѱ' => 'ѱ',
+ 'Ѳ' => 'ѳ',
+ 'Ѵ' => 'ѵ',
+ 'Ѷ' => 'ѷ',
+ 'Ѹ' => 'ѹ',
+ 'Ѻ' => 'ѻ',
+ 'Ѽ' => 'ѽ',
+ 'Ѿ' => 'ѿ',
+ 'Ò€' => 'Ò',
+ 'ÒŠ' => 'Ò‹',
+ 'ÒŒ' => 'Ò',
+ 'ÒŽ' => 'Ò',
+ 'Ò' => 'Ò‘',
+ 'Ò’' => 'Ò“',
+ 'Ò”' => 'Ò•',
+ 'Ò–' => 'Ò—',
+ 'Ò˜' => 'Ò™',
+ 'Òš' => 'Ò›',
+ 'Òœ' => 'Ò',
+ 'Òž' => 'ÒŸ',
+ 'Ò ' => 'Ò¡',
+ 'Ò¢' => 'Ò£',
+ 'Ò¤' => 'Ò¥',
+ 'Ò¦' => 'Ò§',
+ 'Ò¨' => 'Ò©',
+ 'Òª' => 'Ò«',
+ 'Ò¬' => 'Ò',
+ 'Ò®' => 'Ò¯',
+ 'Ò°' => 'Ò±',
+ 'Ò²' => 'Ò³',
+ 'Ò´' => 'Òµ',
+ 'Ò¶' => 'Ò·',
+ 'Ò¸' => 'Ò¹',
+ 'Òº' => 'Ò»',
+ 'Ò¼' => 'Ò½',
+ 'Ò¾' => 'Ò¿',
+ 'Ó€' => 'Ó',
+ 'Ó' => 'Ó‚',
+ 'Óƒ' => 'Ó„',
+ 'Ó…' => 'Ó†',
+ 'Ó‡' => 'Óˆ',
+ 'Ó‰' => 'ÓŠ',
+ 'Ӌ' => 'ӌ',
+ 'Ó' => 'ÓŽ',
+ 'Ó' => 'Ó‘',
+ 'Ó’' => 'Ó“',
+ 'Ó”' => 'Ó•',
+ 'Ó–' => 'Ó—',
+ 'Ó˜' => 'Ó™',
+ 'Óš' => 'Ó›',
+ 'Óœ' => 'Ó',
+ 'Óž' => 'ÓŸ',
+ 'Ó ' => 'Ó¡',
+ 'Ó¢' => 'Ó£',
+ 'Ó¤' => 'Ó¥',
+ 'Ó¦' => 'Ó§',
+ 'Ó¨' => 'Ó©',
+ 'Óª' => 'Ó«',
+ 'Ó¬' => 'Ó',
+ 'Ó®' => 'Ó¯',
+ 'Ó°' => 'Ó±',
+ 'Ó²' => 'Ó³',
+ 'Ó´' => 'Óµ',
+ 'Ó¶' => 'Ó·',
+ 'Ó¸' => 'Ó¹',
+ 'Óº' => 'Ó»',
+ 'Ó¼' => 'Ó½',
+ 'Ó¾' => 'Ó¿',
+ 'Ô€' => 'Ô',
+ 'Ô‚' => 'Ôƒ',
+ 'Ô„' => 'Ô…',
+ 'Ô†' => 'Ô‡',
+ 'Ôˆ' => 'Ô‰',
+ 'ÔŠ' => 'Ô‹',
+ 'ÔŒ' => 'Ô',
+ 'ÔŽ' => 'Ô',
+ 'Ô' => 'Ô‘',
+ 'Ô’' => 'Ô“',
+ 'Ô”' => 'Ô•',
+ 'Ô–' => 'Ô—',
+ 'Ô˜' => 'Ô™',
+ 'Ôš' => 'Ô›',
+ 'Ôœ' => 'Ô',
+ 'Ôž' => 'ÔŸ',
+ 'Ô ' => 'Ô¡',
+ 'Ô¢' => 'Ô£',
+ 'Ô¤' => 'Ô¥',
+ 'Ô¦' => 'Ô§',
+ 'Ô¨' => 'Ô©',
+ 'Ôª' => 'Ô«',
+ 'Ô¬' => 'Ô',
+ 'Ô®' => 'Ô¯',
+ 'Ô±' => 'Õ¡',
+ 'Ô²' => 'Õ¢',
+ 'Ô³' => 'Õ£',
+ 'Ô´' => 'Õ¤',
+ 'Ôµ' => 'Õ¥',
+ 'Ô¶' => 'Õ¦',
+ 'Ô·' => 'Õ§',
+ 'Ô¸' => 'Õ¨',
+ 'Ô¹' => 'Õ©',
+ 'Ôº' => 'Õª',
+ 'Ô»' => 'Õ«',
+ 'Ô¼' => 'Õ¬',
+ 'Ô½' => 'Õ',
+ 'Ô¾' => 'Õ®',
+ 'Ô¿' => 'Õ¯',
+ 'Õ€' => 'Õ°',
+ 'Õ' => 'Õ±',
+ 'Õ‚' => 'Õ²',
+ 'Õƒ' => 'Õ³',
+ 'Õ„' => 'Õ´',
+ 'Õ…' => 'Õµ',
+ 'Õ†' => 'Õ¶',
+ 'Õ‡' => 'Õ·',
+ 'Õˆ' => 'Õ¸',
+ 'Õ‰' => 'Õ¹',
+ 'ÕŠ' => 'Õº',
+ 'Õ‹' => 'Õ»',
+ 'Ռ' => 'ռ',
+ 'Õ' => 'Õ½',
+ 'ÕŽ' => 'Õ¾',
+ 'Õ' => 'Õ¿',
+ 'Õ' => 'Ö€',
+ 'Õ‘' => 'Ö',
+ 'Õ’' => 'Ö‚',
+ 'Õ“' => 'Öƒ',
+ 'Õ”' => 'Ö„',
+ 'Õ•' => 'Ö…',
+ 'Õ–' => 'Ö†',
+ 'á‚ ' => 'â´€',
+ 'á‚¡' => 'â´',
+ 'á‚¢' => 'â´‚',
+ 'á‚£' => 'â´ƒ',
+ 'Ⴄ' => 'ⴄ',
+ 'á‚¥' => 'â´…',
+ 'Ⴆ' => 'ⴆ',
+ 'á‚§' => 'â´‡',
+ 'Ⴈ' => 'ⴈ',
+ 'á‚©' => 'â´‰',
+ 'Ⴊ' => 'ⴊ',
+ 'á‚«' => 'â´‹',
+ 'Ⴌ' => 'ⴌ',
+ 'á‚' => 'â´',
+ 'á‚®' => 'â´Ž',
+ 'Ⴏ' => 'â´',
+ 'á‚°' => 'â´',
+ 'Ⴑ' => 'ⴑ',
+ 'Ⴒ' => 'ⴒ',
+ 'Ⴓ' => 'ⴓ',
+ 'á‚´' => 'â´”',
+ 'Ⴕ' => 'ⴕ',
+ 'á‚¶' => 'â´–',
+ 'á‚·' => 'â´—',
+ 'Ⴘ' => 'ⴘ',
+ 'Ⴙ' => 'ⴙ',
+ 'Ⴚ' => 'ⴚ',
+ 'á‚»' => 'â´›',
+ 'Ⴜ' => 'ⴜ',
+ 'Ⴝ' => 'â´',
+ 'Ⴞ' => 'ⴞ',
+ 'á‚¿' => 'â´Ÿ',
+ 'Ⴠ' => 'ⴠ',
+ 'áƒ' => 'â´¡',
+ 'Ⴢ' => 'ⴢ',
+ 'Ⴣ' => 'ⴣ',
+ 'Ⴤ' => 'ⴤ',
+ 'Ⴥ' => 'ⴥ',
+ 'Ⴧ' => 'ⴧ',
+ 'áƒ' => 'â´',
+ 'Ḁ' => 'á¸',
+ 'Ḃ' => 'ḃ',
+ 'Ḅ' => 'ḅ',
+ 'Ḇ' => 'ḇ',
+ 'Ḉ' => 'ḉ',
+ 'Ḋ' => 'ḋ',
+ 'Ḍ' => 'á¸',
+ 'Ḏ' => 'á¸',
+ 'á¸' => 'ḑ',
+ 'Ḓ' => 'ḓ',
+ 'Ḕ' => 'ḕ',
+ 'Ḗ' => 'ḗ',
+ 'Ḙ' => 'ḙ',
+ 'Ḛ' => 'ḛ',
+ 'Ḝ' => 'á¸',
+ 'Ḟ' => 'ḟ',
+ 'Ḡ' => 'ḡ',
+ 'Ḣ' => 'ḣ',
+ 'Ḥ' => 'ḥ',
+ 'Ḧ' => 'ḧ',
+ 'Ḩ' => 'ḩ',
+ 'Ḫ' => 'ḫ',
+ 'Ḭ' => 'á¸',
+ 'Ḯ' => 'ḯ',
+ 'Ḱ' => 'ḱ',
+ 'Ḳ' => 'ḳ',
+ 'Ḵ' => 'ḵ',
+ 'Ḷ' => 'ḷ',
+ 'Ḹ' => 'ḹ',
+ 'Ḻ' => 'ḻ',
+ 'Ḽ' => 'ḽ',
+ 'Ḿ' => 'ḿ',
+ 'á¹€' => 'á¹',
+ 'Ṃ' => 'ṃ',
+ 'Ṅ' => 'ṅ',
+ 'Ṇ' => 'ṇ',
+ 'Ṉ' => 'ṉ',
+ 'Ṋ' => 'ṋ',
+ 'Ṍ' => 'á¹',
+ 'Ṏ' => 'á¹',
+ 'á¹' => 'ṑ',
+ 'Ṓ' => 'ṓ',
+ 'Ṕ' => 'ṕ',
+ 'á¹–' => 'á¹—',
+ 'Ṙ' => 'ṙ',
+ 'Ṛ' => 'ṛ',
+ 'Ṝ' => 'á¹',
+ 'Ṟ' => 'ṟ',
+ 'Ṡ' => 'ṡ',
+ 'á¹¢' => 'á¹£',
+ 'Ṥ' => 'ṥ',
+ 'Ṧ' => 'ṧ',
+ 'Ṩ' => 'ṩ',
+ 'Ṫ' => 'ṫ',
+ 'Ṭ' => 'á¹',
+ 'Ṯ' => 'ṯ',
+ 'á¹°' => 'á¹±',
+ 'á¹²' => 'á¹³',
+ 'á¹´' => 'á¹µ',
+ 'á¹¶' => 'á¹·',
+ 'Ṹ' => 'ṹ',
+ 'Ṻ' => 'ṻ',
+ 'á¹¼' => 'á¹½',
+ 'Ṿ' => 'ṿ',
+ 'Ẁ' => 'áº',
+ 'Ẃ' => 'ẃ',
+ 'Ẅ' => 'ẅ',
+ 'Ẇ' => 'ẇ',
+ 'Ẉ' => 'ẉ',
+ 'Ẋ' => 'ẋ',
+ 'Ẍ' => 'áº',
+ 'Ẏ' => 'áº',
+ 'áº' => 'ẑ',
+ 'Ẓ' => 'ẓ',
+ 'Ẕ' => 'ẕ',
+ 'ẞ' => 'ß',
+ 'Ạ' => 'ạ',
+ 'Ả' => 'ả',
+ 'Ấ' => 'ấ',
+ 'Ầ' => 'ầ',
+ 'Ẩ' => 'ẩ',
+ 'Ẫ' => 'ẫ',
+ 'Ậ' => 'áº',
+ 'Ắ' => 'ắ',
+ 'Ằ' => 'ằ',
+ 'Ẳ' => 'ẳ',
+ 'Ẵ' => 'ẵ',
+ 'Ặ' => 'ặ',
+ 'Ẹ' => 'ẹ',
+ 'Ẻ' => 'ẻ',
+ 'Ẽ' => 'ẽ',
+ 'Ế' => 'ế',
+ 'Ề' => 'á»',
+ 'Ể' => 'ể',
+ 'Ễ' => 'ễ',
+ 'Ệ' => 'ệ',
+ 'Ỉ' => 'ỉ',
+ 'Ị' => 'ị',
+ 'Ọ' => 'á»',
+ 'Ỏ' => 'á»',
+ 'á»' => 'ố',
+ 'Ồ' => 'ồ',
+ 'Ổ' => 'ổ',
+ 'á»–' => 'á»—',
+ 'Ộ' => 'ộ',
+ 'Ớ' => 'ớ',
+ 'Ờ' => 'á»',
+ 'Ở' => 'ở',
+ 'Ỡ' => 'ỡ',
+ 'Ợ' => 'ợ',
+ 'Ụ' => 'ụ',
+ 'Ủ' => 'ủ',
+ 'Ứ' => 'ứ',
+ 'Ừ' => 'ừ',
+ 'Ử' => 'á»',
+ 'Ữ' => 'ữ',
+ 'á»°' => 'á»±',
+ 'Ỳ' => 'ỳ',
+ 'Ỵ' => 'ỵ',
+ 'á»¶' => 'á»·',
+ 'Ỹ' => 'ỹ',
+ 'Ỻ' => 'ỻ',
+ 'Ỽ' => 'ỽ',
+ 'Ỿ' => 'ỿ',
+ 'Ἀ' => 'ἀ',
+ 'Ἁ' => 'á¼',
+ 'Ἂ' => 'ἂ',
+ 'Ἃ' => 'ἃ',
+ 'Ἄ' => 'ἄ',
+ 'á¼' => 'á¼…',
+ 'Ἆ' => 'ἆ',
+ 'á¼' => 'ἇ',
+ 'Ἐ' => 'á¼',
+ 'Ἑ' => 'ἑ',
+ 'Ἒ' => 'ἒ',
+ 'Ἓ' => 'ἓ',
+ 'Ἔ' => 'ἔ',
+ 'á¼' => 'ἕ',
+ 'Ἠ' => 'ἠ',
+ 'Ἡ' => 'ἡ',
+ 'Ἢ' => 'ἢ',
+ 'Ἣ' => 'ἣ',
+ 'Ἤ' => 'ἤ',
+ 'á¼' => 'á¼¥',
+ 'Ἦ' => 'ἦ',
+ 'Ἧ' => 'ἧ',
+ 'Ἰ' => 'ἰ',
+ 'á¼¹' => 'á¼±',
+ 'Ἲ' => 'ἲ',
+ 'á¼»' => 'á¼³',
+ 'á¼¼' => 'á¼´',
+ 'á¼½' => 'á¼µ',
+ 'á¼¾' => 'á¼¶',
+ 'Ἷ' => 'ἷ',
+ 'Ὀ' => 'ὀ',
+ 'Ὁ' => 'á½',
+ 'Ὂ' => 'ὂ',
+ 'Ὃ' => 'ὃ',
+ 'Ὄ' => 'ὄ',
+ 'á½' => 'á½…',
+ 'Ὑ' => 'ὑ',
+ 'Ὓ' => 'ὓ',
+ 'á½' => 'ὕ',
+ 'Ὗ' => 'ὗ',
+ 'Ὠ' => 'ὠ',
+ 'Ὡ' => 'ὡ',
+ 'Ὢ' => 'ὢ',
+ 'Ὣ' => 'ὣ',
+ 'Ὤ' => 'ὤ',
+ 'á½' => 'á½¥',
+ 'Ὦ' => 'ὦ',
+ 'Ὧ' => 'ὧ',
+ 'ᾈ' => 'ᾀ',
+ 'ᾉ' => 'á¾',
+ 'ᾊ' => 'ᾂ',
+ 'ᾋ' => 'ᾃ',
+ 'ᾌ' => 'ᾄ',
+ 'á¾' => 'á¾…',
+ 'ᾎ' => 'ᾆ',
+ 'á¾' => 'ᾇ',
+ 'ᾘ' => 'á¾',
+ 'ᾙ' => 'ᾑ',
+ 'ᾚ' => 'ᾒ',
+ 'ᾛ' => 'ᾓ',
+ 'ᾜ' => 'ᾔ',
+ 'á¾' => 'ᾕ',
+ 'ᾞ' => 'ᾖ',
+ 'ᾟ' => 'ᾗ',
+ 'ᾨ' => 'ᾠ',
+ 'ᾩ' => 'ᾡ',
+ 'ᾪ' => 'ᾢ',
+ 'ᾫ' => 'ᾣ',
+ 'ᾬ' => 'ᾤ',
+ 'á¾' => 'á¾¥',
+ 'ᾮ' => 'ᾦ',
+ 'ᾯ' => 'ᾧ',
+ 'Ᾰ' => 'ᾰ',
+ 'á¾¹' => 'á¾±',
+ 'Ὰ' => 'ὰ',
+ 'á¾»' => 'á½±',
+ 'á¾¼' => 'á¾³',
+ 'Ὲ' => 'ὲ',
+ 'Έ' => 'έ',
+ 'Ὴ' => 'ὴ',
+ 'á¿‹' => 'á½µ',
+ 'ῌ' => 'ῃ',
+ 'Ῐ' => 'á¿',
+ 'á¿™' => 'á¿‘',
+ 'Ὶ' => 'ὶ',
+ 'á¿›' => 'á½·',
+ 'Ῠ' => 'ῠ',
+ 'á¿©' => 'á¿¡',
+ 'Ὺ' => 'ὺ',
+ 'á¿«' => 'á½»',
+ 'Ῥ' => 'ῥ',
+ 'Ὸ' => 'ὸ',
+ 'Ό' => 'ό',
+ 'Ὼ' => 'ὼ',
+ 'á¿»' => 'á½½',
+ 'ῼ' => 'ῳ',
+ 'Ω' => 'ω',
+ 'K' => 'k',
+ 'â„«' => 'Ã¥',
+ 'Ⅎ' => 'ⅎ',
+ 'â… ' => 'â…°',
+ 'â…¡' => 'â…±',
+ 'â…¢' => 'â…²',
+ 'â…£' => 'â…³',
+ 'â…¤' => 'â…´',
+ 'â…¥' => 'â…µ',
+ 'â…¦' => 'â…¶',
+ 'â…§' => 'â…·',
+ 'â…¨' => 'â…¸',
+ 'â…©' => 'â…¹',
+ 'â…ª' => 'â…º',
+ 'â…«' => 'â…»',
+ 'â…¬' => 'â…¼',
+ 'â…' => 'â…½',
+ 'â…®' => 'â…¾',
+ 'â…¯' => 'â…¿',
+ 'Ↄ' => 'ↄ',
+ 'â’¶' => 'â“',
+ 'â’·' => 'â“‘',
+ 'â’¸' => 'â“’',
+ 'â’¹' => 'â““',
+ 'â’º' => 'â“”',
+ 'â’»' => 'â“•',
+ 'â’¼' => 'â“–',
+ 'â’½' => 'â“—',
+ 'Ⓘ' => 'ⓘ',
+ 'â’¿' => 'â“™',
+ 'Ⓚ' => 'ⓚ',
+ 'â“' => 'â“›',
+ 'Ⓜ' => 'ⓜ',
+ 'Ⓝ' => 'â“',
+ 'Ⓞ' => 'ⓞ',
+ 'Ⓟ' => 'ⓟ',
+ 'Ⓠ' => 'ⓠ',
+ 'Ⓡ' => 'ⓡ',
+ 'Ⓢ' => 'ⓢ',
+ 'Ⓣ' => 'ⓣ',
+ 'Ⓤ' => 'ⓤ',
+ 'â“‹' => 'â“¥',
+ 'Ⓦ' => 'ⓦ',
+ 'â“' => 'â“§',
+ 'Ⓨ' => 'ⓨ',
+ 'â“' => 'â“©',
+ 'â°€' => 'â°°',
+ 'â°' => 'â°±',
+ 'â°‚' => 'â°²',
+ 'â°ƒ' => 'â°³',
+ 'â°„' => 'â°´',
+ 'â°…' => 'â°µ',
+ 'â°†' => 'â°¶',
+ 'â°‡' => 'â°·',
+ 'â°ˆ' => 'â°¸',
+ 'â°‰' => 'â°¹',
+ 'â°Š' => 'â°º',
+ 'â°‹' => 'â°»',
+ 'Ⰼ' => 'ⰼ',
+ 'â°' => 'â°½',
+ 'â°Ž' => 'â°¾',
+ 'â°' => 'â°¿',
+ 'â°' => 'â±€',
+ 'â°‘' => 'â±',
+ 'Ⱂ' => 'ⱂ',
+ 'Ⱃ' => 'ⱃ',
+ 'Ⱄ' => 'ⱄ',
+ 'â°•' => 'â±…',
+ 'Ⱆ' => 'ⱆ',
+ 'Ⱇ' => 'ⱇ',
+ 'Ⱈ' => 'ⱈ',
+ 'Ⱉ' => 'ⱉ',
+ 'Ⱊ' => 'ⱊ',
+ 'Ⱋ' => 'ⱋ',
+ 'Ⱌ' => 'ⱌ',
+ 'â°' => 'â±',
+ 'Ⱎ' => 'ⱎ',
+ 'â°Ÿ' => 'â±',
+ 'â° ' => 'â±',
+ 'Ⱑ' => 'ⱑ',
+ 'â°¢' => 'â±’',
+ 'Ⱓ' => 'ⱓ',
+ 'â°¤' => 'â±”',
+ 'Ⱕ' => 'ⱕ',
+ 'â°¦' => 'â±–',
+ 'â°§' => 'â±—',
+ 'Ⱘ' => 'ⱘ',
+ 'â°©' => 'â±™',
+ 'Ⱚ' => 'ⱚ',
+ 'â°«' => 'â±›',
+ 'Ⱜ' => 'ⱜ',
+ 'â°' => 'â±',
+ 'Ⱞ' => 'ⱞ',
+ 'Ⱡ' => 'ⱡ',
+ 'â±¢' => 'É«',
+ 'â±£' => 'áµ½',
+ 'Ɽ' => 'ɽ',
+ 'Ⱨ' => 'ⱨ',
+ 'Ⱪ' => 'ⱪ',
+ 'Ⱬ' => 'ⱬ',
+ 'â±' => 'É‘',
+ 'Ɱ' => 'ɱ',
+ 'Ɐ' => 'É',
+ 'â±°' => 'É’',
+ 'â±²' => 'â±³',
+ 'â±µ' => 'â±¶',
+ 'â±¾' => 'È¿',
+ 'Ɀ' => 'ɀ',
+ 'â²€' => 'â²',
+ 'Ⲃ' => 'ⲃ',
+ 'Ⲅ' => 'ⲅ',
+ 'Ⲇ' => 'ⲇ',
+ 'Ⲉ' => 'ⲉ',
+ 'Ⲋ' => 'ⲋ',
+ 'Ⲍ' => 'â²',
+ 'Ⲏ' => 'â²',
+ 'â²' => 'ⲑ',
+ 'Ⲓ' => 'ⲓ',
+ 'Ⲕ' => 'ⲕ',
+ 'â²–' => 'â²—',
+ 'Ⲙ' => 'ⲙ',
+ 'Ⲛ' => 'ⲛ',
+ 'Ⲝ' => 'â²',
+ 'Ⲟ' => 'ⲟ',
+ 'Ⲡ' => 'ⲡ',
+ 'â²¢' => 'â²£',
+ 'Ⲥ' => 'ⲥ',
+ 'Ⲧ' => 'ⲧ',
+ 'Ⲩ' => 'ⲩ',
+ 'Ⲫ' => 'ⲫ',
+ 'Ⲭ' => 'â²',
+ 'Ⲯ' => 'ⲯ',
+ 'â²°' => 'â²±',
+ 'â²²' => 'â²³',
+ 'â²´' => 'â²µ',
+ 'â²¶' => 'â²·',
+ 'Ⲹ' => 'ⲹ',
+ 'Ⲻ' => 'ⲻ',
+ 'â²¼' => 'â²½',
+ 'Ⲿ' => 'ⲿ',
+ 'â³€' => 'â³',
+ 'Ⳃ' => 'ⳃ',
+ 'Ⳅ' => 'ⳅ',
+ 'Ⳇ' => 'ⳇ',
+ 'Ⳉ' => 'ⳉ',
+ 'Ⳋ' => 'ⳋ',
+ 'Ⳍ' => 'â³',
+ 'Ⳏ' => 'â³',
+ 'â³' => 'ⳑ',
+ 'Ⳓ' => 'ⳓ',
+ 'Ⳕ' => 'ⳕ',
+ 'â³–' => 'â³—',
+ 'Ⳙ' => 'ⳙ',
+ 'Ⳛ' => 'ⳛ',
+ 'Ⳝ' => 'â³',
+ 'Ⳟ' => 'ⳟ',
+ 'Ⳡ' => 'ⳡ',
+ 'â³¢' => 'â³£',
+ 'Ⳬ' => 'ⳬ',
+ 'â³' => 'â³®',
+ 'â³²' => 'â³³',
+ 'Ꙁ' => 'ê™',
+ 'Ꙃ' => 'ꙃ',
+ 'Ꙅ' => 'ꙅ',
+ 'Ꙇ' => 'ꙇ',
+ 'Ꙉ' => 'ꙉ',
+ 'Ꙋ' => 'ꙋ',
+ 'Ꙍ' => 'ê™',
+ 'Ꙏ' => 'ê™',
+ 'ê™' => 'ꙑ',
+ 'Ꙓ' => 'ꙓ',
+ 'Ꙕ' => 'ꙕ',
+ 'ê™–' => 'ê™—',
+ 'Ꙙ' => 'ꙙ',
+ 'Ꙛ' => 'ꙛ',
+ 'Ꙝ' => 'ê™',
+ 'Ꙟ' => 'ꙟ',
+ 'ê™ ' => 'ꙡ',
+ 'Ꙣ' => 'ꙣ',
+ 'Ꙥ' => 'ꙥ',
+ 'Ꙧ' => 'ꙧ',
+ 'Ꙩ' => 'ꙩ',
+ 'Ꙫ' => 'ꙫ',
+ 'Ꙭ' => 'ê™',
+ 'Ꚁ' => 'êš',
+ 'Ꚃ' => 'ꚃ',
+ 'êš„' => 'êš…',
+ 'Ꚇ' => 'ꚇ',
+ 'Ꚉ' => 'ꚉ',
+ 'Ꚋ' => 'ꚋ',
+ 'Ꚍ' => 'êš',
+ 'Ꚏ' => 'êš',
+ 'êš' => 'êš‘',
+ 'êš’' => 'êš“',
+ 'êš”' => 'êš•',
+ 'êš–' => 'êš—',
+ 'Ꚙ' => 'ꚙ',
+ 'êšš' => 'êš›',
+ 'Ꜣ' => 'ꜣ',
+ 'Ꜥ' => 'ꜥ',
+ 'Ꜧ' => 'ꜧ',
+ 'Ꜩ' => 'ꜩ',
+ 'Ꜫ' => 'ꜫ',
+ 'Ꜭ' => 'êœ',
+ 'Ꜯ' => 'ꜯ',
+ 'Ꜳ' => 'ꜳ',
+ 'Ꜵ' => 'ꜵ',
+ 'Ꜷ' => 'ꜷ',
+ 'Ꜹ' => 'ꜹ',
+ 'Ꜻ' => 'ꜻ',
+ 'Ꜽ' => 'ꜽ',
+ 'Ꜿ' => 'ꜿ',
+ 'ê€' => 'ê',
+ 'ê‚' => 'êƒ',
+ 'ê„' => 'ê…',
+ 'ê†' => 'ê‡',
+ 'êˆ' => 'ê‰',
+ 'êŠ' => 'ê‹',
+ 'êŒ' => 'ê',
+ 'êŽ' => 'ê',
+ 'ê' => 'ê‘',
+ 'ê’' => 'ê“',
+ 'ê”' => 'ê•',
+ 'ê–' => 'ê—',
+ 'ê˜' => 'ê™',
+ 'êš' => 'ê›',
+ 'êœ' => 'ê',
+ 'êž' => 'êŸ',
+ 'ê ' => 'ê¡',
+ 'ê¢' => 'ê£',
+ 'ê¤' => 'ê¥',
+ 'ê¦' => 'ê§',
+ 'ê¨' => 'ê©',
+ 'êª' => 'ê«',
+ 'ê¬' => 'ê',
+ 'ê®' => 'ê¯',
+ 'ê¹' => 'êº',
+ 'ê»' => 'ê¼',
+ 'ê½' => 'áµ¹',
+ 'ê¾' => 'ê¿',
+ 'Ꞁ' => 'êž',
+ 'Ꞃ' => 'ꞃ',
+ 'êž„' => 'êž…',
+ 'Ꞇ' => 'ꞇ',
+ 'Ꞌ' => 'ꞌ',
+ 'êž' => 'É¥',
+ 'êž' => 'êž‘',
+ 'êž’' => 'êž“',
+ 'êž–' => 'êž—',
+ 'Ꞙ' => 'ꞙ',
+ 'êžš' => 'êž›',
+ 'êžœ' => 'êž',
+ 'Ꞟ' => 'ꞟ',
+ 'êž ' => 'êž¡',
+ 'Ꞣ' => 'ꞣ',
+ 'Ꞥ' => 'ꞥ',
+ 'Ꞧ' => 'ꞧ',
+ 'Ꞩ' => 'ꞩ',
+ 'Ɦ' => 'ɦ',
+ 'Ɜ' => 'ɜ',
+ 'Ɡ' => 'ɡ',
+ 'êž' => 'ɬ',
+ 'êž°' => 'Êž',
+ 'Ʇ' => 'ʇ',
+ 'A' => 'ï½',
+ 'B' => 'b',
+ 'C' => 'c',
+ 'D' => 'd',
+ 'ï¼¥' => 'ï½…',
+ 'F' => 'f',
+ 'G' => 'g',
+ 'H' => 'h',
+ 'I' => 'i',
+ 'J' => 'j',
+ 'K' => 'k',
+ 'L' => 'l',
+ 'ï¼' => 'ï½',
+ 'N' => 'n',
+ 'O' => 'ï½',
+ 'ï¼°' => 'ï½',
+ 'Q' => 'q',
+ 'ï¼²' => 'ï½’',
+ 'S' => 's',
+ 'ï¼´' => 'ï½”',
+ 'U' => 'u',
+ 'ï¼¶' => 'ï½–',
+ 'ï¼·' => 'ï½—',
+ 'X' => 'x',
+ 'ï¼¹' => 'ï½™',
+ 'Z' => 'z',
+ 'ð€' => 'ð¨',
+ 'ð' => 'ð©',
+ 'ð‚' => 'ðª',
+ 'ðƒ' => 'ð«',
+ 'ð„' => 'ð¬',
+ 'ð…' => 'ð',
+ 'ð†' => 'ð®',
+ 'ð‡' => 'ð¯',
+ 'ðˆ' => 'ð°',
+ 'ð‰' => 'ð±',
+ 'ðŠ' => 'ð²',
+ 'ð‹' => 'ð³',
+ 'ðŒ' => 'ð´',
+ 'ð' => 'ðµ',
+ 'ðŽ' => 'ð¶',
+ 'ð' => 'ð·',
+ 'ð' => 'ð¸',
+ 'ð‘' => 'ð¹',
+ 'ð’' => 'ðº',
+ 'ð“' => 'ð»',
+ 'ð”' => 'ð¼',
+ 'ð•' => 'ð½',
+ 'ð–' => 'ð¾',
+ 'ð—' => 'ð¿',
+ 'ð˜' => 'ð‘€',
+ 'ð™' => 'ð‘',
+ 'ðš' => 'ð‘‚',
+ 'ð›' => 'ð‘ƒ',
+ 'ðœ' => 'ð‘„',
+ 'ð' => 'ð‘…',
+ 'ðž' => 'ð‘†',
+ 'ðŸ' => 'ð‘‡',
+ 'ð ' => 'ð‘ˆ',
+ 'ð¡' => 'ð‘‰',
+ 'ð¢' => 'ð‘Š',
+ 'ð£' => 'ð‘‹',
+ 'ð¤' => 'ð‘Œ',
+ 'ð¥' => 'ð‘',
+ 'ð¦' => 'ð‘Ž',
+ 'ð§' => 'ð‘',
+ 'ð‘¢ ' => 'ð‘£€',
+ '𑢡' => 'ð‘£',
+ '𑢢' => '𑣂',
+ '𑢣' => '𑣃',
+ '𑢤' => '𑣄',
+ 'ð‘¢¥' => 'ð‘£…',
+ '𑢦' => '𑣆',
+ '𑢧' => '𑣇',
+ '𑢨' => '𑣈',
+ '𑢩' => '𑣉',
+ '𑢪' => '𑣊',
+ '𑢫' => '𑣋',
+ '𑢬' => '𑣌',
+ 'ð‘¢' => 'ð‘£',
+ '𑢮' => '𑣎',
+ '𑢯' => 'ð‘£',
+ 'ð‘¢°' => 'ð‘£',
+ '𑢱' => '𑣑',
+ 'ð‘¢²' => 'ð‘£’',
+ '𑢳' => '𑣓',
+ 'ð‘¢´' => 'ð‘£”',
+ '𑢵' => '𑣕',
+ 'ð‘¢¶' => 'ð‘£–',
+ 'ð‘¢·' => 'ð‘£—',
+ '𑢸' => '𑣘',
+ 'ð‘¢¹' => 'ð‘£™',
+ '𑢺' => '𑣚',
+ 'ð‘¢»' => 'ð‘£›',
+ '𑢼' => '𑣜',
+ 'ð‘¢½' => 'ð‘£',
+ '𑢾' => '𑣞',
+ '𑢿' => '𑣟',
+);
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php b/plugins/vdomah/jwtauth/vendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php
new file mode 100644
index 0000000..2a8f6e7
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php
@@ -0,0 +1,5 @@
+ 'A',
+ 'b' => 'B',
+ 'c' => 'C',
+ 'd' => 'D',
+ 'e' => 'E',
+ 'f' => 'F',
+ 'g' => 'G',
+ 'h' => 'H',
+ 'i' => 'I',
+ 'j' => 'J',
+ 'k' => 'K',
+ 'l' => 'L',
+ 'm' => 'M',
+ 'n' => 'N',
+ 'o' => 'O',
+ 'p' => 'P',
+ 'q' => 'Q',
+ 'r' => 'R',
+ 's' => 'S',
+ 't' => 'T',
+ 'u' => 'U',
+ 'v' => 'V',
+ 'w' => 'W',
+ 'x' => 'X',
+ 'y' => 'Y',
+ 'z' => 'Z',
+ 'µ' => 'Μ',
+ 'à ' => 'À',
+ 'á' => 'Ã',
+ 'â' => 'Â',
+ 'ã' => 'Ã',
+ 'ä' => 'Ä',
+ 'Ã¥' => 'Ã…',
+ 'æ' => 'Æ',
+ 'ç' => 'Ç',
+ 'è' => 'È',
+ 'é' => 'É',
+ 'ê' => 'Ê',
+ 'ë' => 'Ë',
+ 'ì' => 'Ì',
+ 'Ã' => 'Ã',
+ 'î' => 'Î',
+ 'ï' => 'Ã',
+ 'ð' => 'Ã',
+ 'ñ' => 'Ñ',
+ 'ò' => 'Ò',
+ 'ó' => 'Ó',
+ 'ô' => 'Ô',
+ 'õ' => 'Õ',
+ 'ö' => 'Ö',
+ 'ø' => 'Ø',
+ 'ù' => 'Ù',
+ 'ú' => 'Ú',
+ 'û' => 'Û',
+ 'ü' => 'Ü',
+ 'ý' => 'Ã',
+ 'þ' => 'Þ',
+ 'ÿ' => 'Ÿ',
+ 'Ä' => 'Ä€',
+ 'ă' => 'Ă',
+ 'Ä…' => 'Ä„',
+ 'ć' => 'Ć',
+ 'ĉ' => 'Ĉ',
+ 'Ä‹' => 'ÄŠ',
+ 'Ä' => 'ÄŒ',
+ 'Ä' => 'ÄŽ',
+ 'Ä‘' => 'Ä',
+ 'Ä“' => 'Ä’',
+ 'Ä•' => 'Ä”',
+ 'Ä—' => 'Ä–',
+ 'ę' => 'Ę',
+ 'Ä›' => 'Äš',
+ 'Ä' => 'Äœ',
+ 'ÄŸ' => 'Äž',
+ 'Ä¡' => 'Ä ',
+ 'Ä£' => 'Ä¢',
+ 'ĥ' => 'Ĥ',
+ 'ħ' => 'Ħ',
+ 'ĩ' => 'Ĩ',
+ 'ī' => 'Ī',
+ 'Ä' => 'Ĭ',
+ 'į' => 'Į',
+ 'ı' => 'I',
+ 'ij' => 'IJ',
+ 'ĵ' => 'Ĵ',
+ 'ķ' => 'Ķ',
+ 'ĺ' => 'Ĺ',
+ 'ļ' => 'Ļ',
+ 'ľ' => 'Ľ',
+ 'Å€' => 'Ä¿',
+ 'Å‚' => 'Å',
+ 'ń' => 'Ń',
+ 'ņ' => 'Ņ',
+ 'ň' => 'Ň',
+ 'Å‹' => 'ÅŠ',
+ 'Å' => 'ÅŒ',
+ 'Å' => 'ÅŽ',
+ 'Å‘' => 'Å',
+ 'Å“' => 'Å’',
+ 'Å•' => 'Å”',
+ 'Å—' => 'Å–',
+ 'ř' => 'Ř',
+ 'Å›' => 'Åš',
+ 'Å' => 'Åœ',
+ 'ÅŸ' => 'Åž',
+ 'Å¡' => 'Å ',
+ 'Å£' => 'Å¢',
+ 'ť' => 'Ť',
+ 'ŧ' => 'Ŧ',
+ 'ũ' => 'Ũ',
+ 'ū' => 'Ū',
+ 'Å' => 'Ŭ',
+ 'ů' => 'Ů',
+ 'ű' => 'Ű',
+ 'ų' => 'Ų',
+ 'ŵ' => 'Ŵ',
+ 'ŷ' => 'Ŷ',
+ 'ź' => 'Ź',
+ 'ż' => 'Ż',
+ 'ž' => 'Ž',
+ 'Å¿' => 'S',
+ 'ƀ' => 'Ƀ',
+ 'ƃ' => 'Ƃ',
+ 'Æ…' => 'Æ„',
+ 'ƈ' => 'Ƈ',
+ 'ƌ' => 'Ƌ',
+ 'Æ’' => 'Æ‘',
+ 'ƕ' => 'Ƕ',
+ 'ƙ' => 'Ƙ',
+ 'ƚ' => 'Ƚ',
+ 'Æž' => 'È ',
+ 'Æ¡' => 'Æ ',
+ 'Æ£' => 'Æ¢',
+ 'ƥ' => 'Ƥ',
+ 'ƨ' => 'Ƨ',
+ 'Æ' => 'Ƭ',
+ 'ư' => 'Ư',
+ 'ƴ' => 'Ƴ',
+ 'ƶ' => 'Ƶ',
+ 'ƹ' => 'Ƹ',
+ 'ƽ' => 'Ƽ',
+ 'Æ¿' => 'Ç·',
+ 'Ç…' => 'Ç„',
+ 'dž' => 'DŽ',
+ 'Lj' => 'LJ',
+ 'lj' => 'LJ',
+ 'Ç‹' => 'ÇŠ',
+ 'nj' => 'NJ',
+ 'ÇŽ' => 'Ç',
+ 'Ç' => 'Ç',
+ 'Ç’' => 'Ç‘',
+ 'Ç”' => 'Ç“',
+ 'Ç–' => 'Ç•',
+ 'ǘ' => 'Ǘ',
+ 'Çš' => 'Ç™',
+ 'ǜ' => 'Ǜ',
+ 'Ç' => 'ÆŽ',
+ 'ÇŸ' => 'Çž',
+ 'Ç¡' => 'Ç ',
+ 'Ç£' => 'Ç¢',
+ 'ǥ' => 'Ǥ',
+ 'ǧ' => 'Ǧ',
+ 'ǩ' => 'Ǩ',
+ 'ǫ' => 'Ǫ',
+ 'Ç' => 'Ǭ',
+ 'ǯ' => 'Ǯ',
+ 'Dz' => 'DZ',
+ 'dz' => 'DZ',
+ 'ǵ' => 'Ǵ',
+ 'ǹ' => 'Ǹ',
+ 'ǻ' => 'Ǻ',
+ 'ǽ' => 'Ǽ',
+ 'ǿ' => 'Ǿ',
+ 'È' => 'È€',
+ 'ȃ' => 'Ȃ',
+ 'È…' => 'È„',
+ 'ȇ' => 'Ȇ',
+ 'ȉ' => 'Ȉ',
+ 'È‹' => 'ÈŠ',
+ 'È' => 'ÈŒ',
+ 'È' => 'ÈŽ',
+ 'È‘' => 'È',
+ 'È“' => 'È’',
+ 'È•' => 'È”',
+ 'È—' => 'È–',
+ 'ș' => 'Ș',
+ 'È›' => 'Èš',
+ 'È' => 'Èœ',
+ 'ÈŸ' => 'Èž',
+ 'È£' => 'È¢',
+ 'ȥ' => 'Ȥ',
+ 'ȧ' => 'Ȧ',
+ 'ȩ' => 'Ȩ',
+ 'ȫ' => 'Ȫ',
+ 'È' => 'Ȭ',
+ 'ȯ' => 'Ȯ',
+ 'ȱ' => 'Ȱ',
+ 'ȳ' => 'Ȳ',
+ 'ȼ' => 'Ȼ',
+ 'È¿' => 'â±¾',
+ 'ɀ' => 'Ɀ',
+ 'É‚' => 'É',
+ 'ɇ' => 'Ɇ',
+ 'ɉ' => 'Ɉ',
+ 'É‹' => 'ÉŠ',
+ 'É' => 'ÉŒ',
+ 'É' => 'ÉŽ',
+ 'É' => 'Ɐ',
+ 'É‘' => 'â±',
+ 'É’' => 'â±°',
+ 'É“' => 'Æ',
+ 'ɔ' => 'Ɔ',
+ 'ɖ' => 'Ɖ',
+ 'É—' => 'ÆŠ',
+ 'É™' => 'Æ',
+ 'É›' => 'Æ',
+ 'ɜ' => 'Ɜ',
+ 'É ' => 'Æ“',
+ 'ɡ' => 'Ɡ',
+ 'É£' => 'Æ”',
+ 'É¥' => 'êž',
+ 'ɦ' => 'Ɦ',
+ 'ɨ' => 'Ɨ',
+ 'É©' => 'Æ–',
+ 'É«' => 'â±¢',
+ 'ɬ' => 'êž',
+ 'ɯ' => 'Ɯ',
+ 'ɱ' => 'Ɱ',
+ 'ɲ' => 'Æ',
+ 'ɵ' => 'Ɵ',
+ 'ɽ' => 'Ɽ',
+ 'ʀ' => 'Ʀ',
+ 'ʃ' => 'Ʃ',
+ 'ʇ' => 'Ʇ',
+ 'ʈ' => 'Ʈ',
+ 'ʉ' => 'Ʉ',
+ 'ʊ' => 'Ʊ',
+ 'ʋ' => 'Ʋ',
+ 'ʌ' => 'Ʌ',
+ 'Ê’' => 'Æ·',
+ 'Êž' => 'êž°',
+ 'ͅ' => 'Ι',
+ 'ͱ' => 'Ͱ',
+ 'ͳ' => 'Ͳ',
+ 'ͷ' => 'Ͷ',
+ 'ͻ' => 'Ͻ',
+ 'ͼ' => 'Ͼ',
+ 'ͽ' => 'Ͽ',
+ 'ά' => 'Ά',
+ 'Î' => 'Έ',
+ 'ή' => 'Ή',
+ 'ί' => 'Ί',
+ 'α' => 'Α',
+ 'β' => 'Β',
+ 'γ' => 'Γ',
+ 'δ' => 'Δ',
+ 'ε' => 'Ε',
+ 'ζ' => 'Ζ',
+ 'η' => 'Η',
+ 'θ' => 'Θ',
+ 'ι' => 'Ι',
+ 'κ' => 'Κ',
+ 'λ' => 'Λ',
+ 'μ' => 'Μ',
+ 'ν' => 'Î',
+ 'ξ' => 'Ξ',
+ 'ο' => 'Ο',
+ 'Ï€' => 'Î ',
+ 'Ï' => 'Ρ',
+ 'ς' => 'Σ',
+ 'σ' => 'Σ',
+ 'τ' => 'Τ',
+ 'Ï…' => 'Î¥',
+ 'φ' => 'Φ',
+ 'χ' => 'Χ',
+ 'ψ' => 'Ψ',
+ 'ω' => 'Ω',
+ 'ϊ' => 'Ϊ',
+ 'ϋ' => 'Ϋ',
+ 'ό' => 'Ό',
+ 'Ï' => 'ÎŽ',
+ 'ÏŽ' => 'Î',
+ 'Ï' => 'Î’',
+ 'ϑ' => 'Θ',
+ 'ϕ' => 'Φ',
+ 'Ï–' => 'Î ',
+ 'Ï—' => 'Ï',
+ 'ϙ' => 'Ϙ',
+ 'Ï›' => 'Ïš',
+ 'Ï' => 'Ïœ',
+ 'ÏŸ' => 'Ïž',
+ 'Ï¡' => 'Ï ',
+ 'Ï£' => 'Ï¢',
+ 'ϥ' => 'Ϥ',
+ 'ϧ' => 'Ϧ',
+ 'ϩ' => 'Ϩ',
+ 'ϫ' => 'Ϫ',
+ 'Ï' => 'Ϭ',
+ 'ϯ' => 'Ϯ',
+ 'ϰ' => 'Κ',
+ 'ϱ' => 'Ρ',
+ 'ϲ' => 'Ϲ',
+ 'ϳ' => 'Ϳ',
+ 'ϵ' => 'Ε',
+ 'ϸ' => 'Ϸ',
+ 'ϻ' => 'Ϻ',
+ 'а' => 'Ð',
+ 'б' => 'Б',
+ 'в' => 'В',
+ 'г' => 'Г',
+ 'д' => 'Д',
+ 'е' => 'Е',
+ 'ж' => 'Ж',
+ 'з' => 'З',
+ 'и' => 'И',
+ 'й' => 'Й',
+ 'к' => 'К',
+ 'л' => 'Л',
+ 'м' => 'М',
+ 'н' => 'Ð',
+ 'о' => 'О',
+ 'п' => 'П',
+ 'Ñ€' => 'Ð ',
+ 'Ñ' => 'С',
+ 'т' => 'Т',
+ 'у' => 'У',
+ 'ф' => 'Ф',
+ 'Ñ…' => 'Ð¥',
+ 'ц' => 'Ц',
+ 'ч' => 'Ч',
+ 'ш' => 'Ш',
+ 'щ' => 'Щ',
+ 'ъ' => 'Ъ',
+ 'ы' => 'Ы',
+ 'ь' => 'Ь',
+ 'Ñ' => 'Ð',
+ 'ю' => 'Ю',
+ 'Ñ' => 'Я',
+ 'Ñ' => 'Ѐ',
+ 'Ñ‘' => 'Ð',
+ 'ђ' => 'Ђ',
+ 'ѓ' => 'Ѓ',
+ 'є' => 'Є',
+ 'Ñ•' => 'Ð…',
+ 'і' => 'І',
+ 'ї' => 'Ї',
+ 'ј' => 'Ј',
+ 'љ' => 'Љ',
+ 'њ' => 'Њ',
+ 'ћ' => 'Ћ',
+ 'ќ' => 'Ќ',
+ 'Ñ' => 'Ð',
+ 'Ñž' => 'ÐŽ',
+ 'ÑŸ' => 'Ð',
+ 'Ñ¡' => 'Ñ ',
+ 'Ñ£' => 'Ñ¢',
+ 'ѥ' => 'Ѥ',
+ 'ѧ' => 'Ѧ',
+ 'ѩ' => 'Ѩ',
+ 'ѫ' => 'Ѫ',
+ 'Ñ' => 'Ѭ',
+ 'ѯ' => 'Ѯ',
+ 'ѱ' => 'Ѱ',
+ 'ѳ' => 'Ѳ',
+ 'ѵ' => 'Ѵ',
+ 'ѷ' => 'Ѷ',
+ 'ѹ' => 'Ѹ',
+ 'ѻ' => 'Ѻ',
+ 'ѽ' => 'Ѽ',
+ 'ѿ' => 'Ѿ',
+ 'Ò' => 'Ò€',
+ 'Ò‹' => 'ÒŠ',
+ 'Ò' => 'ÒŒ',
+ 'Ò' => 'ÒŽ',
+ 'Ò‘' => 'Ò',
+ 'Ò“' => 'Ò’',
+ 'Ò•' => 'Ò”',
+ 'Ò—' => 'Ò–',
+ 'Ò™' => 'Ò˜',
+ 'Ò›' => 'Òš',
+ 'Ò' => 'Òœ',
+ 'ÒŸ' => 'Òž',
+ 'Ò¡' => 'Ò ',
+ 'Ò£' => 'Ò¢',
+ 'Ò¥' => 'Ò¤',
+ 'Ò§' => 'Ò¦',
+ 'Ò©' => 'Ò¨',
+ 'Ò«' => 'Òª',
+ 'Ò' => 'Ò¬',
+ 'Ò¯' => 'Ò®',
+ 'Ò±' => 'Ò°',
+ 'Ò³' => 'Ò²',
+ 'Òµ' => 'Ò´',
+ 'Ò·' => 'Ò¶',
+ 'Ò¹' => 'Ò¸',
+ 'Ò»' => 'Òº',
+ 'Ò½' => 'Ò¼',
+ 'Ò¿' => 'Ò¾',
+ 'Ó‚' => 'Ó',
+ 'Ó„' => 'Óƒ',
+ 'Ó†' => 'Ó…',
+ 'Óˆ' => 'Ó‡',
+ 'ÓŠ' => 'Ó‰',
+ 'ӌ' => 'Ӌ',
+ 'ÓŽ' => 'Ó',
+ 'Ó' => 'Ó€',
+ 'Ó‘' => 'Ó',
+ 'Ó“' => 'Ó’',
+ 'Ó•' => 'Ó”',
+ 'Ó—' => 'Ó–',
+ 'Ó™' => 'Ó˜',
+ 'Ó›' => 'Óš',
+ 'Ó' => 'Óœ',
+ 'ÓŸ' => 'Óž',
+ 'Ó¡' => 'Ó ',
+ 'Ó£' => 'Ó¢',
+ 'Ó¥' => 'Ó¤',
+ 'Ó§' => 'Ó¦',
+ 'Ó©' => 'Ó¨',
+ 'Ó«' => 'Óª',
+ 'Ó' => 'Ó¬',
+ 'Ó¯' => 'Ó®',
+ 'Ó±' => 'Ó°',
+ 'Ó³' => 'Ó²',
+ 'Óµ' => 'Ó´',
+ 'Ó·' => 'Ó¶',
+ 'Ó¹' => 'Ó¸',
+ 'Ó»' => 'Óº',
+ 'Ó½' => 'Ó¼',
+ 'Ó¿' => 'Ó¾',
+ 'Ô' => 'Ô€',
+ 'Ôƒ' => 'Ô‚',
+ 'Ô…' => 'Ô„',
+ 'Ô‡' => 'Ô†',
+ 'Ô‰' => 'Ôˆ',
+ 'Ô‹' => 'ÔŠ',
+ 'Ô' => 'ÔŒ',
+ 'Ô' => 'ÔŽ',
+ 'Ô‘' => 'Ô',
+ 'Ô“' => 'Ô’',
+ 'Ô•' => 'Ô”',
+ 'Ô—' => 'Ô–',
+ 'Ô™' => 'Ô˜',
+ 'Ô›' => 'Ôš',
+ 'Ô' => 'Ôœ',
+ 'ÔŸ' => 'Ôž',
+ 'Ô¡' => 'Ô ',
+ 'Ô£' => 'Ô¢',
+ 'Ô¥' => 'Ô¤',
+ 'Ô§' => 'Ô¦',
+ 'Ô©' => 'Ô¨',
+ 'Ô«' => 'Ôª',
+ 'Ô' => 'Ô¬',
+ 'Ô¯' => 'Ô®',
+ 'Õ¡' => 'Ô±',
+ 'Õ¢' => 'Ô²',
+ 'Õ£' => 'Ô³',
+ 'Õ¤' => 'Ô´',
+ 'Õ¥' => 'Ôµ',
+ 'Õ¦' => 'Ô¶',
+ 'Õ§' => 'Ô·',
+ 'Õ¨' => 'Ô¸',
+ 'Õ©' => 'Ô¹',
+ 'Õª' => 'Ôº',
+ 'Õ«' => 'Ô»',
+ 'Õ¬' => 'Ô¼',
+ 'Õ' => 'Ô½',
+ 'Õ®' => 'Ô¾',
+ 'Õ¯' => 'Ô¿',
+ 'Õ°' => 'Õ€',
+ 'Õ±' => 'Õ',
+ 'Õ²' => 'Õ‚',
+ 'Õ³' => 'Õƒ',
+ 'Õ´' => 'Õ„',
+ 'Õµ' => 'Õ…',
+ 'Õ¶' => 'Õ†',
+ 'Õ·' => 'Õ‡',
+ 'Õ¸' => 'Õˆ',
+ 'Õ¹' => 'Õ‰',
+ 'Õº' => 'ÕŠ',
+ 'Õ»' => 'Õ‹',
+ 'ռ' => 'Ռ',
+ 'Õ½' => 'Õ',
+ 'Õ¾' => 'ÕŽ',
+ 'Õ¿' => 'Õ',
+ 'Ö€' => 'Õ',
+ 'Ö' => 'Õ‘',
+ 'Ö‚' => 'Õ’',
+ 'Öƒ' => 'Õ“',
+ 'Ö„' => 'Õ”',
+ 'Ö…' => 'Õ•',
+ 'Ö†' => 'Õ–',
+ 'áµ¹' => 'ê½',
+ 'áµ½' => 'â±£',
+ 'á¸' => 'Ḁ',
+ 'ḃ' => 'Ḃ',
+ 'ḅ' => 'Ḅ',
+ 'ḇ' => 'Ḇ',
+ 'ḉ' => 'Ḉ',
+ 'ḋ' => 'Ḋ',
+ 'á¸' => 'Ḍ',
+ 'á¸' => 'Ḏ',
+ 'ḑ' => 'á¸',
+ 'ḓ' => 'Ḓ',
+ 'ḕ' => 'Ḕ',
+ 'ḗ' => 'Ḗ',
+ 'ḙ' => 'Ḙ',
+ 'ḛ' => 'Ḛ',
+ 'á¸' => 'Ḝ',
+ 'ḟ' => 'Ḟ',
+ 'ḡ' => 'Ḡ',
+ 'ḣ' => 'Ḣ',
+ 'ḥ' => 'Ḥ',
+ 'ḧ' => 'Ḧ',
+ 'ḩ' => 'Ḩ',
+ 'ḫ' => 'Ḫ',
+ 'á¸' => 'Ḭ',
+ 'ḯ' => 'Ḯ',
+ 'ḱ' => 'Ḱ',
+ 'ḳ' => 'Ḳ',
+ 'ḵ' => 'Ḵ',
+ 'ḷ' => 'Ḷ',
+ 'ḹ' => 'Ḹ',
+ 'ḻ' => 'Ḻ',
+ 'ḽ' => 'Ḽ',
+ 'ḿ' => 'Ḿ',
+ 'á¹' => 'á¹€',
+ 'ṃ' => 'Ṃ',
+ 'ṅ' => 'Ṅ',
+ 'ṇ' => 'Ṇ',
+ 'ṉ' => 'Ṉ',
+ 'ṋ' => 'Ṋ',
+ 'á¹' => 'Ṍ',
+ 'á¹' => 'Ṏ',
+ 'ṑ' => 'á¹',
+ 'ṓ' => 'Ṓ',
+ 'ṕ' => 'Ṕ',
+ 'á¹—' => 'á¹–',
+ 'ṙ' => 'Ṙ',
+ 'ṛ' => 'Ṛ',
+ 'á¹' => 'Ṝ',
+ 'ṟ' => 'Ṟ',
+ 'ṡ' => 'Ṡ',
+ 'á¹£' => 'á¹¢',
+ 'ṥ' => 'Ṥ',
+ 'ṧ' => 'Ṧ',
+ 'ṩ' => 'Ṩ',
+ 'ṫ' => 'Ṫ',
+ 'á¹' => 'Ṭ',
+ 'ṯ' => 'Ṯ',
+ 'á¹±' => 'á¹°',
+ 'á¹³' => 'á¹²',
+ 'á¹µ' => 'á¹´',
+ 'á¹·' => 'á¹¶',
+ 'ṹ' => 'Ṹ',
+ 'ṻ' => 'Ṻ',
+ 'á¹½' => 'á¹¼',
+ 'ṿ' => 'Ṿ',
+ 'áº' => 'Ẁ',
+ 'ẃ' => 'Ẃ',
+ 'ẅ' => 'Ẅ',
+ 'ẇ' => 'Ẇ',
+ 'ẉ' => 'Ẉ',
+ 'ẋ' => 'Ẋ',
+ 'áº' => 'Ẍ',
+ 'áº' => 'Ẏ',
+ 'ẑ' => 'áº',
+ 'ẓ' => 'Ẓ',
+ 'ẕ' => 'Ẕ',
+ 'ẛ' => 'Ṡ',
+ 'ạ' => 'Ạ',
+ 'ả' => 'Ả',
+ 'ấ' => 'Ấ',
+ 'ầ' => 'Ầ',
+ 'ẩ' => 'Ẩ',
+ 'ẫ' => 'Ẫ',
+ 'áº' => 'Ậ',
+ 'ắ' => 'Ắ',
+ 'ằ' => 'Ằ',
+ 'ẳ' => 'Ẳ',
+ 'ẵ' => 'Ẵ',
+ 'ặ' => 'Ặ',
+ 'ẹ' => 'Ẹ',
+ 'ẻ' => 'Ẻ',
+ 'ẽ' => 'Ẽ',
+ 'ế' => 'Ế',
+ 'á»' => 'Ề',
+ 'ể' => 'Ể',
+ 'ễ' => 'Ễ',
+ 'ệ' => 'Ệ',
+ 'ỉ' => 'Ỉ',
+ 'ị' => 'Ị',
+ 'á»' => 'Ọ',
+ 'á»' => 'Ỏ',
+ 'ố' => 'á»',
+ 'ồ' => 'Ồ',
+ 'ổ' => 'Ổ',
+ 'á»—' => 'á»–',
+ 'ộ' => 'Ộ',
+ 'ớ' => 'Ớ',
+ 'á»' => 'Ờ',
+ 'ở' => 'Ở',
+ 'ỡ' => 'Ỡ',
+ 'ợ' => 'Ợ',
+ 'ụ' => 'Ụ',
+ 'ủ' => 'Ủ',
+ 'ứ' => 'Ứ',
+ 'ừ' => 'Ừ',
+ 'á»' => 'Ử',
+ 'ữ' => 'Ữ',
+ 'á»±' => 'á»°',
+ 'ỳ' => 'Ỳ',
+ 'ỵ' => 'Ỵ',
+ 'á»·' => 'á»¶',
+ 'ỹ' => 'Ỹ',
+ 'ỻ' => 'Ỻ',
+ 'ỽ' => 'Ỽ',
+ 'ỿ' => 'Ỿ',
+ 'ἀ' => 'Ἀ',
+ 'á¼' => 'Ἁ',
+ 'ἂ' => 'Ἂ',
+ 'ἃ' => 'Ἃ',
+ 'ἄ' => 'Ἄ',
+ 'á¼…' => 'á¼',
+ 'ἆ' => 'Ἆ',
+ 'ἇ' => 'á¼',
+ 'á¼' => 'Ἐ',
+ 'ἑ' => 'Ἑ',
+ 'ἒ' => 'Ἒ',
+ 'ἓ' => 'Ἓ',
+ 'ἔ' => 'Ἔ',
+ 'ἕ' => 'á¼',
+ 'ἠ' => 'Ἠ',
+ 'ἡ' => 'Ἡ',
+ 'ἢ' => 'Ἢ',
+ 'ἣ' => 'Ἣ',
+ 'ἤ' => 'Ἤ',
+ 'á¼¥' => 'á¼',
+ 'ἦ' => 'Ἦ',
+ 'ἧ' => 'Ἧ',
+ 'ἰ' => 'Ἰ',
+ 'á¼±' => 'á¼¹',
+ 'ἲ' => 'Ἲ',
+ 'á¼³' => 'á¼»',
+ 'á¼´' => 'á¼¼',
+ 'á¼µ' => 'á¼½',
+ 'á¼¶' => 'á¼¾',
+ 'ἷ' => 'Ἷ',
+ 'ὀ' => 'Ὀ',
+ 'á½' => 'Ὁ',
+ 'ὂ' => 'Ὂ',
+ 'ὃ' => 'Ὃ',
+ 'ὄ' => 'Ὄ',
+ 'á½…' => 'á½',
+ 'ὑ' => 'Ὑ',
+ 'ὓ' => 'Ὓ',
+ 'ὕ' => 'á½',
+ 'ὗ' => 'Ὗ',
+ 'ὠ' => 'Ὠ',
+ 'ὡ' => 'Ὡ',
+ 'ὢ' => 'Ὢ',
+ 'ὣ' => 'Ὣ',
+ 'ὤ' => 'Ὤ',
+ 'á½¥' => 'á½',
+ 'ὦ' => 'Ὦ',
+ 'ὧ' => 'Ὧ',
+ 'ὰ' => 'Ὰ',
+ 'á½±' => 'á¾»',
+ 'ὲ' => 'Ὲ',
+ 'έ' => 'Έ',
+ 'ὴ' => 'Ὴ',
+ 'á½µ' => 'á¿‹',
+ 'ὶ' => 'Ὶ',
+ 'á½·' => 'á¿›',
+ 'ὸ' => 'Ὸ',
+ 'ό' => 'Ό',
+ 'ὺ' => 'Ὺ',
+ 'á½»' => 'á¿«',
+ 'ὼ' => 'Ὼ',
+ 'á½½' => 'á¿»',
+ 'ᾀ' => 'ᾈ',
+ 'á¾' => 'ᾉ',
+ 'ᾂ' => 'ᾊ',
+ 'ᾃ' => 'ᾋ',
+ 'ᾄ' => 'ᾌ',
+ 'á¾…' => 'á¾',
+ 'ᾆ' => 'ᾎ',
+ 'ᾇ' => 'á¾',
+ 'á¾' => 'ᾘ',
+ 'ᾑ' => 'ᾙ',
+ 'ᾒ' => 'ᾚ',
+ 'ᾓ' => 'ᾛ',
+ 'ᾔ' => 'ᾜ',
+ 'ᾕ' => 'á¾',
+ 'ᾖ' => 'ᾞ',
+ 'ᾗ' => 'ᾟ',
+ 'ᾠ' => 'ᾨ',
+ 'ᾡ' => 'ᾩ',
+ 'ᾢ' => 'ᾪ',
+ 'ᾣ' => 'ᾫ',
+ 'ᾤ' => 'ᾬ',
+ 'á¾¥' => 'á¾',
+ 'ᾦ' => 'ᾮ',
+ 'ᾧ' => 'ᾯ',
+ 'ᾰ' => 'Ᾰ',
+ 'á¾±' => 'á¾¹',
+ 'á¾³' => 'á¾¼',
+ 'ι' => 'Ι',
+ 'ῃ' => 'ῌ',
+ 'á¿' => 'Ῐ',
+ 'á¿‘' => 'á¿™',
+ 'ῠ' => 'Ῠ',
+ 'á¿¡' => 'á¿©',
+ 'ῥ' => 'Ῥ',
+ 'ῳ' => 'ῼ',
+ 'ⅎ' => 'Ⅎ',
+ 'â…°' => 'â… ',
+ 'â…±' => 'â…¡',
+ 'â…²' => 'â…¢',
+ 'â…³' => 'â…£',
+ 'â…´' => 'â…¤',
+ 'â…µ' => 'â…¥',
+ 'â…¶' => 'â…¦',
+ 'â…·' => 'â…§',
+ 'â…¸' => 'â…¨',
+ 'â…¹' => 'â…©',
+ 'â…º' => 'â…ª',
+ 'â…»' => 'â…«',
+ 'â…¼' => 'â…¬',
+ 'â…½' => 'â…',
+ 'â…¾' => 'â…®',
+ 'â…¿' => 'â…¯',
+ 'ↄ' => 'Ↄ',
+ 'â“' => 'â’¶',
+ 'â“‘' => 'â’·',
+ 'â“’' => 'â’¸',
+ 'â““' => 'â’¹',
+ 'â“”' => 'â’º',
+ 'â“•' => 'â’»',
+ 'â“–' => 'â’¼',
+ 'â“—' => 'â’½',
+ 'ⓘ' => 'Ⓘ',
+ 'â“™' => 'â’¿',
+ 'ⓚ' => 'Ⓚ',
+ 'â“›' => 'â“',
+ 'ⓜ' => 'Ⓜ',
+ 'â“' => 'Ⓝ',
+ 'ⓞ' => 'Ⓞ',
+ 'ⓟ' => 'Ⓟ',
+ 'ⓠ' => 'Ⓠ',
+ 'ⓡ' => 'Ⓡ',
+ 'ⓢ' => 'Ⓢ',
+ 'ⓣ' => 'Ⓣ',
+ 'ⓤ' => 'Ⓤ',
+ 'â“¥' => 'â“‹',
+ 'ⓦ' => 'Ⓦ',
+ 'â“§' => 'â“',
+ 'ⓨ' => 'Ⓨ',
+ 'â“©' => 'â“',
+ 'â°°' => 'â°€',
+ 'â°±' => 'â°',
+ 'â°²' => 'â°‚',
+ 'â°³' => 'â°ƒ',
+ 'â°´' => 'â°„',
+ 'â°µ' => 'â°…',
+ 'â°¶' => 'â°†',
+ 'â°·' => 'â°‡',
+ 'â°¸' => 'â°ˆ',
+ 'â°¹' => 'â°‰',
+ 'â°º' => 'â°Š',
+ 'â°»' => 'â°‹',
+ 'ⰼ' => 'Ⰼ',
+ 'â°½' => 'â°',
+ 'â°¾' => 'â°Ž',
+ 'â°¿' => 'â°',
+ 'â±€' => 'â°',
+ 'â±' => 'â°‘',
+ 'ⱂ' => 'Ⱂ',
+ 'ⱃ' => 'Ⱃ',
+ 'ⱄ' => 'Ⱄ',
+ 'â±…' => 'â°•',
+ 'ⱆ' => 'Ⱆ',
+ 'ⱇ' => 'Ⱇ',
+ 'ⱈ' => 'Ⱈ',
+ 'ⱉ' => 'Ⱉ',
+ 'ⱊ' => 'Ⱊ',
+ 'ⱋ' => 'Ⱋ',
+ 'ⱌ' => 'Ⱌ',
+ 'â±' => 'â°',
+ 'ⱎ' => 'Ⱎ',
+ 'â±' => 'â°Ÿ',
+ 'â±' => 'â° ',
+ 'ⱑ' => 'Ⱑ',
+ 'â±’' => 'â°¢',
+ 'ⱓ' => 'Ⱓ',
+ 'â±”' => 'â°¤',
+ 'ⱕ' => 'Ⱕ',
+ 'â±–' => 'â°¦',
+ 'â±—' => 'â°§',
+ 'ⱘ' => 'Ⱘ',
+ 'â±™' => 'â°©',
+ 'ⱚ' => 'Ⱚ',
+ 'â±›' => 'â°«',
+ 'ⱜ' => 'Ⱜ',
+ 'â±' => 'â°',
+ 'ⱞ' => 'Ⱞ',
+ 'ⱡ' => 'Ⱡ',
+ 'ⱥ' => 'Ⱥ',
+ 'ⱦ' => 'Ⱦ',
+ 'ⱨ' => 'Ⱨ',
+ 'ⱪ' => 'Ⱪ',
+ 'ⱬ' => 'Ⱬ',
+ 'â±³' => 'â±²',
+ 'â±¶' => 'â±µ',
+ 'â²' => 'â²€',
+ 'ⲃ' => 'Ⲃ',
+ 'ⲅ' => 'Ⲅ',
+ 'ⲇ' => 'Ⲇ',
+ 'ⲉ' => 'Ⲉ',
+ 'ⲋ' => 'Ⲋ',
+ 'â²' => 'Ⲍ',
+ 'â²' => 'Ⲏ',
+ 'ⲑ' => 'â²',
+ 'ⲓ' => 'Ⲓ',
+ 'ⲕ' => 'Ⲕ',
+ 'â²—' => 'â²–',
+ 'ⲙ' => 'Ⲙ',
+ 'ⲛ' => 'Ⲛ',
+ 'â²' => 'Ⲝ',
+ 'ⲟ' => 'Ⲟ',
+ 'ⲡ' => 'Ⲡ',
+ 'â²£' => 'â²¢',
+ 'ⲥ' => 'Ⲥ',
+ 'ⲧ' => 'Ⲧ',
+ 'ⲩ' => 'Ⲩ',
+ 'ⲫ' => 'Ⲫ',
+ 'â²' => 'Ⲭ',
+ 'ⲯ' => 'Ⲯ',
+ 'â²±' => 'â²°',
+ 'â²³' => 'â²²',
+ 'â²µ' => 'â²´',
+ 'â²·' => 'â²¶',
+ 'ⲹ' => 'Ⲹ',
+ 'ⲻ' => 'Ⲻ',
+ 'â²½' => 'â²¼',
+ 'ⲿ' => 'Ⲿ',
+ 'â³' => 'â³€',
+ 'ⳃ' => 'Ⳃ',
+ 'ⳅ' => 'Ⳅ',
+ 'ⳇ' => 'Ⳇ',
+ 'ⳉ' => 'Ⳉ',
+ 'ⳋ' => 'Ⳋ',
+ 'â³' => 'Ⳍ',
+ 'â³' => 'Ⳏ',
+ 'ⳑ' => 'â³',
+ 'ⳓ' => 'Ⳓ',
+ 'ⳕ' => 'Ⳕ',
+ 'â³—' => 'â³–',
+ 'ⳙ' => 'Ⳙ',
+ 'ⳛ' => 'Ⳛ',
+ 'â³' => 'Ⳝ',
+ 'ⳟ' => 'Ⳟ',
+ 'ⳡ' => 'Ⳡ',
+ 'â³£' => 'â³¢',
+ 'ⳬ' => 'Ⳬ',
+ 'â³®' => 'â³',
+ 'â³³' => 'â³²',
+ 'â´€' => 'á‚ ',
+ 'â´' => 'á‚¡',
+ 'â´‚' => 'á‚¢',
+ 'â´ƒ' => 'á‚£',
+ 'ⴄ' => 'Ⴄ',
+ 'â´…' => 'á‚¥',
+ 'ⴆ' => 'Ⴆ',
+ 'â´‡' => 'á‚§',
+ 'ⴈ' => 'Ⴈ',
+ 'â´‰' => 'á‚©',
+ 'ⴊ' => 'Ⴊ',
+ 'â´‹' => 'á‚«',
+ 'ⴌ' => 'Ⴌ',
+ 'â´' => 'á‚',
+ 'â´Ž' => 'á‚®',
+ 'â´' => 'Ⴏ',
+ 'â´' => 'á‚°',
+ 'ⴑ' => 'Ⴑ',
+ 'ⴒ' => 'Ⴒ',
+ 'ⴓ' => 'Ⴓ',
+ 'â´”' => 'á‚´',
+ 'ⴕ' => 'Ⴕ',
+ 'â´–' => 'á‚¶',
+ 'â´—' => 'á‚·',
+ 'ⴘ' => 'Ⴘ',
+ 'ⴙ' => 'Ⴙ',
+ 'ⴚ' => 'Ⴚ',
+ 'â´›' => 'á‚»',
+ 'ⴜ' => 'Ⴜ',
+ 'â´' => 'Ⴝ',
+ 'ⴞ' => 'Ⴞ',
+ 'â´Ÿ' => 'á‚¿',
+ 'ⴠ' => 'Ⴠ',
+ 'â´¡' => 'áƒ',
+ 'ⴢ' => 'Ⴢ',
+ 'ⴣ' => 'Ⴣ',
+ 'ⴤ' => 'Ⴤ',
+ 'ⴥ' => 'Ⴥ',
+ 'ⴧ' => 'Ⴧ',
+ 'â´' => 'áƒ',
+ 'ê™' => 'Ꙁ',
+ 'ꙃ' => 'Ꙃ',
+ 'ꙅ' => 'Ꙅ',
+ 'ꙇ' => 'Ꙇ',
+ 'ꙉ' => 'Ꙉ',
+ 'ꙋ' => 'Ꙋ',
+ 'ê™' => 'Ꙍ',
+ 'ê™' => 'Ꙏ',
+ 'ꙑ' => 'ê™',
+ 'ꙓ' => 'Ꙓ',
+ 'ꙕ' => 'Ꙕ',
+ 'ê™—' => 'ê™–',
+ 'ꙙ' => 'Ꙙ',
+ 'ꙛ' => 'Ꙛ',
+ 'ê™' => 'Ꙝ',
+ 'ꙟ' => 'Ꙟ',
+ 'ꙡ' => 'ê™ ',
+ 'ꙣ' => 'Ꙣ',
+ 'ꙥ' => 'Ꙥ',
+ 'ꙧ' => 'Ꙧ',
+ 'ꙩ' => 'Ꙩ',
+ 'ꙫ' => 'Ꙫ',
+ 'ê™' => 'Ꙭ',
+ 'êš' => 'Ꚁ',
+ 'ꚃ' => 'Ꚃ',
+ 'êš…' => 'êš„',
+ 'ꚇ' => 'Ꚇ',
+ 'ꚉ' => 'Ꚉ',
+ 'ꚋ' => 'Ꚋ',
+ 'êš' => 'Ꚍ',
+ 'êš' => 'Ꚏ',
+ 'êš‘' => 'êš',
+ 'êš“' => 'êš’',
+ 'êš•' => 'êš”',
+ 'êš—' => 'êš–',
+ 'ꚙ' => 'Ꚙ',
+ 'êš›' => 'êšš',
+ 'ꜣ' => 'Ꜣ',
+ 'ꜥ' => 'Ꜥ',
+ 'ꜧ' => 'Ꜧ',
+ 'ꜩ' => 'Ꜩ',
+ 'ꜫ' => 'Ꜫ',
+ 'êœ' => 'Ꜭ',
+ 'ꜯ' => 'Ꜯ',
+ 'ꜳ' => 'Ꜳ',
+ 'ꜵ' => 'Ꜵ',
+ 'ꜷ' => 'Ꜷ',
+ 'ꜹ' => 'Ꜹ',
+ 'ꜻ' => 'Ꜻ',
+ 'ꜽ' => 'Ꜽ',
+ 'ꜿ' => 'Ꜿ',
+ 'ê' => 'ê€',
+ 'êƒ' => 'ê‚',
+ 'ê…' => 'ê„',
+ 'ê‡' => 'ê†',
+ 'ê‰' => 'êˆ',
+ 'ê‹' => 'êŠ',
+ 'ê' => 'êŒ',
+ 'ê' => 'êŽ',
+ 'ê‘' => 'ê',
+ 'ê“' => 'ê’',
+ 'ê•' => 'ê”',
+ 'ê—' => 'ê–',
+ 'ê™' => 'ê˜',
+ 'ê›' => 'êš',
+ 'ê' => 'êœ',
+ 'êŸ' => 'êž',
+ 'ê¡' => 'ê ',
+ 'ê£' => 'ê¢',
+ 'ê¥' => 'ê¤',
+ 'ê§' => 'ê¦',
+ 'ê©' => 'ê¨',
+ 'ê«' => 'êª',
+ 'ê' => 'ê¬',
+ 'ê¯' => 'ê®',
+ 'êº' => 'ê¹',
+ 'ê¼' => 'ê»',
+ 'ê¿' => 'ê¾',
+ 'êž' => 'Ꞁ',
+ 'ꞃ' => 'Ꞃ',
+ 'êž…' => 'êž„',
+ 'ꞇ' => 'Ꞇ',
+ 'ꞌ' => 'Ꞌ',
+ 'êž‘' => 'êž',
+ 'êž“' => 'êž’',
+ 'êž—' => 'êž–',
+ 'ꞙ' => 'Ꞙ',
+ 'êž›' => 'êžš',
+ 'êž' => 'êžœ',
+ 'ꞟ' => 'Ꞟ',
+ 'êž¡' => 'êž ',
+ 'ꞣ' => 'Ꞣ',
+ 'ꞥ' => 'Ꞥ',
+ 'ꞧ' => 'Ꞧ',
+ 'ꞩ' => 'Ꞩ',
+ 'ï½' => 'A',
+ 'b' => 'B',
+ 'c' => 'C',
+ 'd' => 'D',
+ 'ï½…' => 'ï¼¥',
+ 'f' => 'F',
+ 'g' => 'G',
+ 'h' => 'H',
+ 'i' => 'I',
+ 'j' => 'J',
+ 'k' => 'K',
+ 'l' => 'L',
+ 'ï½' => 'ï¼',
+ 'n' => 'N',
+ 'ï½' => 'O',
+ 'ï½' => 'ï¼°',
+ 'q' => 'Q',
+ 'ï½’' => 'ï¼²',
+ 's' => 'S',
+ 'ï½”' => 'ï¼´',
+ 'u' => 'U',
+ 'ï½–' => 'ï¼¶',
+ 'ï½—' => 'ï¼·',
+ 'x' => 'X',
+ 'ï½™' => 'ï¼¹',
+ 'z' => 'Z',
+ 'ð¨' => 'ð€',
+ 'ð©' => 'ð',
+ 'ðª' => 'ð‚',
+ 'ð«' => 'ðƒ',
+ 'ð¬' => 'ð„',
+ 'ð' => 'ð…',
+ 'ð®' => 'ð†',
+ 'ð¯' => 'ð‡',
+ 'ð°' => 'ðˆ',
+ 'ð±' => 'ð‰',
+ 'ð²' => 'ðŠ',
+ 'ð³' => 'ð‹',
+ 'ð´' => 'ðŒ',
+ 'ðµ' => 'ð',
+ 'ð¶' => 'ðŽ',
+ 'ð·' => 'ð',
+ 'ð¸' => 'ð',
+ 'ð¹' => 'ð‘',
+ 'ðº' => 'ð’',
+ 'ð»' => 'ð“',
+ 'ð¼' => 'ð”',
+ 'ð½' => 'ð•',
+ 'ð¾' => 'ð–',
+ 'ð¿' => 'ð—',
+ 'ð‘€' => 'ð˜',
+ 'ð‘' => 'ð™',
+ 'ð‘‚' => 'ðš',
+ 'ð‘ƒ' => 'ð›',
+ 'ð‘„' => 'ðœ',
+ 'ð‘…' => 'ð',
+ 'ð‘†' => 'ðž',
+ 'ð‘‡' => 'ðŸ',
+ 'ð‘ˆ' => 'ð ',
+ 'ð‘‰' => 'ð¡',
+ 'ð‘Š' => 'ð¢',
+ 'ð‘‹' => 'ð£',
+ 'ð‘Œ' => 'ð¤',
+ 'ð‘' => 'ð¥',
+ 'ð‘Ž' => 'ð¦',
+ 'ð‘' => 'ð§',
+ 'ð‘£€' => 'ð‘¢ ',
+ 'ð‘£' => '𑢡',
+ '𑣂' => '𑢢',
+ '𑣃' => '𑢣',
+ '𑣄' => '𑢤',
+ 'ð‘£…' => 'ð‘¢¥',
+ '𑣆' => '𑢦',
+ '𑣇' => '𑢧',
+ '𑣈' => '𑢨',
+ '𑣉' => '𑢩',
+ '𑣊' => '𑢪',
+ '𑣋' => '𑢫',
+ '𑣌' => '𑢬',
+ 'ð‘£' => 'ð‘¢',
+ '𑣎' => '𑢮',
+ 'ð‘£' => '𑢯',
+ 'ð‘£' => 'ð‘¢°',
+ '𑣑' => '𑢱',
+ 'ð‘£’' => 'ð‘¢²',
+ '𑣓' => '𑢳',
+ 'ð‘£”' => 'ð‘¢´',
+ '𑣕' => '𑢵',
+ 'ð‘£–' => 'ð‘¢¶',
+ 'ð‘£—' => 'ð‘¢·',
+ '𑣘' => '𑢸',
+ 'ð‘£™' => 'ð‘¢¹',
+ '𑣚' => '𑢺',
+ 'ð‘£›' => 'ð‘¢»',
+ '𑣜' => '𑢼',
+ 'ð‘£' => 'ð‘¢½',
+ '𑣞' => '𑢾',
+ '𑣟' => '𑢿',
+);
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/polyfill-mbstring/bootstrap.php b/plugins/vdomah/jwtauth/vendor/symfony/polyfill-mbstring/bootstrap.php
new file mode 100644
index 0000000..b36a092
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/polyfill-mbstring/bootstrap.php
@@ -0,0 +1,141 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+use Symfony\Polyfill\Mbstring as p;
+
+if (!function_exists('mb_convert_encoding')) {
+ function mb_convert_encoding($s, $to, $from = null) { return p\Mbstring::mb_convert_encoding($s, $to, $from); }
+}
+if (!function_exists('mb_decode_mimeheader')) {
+ function mb_decode_mimeheader($s) { return p\Mbstring::mb_decode_mimeheader($s); }
+}
+if (!function_exists('mb_encode_mimeheader')) {
+ function mb_encode_mimeheader($s, $charset = null, $transferEnc = null, $lf = null, $indent = null) { return p\Mbstring::mb_encode_mimeheader($s, $charset, $transferEnc, $lf, $indent); }
+}
+if (!function_exists('mb_decode_numericentity')) {
+ function mb_decode_numericentity($s, $convmap, $enc = null) { return p\Mbstring::mb_decode_numericentity($s, $convmap, $enc); }
+}
+if (!function_exists('mb_encode_numericentity')) {
+ function mb_encode_numericentity($s, $convmap, $enc = null, $is_hex = false) { return p\Mbstring::mb_encode_numericentity($s, $convmap, $enc, $is_hex); }
+}
+if (!function_exists('mb_convert_case')) {
+ function mb_convert_case($s, $mode, $enc = null) { return p\Mbstring::mb_convert_case($s, $mode, $enc); }
+}
+if (!function_exists('mb_internal_encoding')) {
+ function mb_internal_encoding($enc = null) { return p\Mbstring::mb_internal_encoding($enc); }
+}
+if (!function_exists('mb_language')) {
+ function mb_language($lang = null) { return p\Mbstring::mb_language($lang); }
+}
+if (!function_exists('mb_list_encodings')) {
+ function mb_list_encodings() { return p\Mbstring::mb_list_encodings(); }
+}
+if (!function_exists('mb_encoding_aliases')) {
+ function mb_encoding_aliases($encoding) { return p\Mbstring::mb_encoding_aliases($encoding); }
+}
+if (!function_exists('mb_check_encoding')) {
+ function mb_check_encoding($var = null, $encoding = null) { return p\Mbstring::mb_check_encoding($var, $encoding); }
+}
+if (!function_exists('mb_detect_encoding')) {
+ function mb_detect_encoding($str, $encodingList = null, $strict = false) { return p\Mbstring::mb_detect_encoding($str, $encodingList, $strict); }
+}
+if (!function_exists('mb_detect_order')) {
+ function mb_detect_order($encodingList = null) { return p\Mbstring::mb_detect_order($encodingList); }
+}
+if (!function_exists('mb_parse_str')) {
+ function mb_parse_str($s, &$result = array()) { parse_str($s, $result); }
+}
+if (!function_exists('mb_strlen')) {
+ function mb_strlen($s, $enc = null) { return p\Mbstring::mb_strlen($s, $enc); }
+}
+if (!function_exists('mb_strpos')) {
+ function mb_strpos($s, $needle, $offset = 0, $enc = null) { return p\Mbstring::mb_strpos($s, $needle, $offset, $enc); }
+}
+if (!function_exists('mb_strtolower')) {
+ function mb_strtolower($s, $enc = null) { return p\Mbstring::mb_strtolower($s, $enc); }
+}
+if (!function_exists('mb_strtoupper')) {
+ function mb_strtoupper($s, $enc = null) { return p\Mbstring::mb_strtoupper($s, $enc); }
+}
+if (!function_exists('mb_substitute_character')) {
+ function mb_substitute_character($char = null) { return p\Mbstring::mb_substitute_character($char); }
+}
+if (!function_exists('mb_substr')) {
+ function mb_substr($s, $start, $length = 2147483647, $enc = null) { return p\Mbstring::mb_substr($s, $start, $length, $enc); }
+}
+if (!function_exists('mb_stripos')) {
+ function mb_stripos($s, $needle, $offset = 0, $enc = null) { return p\Mbstring::mb_stripos($s, $needle, $offset, $enc); }
+}
+if (!function_exists('mb_stristr')) {
+ function mb_stristr($s, $needle, $part = false, $enc = null) { return p\Mbstring::mb_stristr($s, $needle, $part, $enc); }
+}
+if (!function_exists('mb_strrchr')) {
+ function mb_strrchr($s, $needle, $part = false, $enc = null) { return p\Mbstring::mb_strrchr($s, $needle, $part, $enc); }
+}
+if (!function_exists('mb_strrichr')) {
+ function mb_strrichr($s, $needle, $part = false, $enc = null) { return p\Mbstring::mb_strrichr($s, $needle, $part, $enc); }
+}
+if (!function_exists('mb_strripos')) {
+ function mb_strripos($s, $needle, $offset = 0, $enc = null) { return p\Mbstring::mb_strripos($s, $needle, $offset, $enc); }
+}
+if (!function_exists('mb_strrpos')) {
+ function mb_strrpos($s, $needle, $offset = 0, $enc = null) { return p\Mbstring::mb_strrpos($s, $needle, $offset, $enc); }
+}
+if (!function_exists('mb_strstr')) {
+ function mb_strstr($s, $needle, $part = false, $enc = null) { return p\Mbstring::mb_strstr($s, $needle, $part, $enc); }
+}
+if (!function_exists('mb_get_info')) {
+ function mb_get_info($type = 'all') { return p\Mbstring::mb_get_info($type); }
+}
+if (!function_exists('mb_http_output')) {
+ function mb_http_output($enc = null) { return p\Mbstring::mb_http_output($enc); }
+}
+if (!function_exists('mb_strwidth')) {
+ function mb_strwidth($s, $enc = null) { return p\Mbstring::mb_strwidth($s, $enc); }
+}
+if (!function_exists('mb_substr_count')) {
+ function mb_substr_count($haystack, $needle, $enc = null) { return p\Mbstring::mb_substr_count($haystack, $needle, $enc); }
+}
+if (!function_exists('mb_output_handler')) {
+ function mb_output_handler($contents, $status) { return p\Mbstring::mb_output_handler($contents, $status); }
+}
+if (!function_exists('mb_http_input')) {
+ function mb_http_input($type = '') { return p\Mbstring::mb_http_input($type); }
+}
+if (!function_exists('mb_convert_variables')) {
+ function mb_convert_variables($toEncoding, $fromEncoding, &$a = null, &$b = null, &$c = null, &$d = null, &$e = null, &$f = null) { return p\Mbstring::mb_convert_variables($toEncoding, $fromEncoding, $a, $b, $c, $d, $e, $f); }
+}
+if (!function_exists('mb_ord')) {
+ function mb_ord($s, $enc = null) { return p\Mbstring::mb_ord($s, $enc); }
+}
+if (!function_exists('mb_chr')) {
+ function mb_chr($code, $enc = null) { return p\Mbstring::mb_chr($code, $enc); }
+}
+if (!function_exists('mb_scrub')) {
+ function mb_scrub($s, $enc = null) { $enc = null === $enc ? mb_internal_encoding() : $enc; return mb_convert_encoding($s, $enc, $enc); }
+}
+if (!function_exists('mb_str_split')) {
+ function mb_str_split($string, $split_length = 1, $encoding = null) { return p\Mbstring::mb_str_split($string, $split_length, $encoding); }
+}
+
+if (extension_loaded('mbstring')) {
+ return;
+}
+
+if (!defined('MB_CASE_UPPER')) {
+ define('MB_CASE_UPPER', 0);
+}
+if (!defined('MB_CASE_LOWER')) {
+ define('MB_CASE_LOWER', 1);
+}
+if (!defined('MB_CASE_TITLE')) {
+ define('MB_CASE_TITLE', 2);
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/polyfill-mbstring/composer.json b/plugins/vdomah/jwtauth/vendor/symfony/polyfill-mbstring/composer.json
new file mode 100644
index 0000000..d3dcc24
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/polyfill-mbstring/composer.json
@@ -0,0 +1,34 @@
+{
+ "name": "symfony/polyfill-mbstring",
+ "type": "library",
+ "description": "Symfony polyfill for the Mbstring extension",
+ "keywords": ["polyfill", "shim", "compatibility", "portable", "mbstring"],
+ "homepage": "https://symfony.com",
+ "license": "MIT",
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "autoload": {
+ "psr-4": { "Symfony\\Polyfill\\Mbstring\\": "" },
+ "files": [ "bootstrap.php" ]
+ },
+ "suggest": {
+ "ext-mbstring": "For best performance"
+ },
+ "minimum-stability": "dev",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.17-dev"
+ }
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/polyfill-php56/LICENSE b/plugins/vdomah/jwtauth/vendor/symfony/polyfill-php56/LICENSE
new file mode 100644
index 0000000..4cd8bdd
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/polyfill-php56/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2015-2019 Fabien Potencier
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is furnished
+to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/polyfill-php56/Php56.php b/plugins/vdomah/jwtauth/vendor/symfony/polyfill-php56/Php56.php
new file mode 100644
index 0000000..dbbc0e1
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/polyfill-php56/Php56.php
@@ -0,0 +1,138 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Polyfill\Php56;
+
+use Symfony\Polyfill\Util\Binary;
+
+/**
+ * @internal
+ */
+final class Php56
+{
+ const LDAP_ESCAPE_FILTER = 1;
+ const LDAP_ESCAPE_DN = 2;
+
+ public static function hash_equals($knownString, $userInput)
+ {
+ if (!\is_string($knownString)) {
+ trigger_error('Expected known_string to be a string, '.\gettype($knownString).' given', E_USER_WARNING);
+
+ return false;
+ }
+
+ if (!\is_string($userInput)) {
+ trigger_error('Expected user_input to be a string, '.\gettype($userInput).' given', E_USER_WARNING);
+
+ return false;
+ }
+
+ $knownLen = Binary::strlen($knownString);
+ $userLen = Binary::strlen($userInput);
+
+ if ($knownLen !== $userLen) {
+ return false;
+ }
+
+ $result = 0;
+
+ for ($i = 0; $i < $knownLen; ++$i) {
+ $result |= \ord($knownString[$i]) ^ \ord($userInput[$i]);
+ }
+
+ return 0 === $result;
+ }
+
+ /**
+ * Stub implementation of the {@link ldap_escape()} function of the ldap
+ * extension.
+ *
+ * Escape strings for safe use in LDAP filters and DNs.
+ *
+ * @author Chris Wright
+ *
+ * @param string $subject
+ * @param string $ignore
+ * @param int $flags
+ *
+ * @return string
+ *
+ * @see http://stackoverflow.com/a/8561604
+ */
+ public static function ldap_escape($subject, $ignore = '', $flags = 0)
+ {
+ static $charMaps = null;
+
+ if (null === $charMaps) {
+ $charMaps = array(
+ self::LDAP_ESCAPE_FILTER => array('\\', '*', '(', ')', "\x00"),
+ self::LDAP_ESCAPE_DN => array('\\', ',', '=', '+', '<', '>', ';', '"', '#', "\r"),
+ );
+
+ $charMaps[0] = array();
+
+ for ($i = 0; $i < 256; ++$i) {
+ $charMaps[0][\chr($i)] = sprintf('\\%02x', $i);
+ }
+
+ for ($i = 0, $l = \count($charMaps[self::LDAP_ESCAPE_FILTER]); $i < $l; ++$i) {
+ $chr = $charMaps[self::LDAP_ESCAPE_FILTER][$i];
+ unset($charMaps[self::LDAP_ESCAPE_FILTER][$i]);
+ $charMaps[self::LDAP_ESCAPE_FILTER][$chr] = $charMaps[0][$chr];
+ }
+
+ for ($i = 0, $l = \count($charMaps[self::LDAP_ESCAPE_DN]); $i < $l; ++$i) {
+ $chr = $charMaps[self::LDAP_ESCAPE_DN][$i];
+ unset($charMaps[self::LDAP_ESCAPE_DN][$i]);
+ $charMaps[self::LDAP_ESCAPE_DN][$chr] = $charMaps[0][$chr];
+ }
+ }
+
+ // Create the base char map to escape
+ $flags = (int) $flags;
+ $charMap = array();
+
+ if ($flags & self::LDAP_ESCAPE_FILTER) {
+ $charMap += $charMaps[self::LDAP_ESCAPE_FILTER];
+ }
+
+ if ($flags & self::LDAP_ESCAPE_DN) {
+ $charMap += $charMaps[self::LDAP_ESCAPE_DN];
+ }
+
+ if (!$charMap) {
+ $charMap = $charMaps[0];
+ }
+
+ // Remove any chars to ignore from the list
+ $ignore = (string) $ignore;
+
+ for ($i = 0, $l = \strlen($ignore); $i < $l; ++$i) {
+ unset($charMap[$ignore[$i]]);
+ }
+
+ // Do the main replacement
+ $result = strtr($subject, $charMap);
+
+ // Encode leading/trailing spaces if self::LDAP_ESCAPE_DN is passed
+ if ($flags & self::LDAP_ESCAPE_DN) {
+ if (' ' === $result[0]) {
+ $result = '\\20'.substr($result, 1);
+ }
+
+ if (' ' === $result[\strlen($result) - 1]) {
+ $result = substr($result, 0, -1).'\\20';
+ }
+ }
+
+ return $result;
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/polyfill-php56/README.md b/plugins/vdomah/jwtauth/vendor/symfony/polyfill-php56/README.md
new file mode 100644
index 0000000..5ad570b
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/polyfill-php56/README.md
@@ -0,0 +1,15 @@
+Symfony Polyfill / Php56
+========================
+
+This component provides functions unavailable in releases prior to PHP 5.6:
+
+- [`hash_equals`](https://php.net/hash_equals) (part of [hash](https://php.net/hash) extension)
+- [`ldap_escape`](https://php.net/ldap_escape) (part of [ldap](https://php.net/ldap) extension)
+
+More information can be found in the
+[main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md).
+
+License
+=======
+
+This library is released under the [MIT license](LICENSE).
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/polyfill-php56/bootstrap.php b/plugins/vdomah/jwtauth/vendor/symfony/polyfill-php56/bootstrap.php
new file mode 100644
index 0000000..427dd2e
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/polyfill-php56/bootstrap.php
@@ -0,0 +1,44 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+use Symfony\Polyfill\Php56 as p;
+
+if (PHP_VERSION_ID >= 50600) {
+ return;
+}
+
+if (!function_exists('hash_equals')) {
+ function hash_equals($knownString, $userInput) { return p\Php56::hash_equals($knownString, $userInput); }
+}
+if (extension_loaded('ldap') && !defined('LDAP_ESCAPE_FILTER')) {
+ define('LDAP_ESCAPE_FILTER', 1);
+}
+if (extension_loaded('ldap') && !defined('LDAP_ESCAPE_DN')) {
+ define('LDAP_ESCAPE_DN', 2);
+}
+
+if (extension_loaded('ldap') && !function_exists('ldap_escape')) {
+ function ldap_escape($subject, $ignore = '', $flags = 0) { return p\Php56::ldap_escape($subject, $ignore, $flags); }
+}
+
+if (50509 === PHP_VERSION_ID && 4 === PHP_INT_SIZE) {
+ // Missing functions in PHP 5.5.9 - affects 32 bit builds of Ubuntu 14.04LTS
+ // See https://bugs.launchpad.net/ubuntu/+source/php5/+bug/1315888
+ if (!function_exists('gzopen') && function_exists('gzopen64')) {
+ function gzopen($filename, $mode, $use_include_path = 0) { return gzopen64($filename, $mode, $use_include_path); }
+ }
+ if (!function_exists('gzseek') && function_exists('gzseek64')) {
+ function gzseek($zp, $offset, $whence = SEEK_SET) { return gzseek64($zp, $offset, $whence); }
+ }
+ if (!function_exists('gztell') && function_exists('gztell64')) {
+ function gztell($zp) { return gztell64($zp); }
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/polyfill-php56/composer.json b/plugins/vdomah/jwtauth/vendor/symfony/polyfill-php56/composer.json
new file mode 100644
index 0000000..e1e969f
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/polyfill-php56/composer.json
@@ -0,0 +1,32 @@
+{
+ "name": "symfony/polyfill-php56",
+ "type": "library",
+ "description": "Symfony polyfill backporting some PHP 5.6+ features to lower PHP versions",
+ "keywords": ["polyfill", "shim", "compatibility", "portable"],
+ "homepage": "https://symfony.com",
+ "license": "MIT",
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "require": {
+ "php": ">=5.3.3",
+ "symfony/polyfill-util": "~1.0"
+ },
+ "autoload": {
+ "psr-4": { "Symfony\\Polyfill\\Php56\\": "" },
+ "files": [ "bootstrap.php" ]
+ },
+ "minimum-stability": "dev",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.17-dev"
+ }
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/polyfill-util/Binary.php b/plugins/vdomah/jwtauth/vendor/symfony/polyfill-util/Binary.php
new file mode 100644
index 0000000..23ff974
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/polyfill-util/Binary.php
@@ -0,0 +1,22 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Polyfill\Util;
+
+if (\extension_loaded('mbstring')) {
+ class Binary extends BinaryOnFuncOverload
+ {
+ }
+} else {
+ class Binary extends BinaryNoFuncOverload
+ {
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/polyfill-util/BinaryNoFuncOverload.php b/plugins/vdomah/jwtauth/vendor/symfony/polyfill-util/BinaryNoFuncOverload.php
new file mode 100644
index 0000000..800ad75
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/polyfill-util/BinaryNoFuncOverload.php
@@ -0,0 +1,65 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Polyfill\Util;
+
+/**
+ * @author Nicolas Grekas
+ *
+ * @internal
+ */
+class BinaryNoFuncOverload
+{
+ public static function strlen($s)
+ {
+ return \strlen($s);
+ }
+
+ public static function strpos($haystack, $needle, $offset = 0)
+ {
+ return strpos($haystack, $needle, $offset);
+ }
+
+ public static function strrpos($haystack, $needle, $offset = 0)
+ {
+ return strrpos($haystack, $needle, $offset);
+ }
+
+ public static function substr($string, $start, $length = PHP_INT_MAX)
+ {
+ return substr($string, $start, $length);
+ }
+
+ public static function stripos($s, $needle, $offset = 0)
+ {
+ return stripos($s, $needle, $offset);
+ }
+
+ public static function stristr($s, $needle, $part = false)
+ {
+ return stristr($s, $needle, $part);
+ }
+
+ public static function strrchr($s, $needle, $part = false)
+ {
+ return strrchr($s, $needle, $part);
+ }
+
+ public static function strripos($s, $needle, $offset = 0)
+ {
+ return strripos($s, $needle, $offset);
+ }
+
+ public static function strstr($s, $needle, $part = false)
+ {
+ return strstr($s, $needle, $part);
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/polyfill-util/BinaryOnFuncOverload.php b/plugins/vdomah/jwtauth/vendor/symfony/polyfill-util/BinaryOnFuncOverload.php
new file mode 100644
index 0000000..e1b886e
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/polyfill-util/BinaryOnFuncOverload.php
@@ -0,0 +1,67 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Polyfill\Util;
+
+/**
+ * Binary safe version of string functions overloaded when MB_OVERLOAD_STRING is enabled.
+ *
+ * @author Nicolas Grekas
+ *
+ * @internal
+ */
+class BinaryOnFuncOverload
+{
+ public static function strlen($s)
+ {
+ return mb_strlen($s, '8bit');
+ }
+
+ public static function strpos($haystack, $needle, $offset = 0)
+ {
+ return mb_strpos($haystack, $needle, $offset, '8bit');
+ }
+
+ public static function strrpos($haystack, $needle, $offset = 0)
+ {
+ return mb_strrpos($haystack, $needle, $offset, '8bit');
+ }
+
+ public static function substr($string, $start, $length = 2147483647)
+ {
+ return mb_substr($string, $start, $length, '8bit');
+ }
+
+ public static function stripos($s, $needle, $offset = 0)
+ {
+ return mb_stripos($s, $needle, $offset, '8bit');
+ }
+
+ public static function stristr($s, $needle, $part = false)
+ {
+ return mb_stristr($s, $needle, $part, '8bit');
+ }
+
+ public static function strrchr($s, $needle, $part = false)
+ {
+ return mb_strrchr($s, $needle, $part, '8bit');
+ }
+
+ public static function strripos($s, $needle, $offset = 0)
+ {
+ return mb_strripos($s, $needle, $offset, '8bit');
+ }
+
+ public static function strstr($s, $needle, $part = false)
+ {
+ return mb_strstr($s, $needle, $part, '8bit');
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/polyfill-util/LICENSE b/plugins/vdomah/jwtauth/vendor/symfony/polyfill-util/LICENSE
new file mode 100644
index 0000000..4cd8bdd
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/polyfill-util/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2015-2019 Fabien Potencier
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is furnished
+to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/polyfill-util/README.md b/plugins/vdomah/jwtauth/vendor/symfony/polyfill-util/README.md
new file mode 100644
index 0000000..1c655fc
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/polyfill-util/README.md
@@ -0,0 +1,13 @@
+Symfony Polyfill / Util
+=======================
+
+This component provides binary-safe string functions, using the
+[mbstring](https://php.net/mbstring) extension when available.
+
+More information can be found in the
+[main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md).
+
+License
+=======
+
+This library is released under the [MIT license](LICENSE).
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/polyfill-util/TestListener.php b/plugins/vdomah/jwtauth/vendor/symfony/polyfill-util/TestListener.php
new file mode 100644
index 0000000..6b17d45
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/polyfill-util/TestListener.php
@@ -0,0 +1,28 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Polyfill\Util;
+
+if (class_exists('PHPUnit_Runner_Version') && version_compare(\PHPUnit_Runner_Version::id(), '6.0.0', '<')) {
+ class_alias('Symfony\Polyfill\Util\TestListenerForV5', 'Symfony\Polyfill\Util\TestListener');
+// Using an early return instead of a else does not work when using the PHPUnit phar due to some weird PHP behavior (the class
+// gets defined without executing the code before it and so the definition is not properly conditional)
+} elseif (version_compare(\PHPUnit\Runner\Version::id(), '7.0.0', '<')) {
+ class_alias('Symfony\Polyfill\Util\TestListenerForV6', 'Symfony\Polyfill\Util\TestListener');
+} else {
+ class_alias('Symfony\Polyfill\Util\TestListenerForV7', 'Symfony\Polyfill\Util\TestListener');
+}
+
+if (false) {
+ class TestListener
+ {
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/polyfill-util/TestListenerForV5.php b/plugins/vdomah/jwtauth/vendor/symfony/polyfill-util/TestListenerForV5.php
new file mode 100644
index 0000000..501053d
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/polyfill-util/TestListenerForV5.php
@@ -0,0 +1,89 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Polyfill\Util;
+
+/**
+ * @author Nicolas Grekas
+ */
+class TestListenerForV5 extends \PHPUnit_Framework_TestSuite implements \PHPUnit_Framework_TestListener
+{
+ private $suite;
+ private $trait;
+
+ public function __construct(\PHPUnit_Framework_TestSuite $suite = null)
+ {
+ if ($suite) {
+ $this->suite = $suite;
+ $this->setName($suite->getName().' with polyfills enabled');
+ $this->addTest($suite);
+ }
+ $this->trait = new TestListenerTrait();
+ }
+
+ public function startTestSuite(\PHPUnit_Framework_TestSuite $suite)
+ {
+ $this->trait->startTestSuite($suite);
+ }
+
+ public function addError(\PHPUnit_Framework_Test $test, \Exception $e, $time)
+ {
+ $this->trait->addError($test, $e, $time);
+ }
+
+ public function addWarning(\PHPUnit_Framework_Test $test, \PHPUnit_Framework_Warning $e, $time)
+ {
+ }
+
+ public function addFailure(\PHPUnit_Framework_Test $test, \PHPUnit_Framework_AssertionFailedError $e, $time)
+ {
+ $this->trait->addError($test, $e, $time);
+ }
+
+ public function addIncompleteTest(\PHPUnit_Framework_Test $test, \Exception $e, $time)
+ {
+ }
+
+ public function addRiskyTest(\PHPUnit_Framework_Test $test, \Exception $e, $time)
+ {
+ }
+
+ public function addSkippedTest(\PHPUnit_Framework_Test $test, \Exception $e, $time)
+ {
+ }
+
+ public function endTestSuite(\PHPUnit_Framework_TestSuite $suite)
+ {
+ }
+
+ public function startTest(\PHPUnit_Framework_Test $test)
+ {
+ }
+
+ public function endTest(\PHPUnit_Framework_Test $test, $time)
+ {
+ }
+
+ public static function warning($message)
+ {
+ return parent::warning($message);
+ }
+
+ protected function setUp()
+ {
+ TestListenerTrait::$enabledPolyfills = $this->suite->getName();
+ }
+
+ protected function tearDown()
+ {
+ TestListenerTrait::$enabledPolyfills = false;
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/polyfill-util/TestListenerForV6.php b/plugins/vdomah/jwtauth/vendor/symfony/polyfill-util/TestListenerForV6.php
new file mode 100644
index 0000000..e9e87cb
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/polyfill-util/TestListenerForV6.php
@@ -0,0 +1,95 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Polyfill\Util;
+
+use PHPUnit\Framework\AssertionFailedError;
+use PHPUnit\Framework\Test;
+use PHPUnit\Framework\TestListener as TestListenerInterface;
+use PHPUnit\Framework\TestSuite;
+use PHPUnit\Framework\Warning;
+
+/**
+ * @author Nicolas Grekas
+ */
+class TestListenerForV6 extends TestSuite implements TestListenerInterface
+{
+ private $suite;
+ private $trait;
+
+ public function __construct(TestSuite $suite = null)
+ {
+ if ($suite) {
+ $this->suite = $suite;
+ $this->setName($suite->getName().' with polyfills enabled');
+ $this->addTest($suite);
+ }
+ $this->trait = new TestListenerTrait();
+ }
+
+ public function startTestSuite(TestSuite $suite)
+ {
+ $this->trait->startTestSuite($suite);
+ }
+
+ public function addError(Test $test, \Exception $e, $time)
+ {
+ $this->trait->addError($test, $e, $time);
+ }
+
+ public function addWarning(Test $test, Warning $e, $time)
+ {
+ }
+
+ public function addFailure(Test $test, AssertionFailedError $e, $time)
+ {
+ $this->trait->addError($test, $e, $time);
+ }
+
+ public function addIncompleteTest(Test $test, \Exception $e, $time)
+ {
+ }
+
+ public function addRiskyTest(Test $test, \Exception $e, $time)
+ {
+ }
+
+ public function addSkippedTest(Test $test, \Exception $e, $time)
+ {
+ }
+
+ public function endTestSuite(TestSuite $suite)
+ {
+ }
+
+ public function startTest(Test $test)
+ {
+ }
+
+ public function endTest(Test $test, $time)
+ {
+ }
+
+ public static function warning($message)
+ {
+ return parent::warning($message);
+ }
+
+ protected function setUp()
+ {
+ TestListenerTrait::$enabledPolyfills = $this->suite->getName();
+ }
+
+ protected function tearDown()
+ {
+ TestListenerTrait::$enabledPolyfills = false;
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/polyfill-util/TestListenerForV7.php b/plugins/vdomah/jwtauth/vendor/symfony/polyfill-util/TestListenerForV7.php
new file mode 100644
index 0000000..a5c3759
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/polyfill-util/TestListenerForV7.php
@@ -0,0 +1,96 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Polyfill\Util;
+
+use PHPUnit\Framework\AssertionFailedError;
+use PHPUnit\Framework\Test;
+use PHPUnit\Framework\TestListener as TestListenerInterface;
+use PHPUnit\Framework\TestSuite;
+use PHPUnit\Framework\Warning;
+use PHPUnit\Framework\WarningTestCase;
+
+/**
+ * @author Ion Bazan
+ */
+class TestListenerForV7 extends TestSuite implements TestListenerInterface
+{
+ private $suite;
+ private $trait;
+
+ public function __construct(TestSuite $suite = null)
+ {
+ if ($suite) {
+ $this->suite = $suite;
+ $this->setName($suite->getName().' with polyfills enabled');
+ $this->addTest($suite);
+ }
+ $this->trait = new TestListenerTrait();
+ }
+
+ public function startTestSuite(TestSuite $suite): void
+ {
+ $this->trait->startTestSuite($suite);
+ }
+
+ public function addError(Test $test, \Throwable $t, float $time): void
+ {
+ $this->trait->addError($test, $t, $time);
+ }
+
+ public function addWarning(Test $test, Warning $e, float $time): void
+ {
+ }
+
+ public function addFailure(Test $test, AssertionFailedError $e, float $time): void
+ {
+ $this->trait->addError($test, $e, $time);
+ }
+
+ public function addIncompleteTest(Test $test, \Throwable $t, float $time): void
+ {
+ }
+
+ public function addRiskyTest(Test $test, \Throwable $t, float $time): void
+ {
+ }
+
+ public function addSkippedTest(Test $test, \Throwable $t, float $time): void
+ {
+ }
+
+ public function endTestSuite(TestSuite $suite): void
+ {
+ }
+
+ public function startTest(Test $test): void
+ {
+ }
+
+ public function endTest(Test $test, float $time): void
+ {
+ }
+
+ public static function warning($message): WarningTestCase
+ {
+ return new WarningTestCase($message);
+ }
+
+ protected function setUp(): void
+ {
+ TestListenerTrait::$enabledPolyfills = $this->suite->getName();
+ }
+
+ protected function tearDown(): void
+ {
+ TestListenerTrait::$enabledPolyfills = false;
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/polyfill-util/TestListenerTrait.php b/plugins/vdomah/jwtauth/vendor/symfony/polyfill-util/TestListenerTrait.php
new file mode 100644
index 0000000..777fb48
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/polyfill-util/TestListenerTrait.php
@@ -0,0 +1,129 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Polyfill\Util;
+
+/**
+ * @author Nicolas Grekas
+ */
+class TestListenerTrait
+{
+ public static $enabledPolyfills;
+
+ public function startTestSuite($mainSuite)
+ {
+ if (null !== self::$enabledPolyfills) {
+ return;
+ }
+ self::$enabledPolyfills = false;
+ $SkippedTestError = class_exists('PHPUnit\Framework\SkippedTestError') ? 'PHPUnit\Framework\SkippedTestError' : 'PHPUnit_Framework_SkippedTestError';
+
+ foreach ($mainSuite->tests() as $suite) {
+ $testClass = $suite->getName();
+ if (!$tests = $suite->tests()) {
+ continue;
+ }
+ $testedClass = new \ReflectionClass($testClass);
+ if (preg_match('{^ \* @requires PHP (.*)}mi', $testedClass->getDocComment(), $m) && version_compare($m[1], \PHP_VERSION, '>')) {
+ continue;
+ }
+ if (!preg_match('/^(.+)\\\\Tests(\\\\.*)Test$/', $testClass, $m)) {
+ $mainSuite->addTest(TestListener::warning('Unknown naming convention for '.$testClass));
+ continue;
+ }
+ if (!class_exists($m[1].$m[2])) {
+ continue;
+ }
+ $testedClass = new \ReflectionClass($m[1].$m[2]);
+ $bootstrap = new \SplFileObject(\dirname($testedClass->getFileName()).'/bootstrap.php');
+ $warnings = array();
+ $defLine = null;
+
+ foreach (new \RegexIterator($bootstrap, '/define\(\'/') as $defLine) {
+ preg_match('/define\(\'(?P.+)\'/', $defLine, $matches);
+ if (\defined($matches['name'])) {
+ continue;
+ }
+
+ try {
+ eval($defLine);
+ } catch (\PHPUnit_Framework_Exception $ex){
+ $warnings[] = TestListener::warning($ex->getMessage());
+ } catch (\PHPUnit\Framework\Exception $ex) {
+ $warnings[] = TestListener::warning($ex->getMessage());
+ }
+ }
+
+ $bootstrap->rewind();
+
+ foreach (new \RegexIterator($bootstrap, '/return p\\\\'.$testedClass->getShortName().'::/') as $defLine) {
+ if (!preg_match('/^\s*function (?P[^\(]++)(?P\(.*\)(?: ?: [^ ]++)?) \{ (?return p\\\\'.$testedClass->getShortName().'::[^\(]++)(?P\([^\)]*+\)); \}$/', $defLine, $f)) {
+ $warnings[] = TestListener::warning('Invalid line in bootstrap.php: '.trim($defLine));
+ continue;
+ }
+ $testNamespace = substr($testClass, 0, strrpos($testClass, '\\'));
+ if (\function_exists($testNamespace.'\\'.$f['name'])) {
+ continue;
+ }
+
+ try {
+ $r = new \ReflectionFunction($f['name']);
+ if ($r->isUserDefined()) {
+ throw new \ReflectionException();
+ }
+ if ('idn_to_ascii' === $f['name'] || 'idn_to_utf8' === $f['name']) {
+ $defLine = sprintf('return INTL_IDNA_VARIANT_2003 === $variant ? \\%s($domain, $options, $variant) : \\%1$s%s', $f['name'], $f['args']);
+ } elseif (false !== strpos($f['signature'], '&') && 'idn_to_ascii' !== $f['name'] && 'idn_to_utf8' !== $f['name']) {
+ $defLine = sprintf('return \\%s%s', $f['name'], $f['args']);
+ } else {
+ $defLine = sprintf("return \\call_user_func_array('%s', \\func_get_args())", $f['name']);
+ }
+ } catch (\ReflectionException $e) {
+ $defLine = sprintf("throw new \\{$SkippedTestError}('Internal function not found: %s')", $f['name']);
+ }
+
+ eval(<<getNamespaceName()} as p;
+
+function {$f['name']}{$f['signature']}
+{
+ if ('{$testClass}' === TestListenerTrait::\$enabledPolyfills) {
+ {$f['return']}{$f['args']};
+ }
+
+ {$defLine};
+}
+EOPHP
+ );
+ }
+ if (!$warnings && null === $defLine) {
+ $warnings[] = new $SkippedTestError('No Polyfills found in bootstrap.php for '.$testClass);
+ } else {
+ $mainSuite->addTest(new TestListener($suite));
+ }
+ }
+ foreach ($warnings as $w) {
+ $mainSuite->addTest($w);
+ }
+ }
+
+ public function addError($test, \Exception $e, $time)
+ {
+ if (false !== self::$enabledPolyfills) {
+ $r = new \ReflectionProperty('Exception', 'message');
+ $r->setAccessible(true);
+ $r->setValue($e, 'Polyfills enabled, '.$r->getValue($e));
+ }
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/polyfill-util/composer.json b/plugins/vdomah/jwtauth/vendor/symfony/polyfill-util/composer.json
new file mode 100644
index 0000000..1ab79ac
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/polyfill-util/composer.json
@@ -0,0 +1,30 @@
+{
+ "name": "symfony/polyfill-util",
+ "type": "library",
+ "description": "Symfony utilities for portability of PHP codes",
+ "keywords": ["polyfill", "shim", "compat", "compatibility"],
+ "homepage": "https://symfony.com",
+ "license": "MIT",
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "autoload": {
+ "psr-4": { "Symfony\\Polyfill\\Util\\": "" }
+ },
+ "minimum-stability": "dev",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.17-dev"
+ }
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation-contracts/CHANGELOG.md b/plugins/vdomah/jwtauth/vendor/symfony/translation-contracts/CHANGELOG.md
new file mode 100644
index 0000000..e984777
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation-contracts/CHANGELOG.md
@@ -0,0 +1,5 @@
+CHANGELOG
+=========
+
+The changelog is maintained for all Symfony contracts at the following URL:
+https://github.com/symfony/contracts/blob/master/CHANGELOG.md
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation-contracts/LICENSE b/plugins/vdomah/jwtauth/vendor/symfony/translation-contracts/LICENSE
new file mode 100644
index 0000000..69d925b
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation-contracts/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2018-2020 Fabien Potencier
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is furnished
+to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation-contracts/LocaleAwareInterface.php b/plugins/vdomah/jwtauth/vendor/symfony/translation-contracts/LocaleAwareInterface.php
new file mode 100644
index 0000000..922ec1d
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation-contracts/LocaleAwareInterface.php
@@ -0,0 +1,31 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Contracts\Translation;
+
+interface LocaleAwareInterface
+{
+ /**
+ * Sets the current locale.
+ *
+ * @param string $locale The locale
+ *
+ * @throws \InvalidArgumentException If the locale contains invalid characters
+ */
+ public function setLocale(string $locale);
+
+ /**
+ * Returns the current locale.
+ *
+ * @return string The locale
+ */
+ public function getLocale();
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation-contracts/README.md b/plugins/vdomah/jwtauth/vendor/symfony/translation-contracts/README.md
new file mode 100644
index 0000000..6c693ce
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation-contracts/README.md
@@ -0,0 +1,9 @@
+Symfony Translation Contracts
+=============================
+
+A set of abstractions extracted out of the Symfony components.
+
+Can be used to build on semantics that the Symfony components proved useful - and
+that already have battle tested implementations.
+
+See https://github.com/symfony/contracts/blob/master/README.md for more information.
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation-contracts/Test/TranslatorTest.php b/plugins/vdomah/jwtauth/vendor/symfony/translation-contracts/Test/TranslatorTest.php
new file mode 100644
index 0000000..5bfb0f8
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation-contracts/Test/TranslatorTest.php
@@ -0,0 +1,353 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Contracts\Translation\Test;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Contracts\Translation\TranslatorInterface;
+use Symfony\Contracts\Translation\TranslatorTrait;
+
+/**
+ * Test should cover all languages mentioned on http://translate.sourceforge.net/wiki/l10n/pluralforms
+ * and Plural forms mentioned on http://www.gnu.org/software/gettext/manual/gettext.html#Plural-forms.
+ *
+ * See also https://developer.mozilla.org/en/Localization_and_Plurals which mentions 15 rules having a maximum of 6 forms.
+ * The mozilla code is also interesting to check for.
+ *
+ * As mentioned by chx http://drupal.org/node/1273968 we can cover all by testing number from 0 to 199
+ *
+ * The goal to cover all languages is to far fetched so this test case is smaller.
+ *
+ * @author Clemens Tolboom clemens@build2be.nl
+ */
+class TranslatorTest extends TestCase
+{
+ public function getTranslator()
+ {
+ return new class() implements TranslatorInterface {
+ use TranslatorTrait;
+ };
+ }
+
+ /**
+ * @dataProvider getTransTests
+ */
+ public function testTrans($expected, $id, $parameters)
+ {
+ $translator = $this->getTranslator();
+
+ $this->assertEquals($expected, $translator->trans($id, $parameters));
+ }
+
+ /**
+ * @dataProvider getTransChoiceTests
+ */
+ public function testTransChoiceWithExplicitLocale($expected, $id, $number)
+ {
+ $translator = $this->getTranslator();
+ $translator->setLocale('en');
+
+ $this->assertEquals($expected, $translator->trans($id, ['%count%' => $number]));
+ }
+
+ /**
+ * @dataProvider getTransChoiceTests
+ */
+ public function testTransChoiceWithDefaultLocale($expected, $id, $number)
+ {
+ \Locale::setDefault('en');
+
+ $translator = $this->getTranslator();
+
+ $this->assertEquals($expected, $translator->trans($id, ['%count%' => $number]));
+ }
+
+ public function testGetSetLocale()
+ {
+ $translator = $this->getTranslator();
+ $translator->setLocale('en');
+
+ $this->assertEquals('en', $translator->getLocale());
+ }
+
+ /**
+ * @requires extension intl
+ */
+ public function testGetLocaleReturnsDefaultLocaleIfNotSet()
+ {
+ $translator = $this->getTranslator();
+
+ \Locale::setDefault('pt_BR');
+ $this->assertEquals('pt_BR', $translator->getLocale());
+
+ \Locale::setDefault('en');
+ $this->assertEquals('en', $translator->getLocale());
+ }
+
+ public function getTransTests()
+ {
+ return [
+ ['Symfony is great!', 'Symfony is great!', []],
+ ['Symfony is awesome!', 'Symfony is %what%!', ['%what%' => 'awesome']],
+ ];
+ }
+
+ public function getTransChoiceTests()
+ {
+ return [
+ ['There are no apples', '{0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 0],
+ ['There is one apple', '{0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 1],
+ ['There are 10 apples', '{0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 10],
+ ['There are 0 apples', 'There is 1 apple|There are %count% apples', 0],
+ ['There is 1 apple', 'There is 1 apple|There are %count% apples', 1],
+ ['There are 10 apples', 'There is 1 apple|There are %count% apples', 10],
+ // custom validation messages may be coded with a fixed value
+ ['There are 2 apples', 'There are 2 apples', 2],
+ ];
+ }
+
+ /**
+ * @dataProvider getInternal
+ */
+ public function testInterval($expected, $number, $interval)
+ {
+ $translator = $this->getTranslator();
+
+ $this->assertEquals($expected, $translator->trans($interval.' foo|[1,Inf[ bar', ['%count%' => $number]));
+ }
+
+ public function getInternal()
+ {
+ return [
+ ['foo', 3, '{1,2, 3 ,4}'],
+ ['bar', 10, '{1,2, 3 ,4}'],
+ ['bar', 3, '[1,2]'],
+ ['foo', 1, '[1,2]'],
+ ['foo', 2, '[1,2]'],
+ ['bar', 1, ']1,2['],
+ ['bar', 2, ']1,2['],
+ ['foo', log(0), '[-Inf,2['],
+ ['foo', -log(0), '[-2,+Inf]'],
+ ];
+ }
+
+ /**
+ * @dataProvider getChooseTests
+ */
+ public function testChoose($expected, $id, $number)
+ {
+ $translator = $this->getTranslator();
+
+ $this->assertEquals($expected, $translator->trans($id, ['%count%' => $number]));
+ }
+
+ public function testReturnMessageIfExactlyOneStandardRuleIsGiven()
+ {
+ $translator = $this->getTranslator();
+
+ $this->assertEquals('There are two apples', $translator->trans('There are two apples', ['%count%' => 2]));
+ }
+
+ /**
+ * @dataProvider getNonMatchingMessages
+ */
+ public function testThrowExceptionIfMatchingMessageCannotBeFound($id, $number)
+ {
+ $this->expectException('InvalidArgumentException');
+ $translator = $this->getTranslator();
+
+ $translator->trans($id, ['%count%' => $number]);
+ }
+
+ public function getNonMatchingMessages()
+ {
+ return [
+ ['{0} There are no apples|{1} There is one apple', 2],
+ ['{1} There is one apple|]1,Inf] There are %count% apples', 0],
+ ['{1} There is one apple|]2,Inf] There are %count% apples', 2],
+ ['{0} There are no apples|There is one apple', 2],
+ ];
+ }
+
+ public function getChooseTests()
+ {
+ return [
+ ['There are no apples', '{0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 0],
+ ['There are no apples', '{0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 0],
+ ['There are no apples', '{0}There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 0],
+
+ ['There is one apple', '{0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 1],
+
+ ['There are 10 apples', '{0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 10],
+ ['There are 10 apples', '{0} There are no apples|{1} There is one apple|]1,Inf]There are %count% apples', 10],
+ ['There are 10 apples', '{0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 10],
+
+ ['There are 0 apples', 'There is one apple|There are %count% apples', 0],
+ ['There is one apple', 'There is one apple|There are %count% apples', 1],
+ ['There are 10 apples', 'There is one apple|There are %count% apples', 10],
+
+ ['There are 0 apples', 'one: There is one apple|more: There are %count% apples', 0],
+ ['There is one apple', 'one: There is one apple|more: There are %count% apples', 1],
+ ['There are 10 apples', 'one: There is one apple|more: There are %count% apples', 10],
+
+ ['There are no apples', '{0} There are no apples|one: There is one apple|more: There are %count% apples', 0],
+ ['There is one apple', '{0} There are no apples|one: There is one apple|more: There are %count% apples', 1],
+ ['There are 10 apples', '{0} There are no apples|one: There is one apple|more: There are %count% apples', 10],
+
+ ['', '{0}|{1} There is one apple|]1,Inf] There are %count% apples', 0],
+ ['', '{0} There are no apples|{1}|]1,Inf] There are %count% apples', 1],
+
+ // Indexed only tests which are Gettext PoFile* compatible strings.
+ ['There are 0 apples', 'There is one apple|There are %count% apples', 0],
+ ['There is one apple', 'There is one apple|There are %count% apples', 1],
+ ['There are 2 apples', 'There is one apple|There are %count% apples', 2],
+
+ // Tests for float numbers
+ ['There is almost one apple', '{0} There are no apples|]0,1[ There is almost one apple|{1} There is one apple|[1,Inf] There is more than one apple', 0.7],
+ ['There is one apple', '{0} There are no apples|]0,1[There are %count% apples|{1} There is one apple|[1,Inf] There is more than one apple', 1],
+ ['There is more than one apple', '{0} There are no apples|]0,1[There are %count% apples|{1} There is one apple|[1,Inf] There is more than one apple', 1.7],
+ ['There are no apples', '{0} There are no apples|]0,1[There are %count% apples|{1} There is one apple|[1,Inf] There is more than one apple', 0],
+ ['There are no apples', '{0} There are no apples|]0,1[There are %count% apples|{1} There is one apple|[1,Inf] There is more than one apple', 0.0],
+ ['There are no apples', '{0.0} There are no apples|]0,1[There are %count% apples|{1} There is one apple|[1,Inf] There is more than one apple', 0],
+
+ // Test texts with new-lines
+ // with double-quotes and \n in id & double-quotes and actual newlines in text
+ ["This is a text with a\n new-line in it. Selector = 0.", '{0}This is a text with a
+ new-line in it. Selector = 0.|{1}This is a text with a
+ new-line in it. Selector = 1.|[1,Inf]This is a text with a
+ new-line in it. Selector > 1.', 0],
+ // with double-quotes and \n in id and single-quotes and actual newlines in text
+ ["This is a text with a\n new-line in it. Selector = 1.", '{0}This is a text with a
+ new-line in it. Selector = 0.|{1}This is a text with a
+ new-line in it. Selector = 1.|[1,Inf]This is a text with a
+ new-line in it. Selector > 1.', 1],
+ ["This is a text with a\n new-line in it. Selector > 1.", '{0}This is a text with a
+ new-line in it. Selector = 0.|{1}This is a text with a
+ new-line in it. Selector = 1.|[1,Inf]This is a text with a
+ new-line in it. Selector > 1.', 5],
+ // with double-quotes and id split accros lines
+ ['This is a text with a
+ new-line in it. Selector = 1.', '{0}This is a text with a
+ new-line in it. Selector = 0.|{1}This is a text with a
+ new-line in it. Selector = 1.|[1,Inf]This is a text with a
+ new-line in it. Selector > 1.', 1],
+ // with single-quotes and id split accros lines
+ ['This is a text with a
+ new-line in it. Selector > 1.', '{0}This is a text with a
+ new-line in it. Selector = 0.|{1}This is a text with a
+ new-line in it. Selector = 1.|[1,Inf]This is a text with a
+ new-line in it. Selector > 1.', 5],
+ // with single-quotes and \n in text
+ ['This is a text with a\nnew-line in it. Selector = 0.', '{0}This is a text with a\nnew-line in it. Selector = 0.|{1}This is a text with a\nnew-line in it. Selector = 1.|[1,Inf]This is a text with a\nnew-line in it. Selector > 1.', 0],
+ // with double-quotes and id split accros lines
+ ["This is a text with a\nnew-line in it. Selector = 1.", "{0}This is a text with a\nnew-line in it. Selector = 0.|{1}This is a text with a\nnew-line in it. Selector = 1.|[1,Inf]This is a text with a\nnew-line in it. Selector > 1.", 1],
+ // esacape pipe
+ ['This is a text with | in it. Selector = 0.', '{0}This is a text with || in it. Selector = 0.|{1}This is a text with || in it. Selector = 1.', 0],
+ // Empty plural set (2 plural forms) from a .PO file
+ ['', '|', 1],
+ // Empty plural set (3 plural forms) from a .PO file
+ ['', '||', 1],
+ ];
+ }
+
+ /**
+ * @dataProvider failingLangcodes
+ */
+ public function testFailedLangcodes($nplural, $langCodes)
+ {
+ $matrix = $this->generateTestData($langCodes);
+ $this->validateMatrix($nplural, $matrix, false);
+ }
+
+ /**
+ * @dataProvider successLangcodes
+ */
+ public function testLangcodes($nplural, $langCodes)
+ {
+ $matrix = $this->generateTestData($langCodes);
+ $this->validateMatrix($nplural, $matrix);
+ }
+
+ /**
+ * This array should contain all currently known langcodes.
+ *
+ * As it is impossible to have this ever complete we should try as hard as possible to have it almost complete.
+ *
+ * @return array
+ */
+ public function successLangcodes()
+ {
+ return [
+ ['1', ['ay', 'bo', 'cgg', 'dz', 'id', 'ja', 'jbo', 'ka', 'kk', 'km', 'ko', 'ky']],
+ ['2', ['nl', 'fr', 'en', 'de', 'de_GE', 'hy', 'hy_AM']],
+ ['3', ['be', 'bs', 'cs', 'hr']],
+ ['4', ['cy', 'mt', 'sl']],
+ ['6', ['ar']],
+ ];
+ }
+
+ /**
+ * This array should be at least empty within the near future.
+ *
+ * This both depends on a complete list trying to add above as understanding
+ * the plural rules of the current failing languages.
+ *
+ * @return array with nplural together with langcodes
+ */
+ public function failingLangcodes()
+ {
+ return [
+ ['1', ['fa']],
+ ['2', ['jbo']],
+ ['3', ['cbs']],
+ ['4', ['gd', 'kw']],
+ ['5', ['ga']],
+ ];
+ }
+
+ /**
+ * We validate only on the plural coverage. Thus the real rules is not tested.
+ *
+ * @param string $nplural Plural expected
+ * @param array $matrix Containing langcodes and their plural index values
+ * @param bool $expectSuccess
+ */
+ protected function validateMatrix($nplural, $matrix, $expectSuccess = true)
+ {
+ foreach ($matrix as $langCode => $data) {
+ $indexes = array_flip($data);
+ if ($expectSuccess) {
+ $this->assertEquals($nplural, \count($indexes), "Langcode '$langCode' has '$nplural' plural forms.");
+ } else {
+ $this->assertNotEquals((int) $nplural, \count($indexes), "Langcode '$langCode' has '$nplural' plural forms.");
+ }
+ }
+ }
+
+ protected function generateTestData($langCodes)
+ {
+ $translator = new class() {
+ use TranslatorTrait {
+ getPluralizationRule as public;
+ }
+ };
+
+ $matrix = [];
+ foreach ($langCodes as $langCode) {
+ for ($count = 0; $count < 200; ++$count) {
+ $plural = $translator->getPluralizationRule($count, $langCode);
+ $matrix[$langCode][$count] = $plural;
+ }
+ }
+
+ return $matrix;
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation-contracts/TranslatorInterface.php b/plugins/vdomah/jwtauth/vendor/symfony/translation-contracts/TranslatorInterface.php
new file mode 100644
index 0000000..b62df5e
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation-contracts/TranslatorInterface.php
@@ -0,0 +1,65 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Contracts\Translation;
+
+/**
+ * @author Fabien Potencier
+ */
+interface TranslatorInterface
+{
+ /**
+ * Translates the given message.
+ *
+ * When a number is provided as a parameter named "%count%", the message is parsed for plural
+ * forms and a translation is chosen according to this number using the following rules:
+ *
+ * Given a message with different plural translations separated by a
+ * pipe (|), this method returns the correct portion of the message based
+ * on the given number, locale and the pluralization rules in the message
+ * itself.
+ *
+ * The message supports two different types of pluralization rules:
+ *
+ * interval: {0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples
+ * indexed: There is one apple|There are %count% apples
+ *
+ * The indexed solution can also contain labels (e.g. one: There is one apple).
+ * This is purely for making the translations more clear - it does not
+ * affect the functionality.
+ *
+ * The two methods can also be mixed:
+ * {0} There are no apples|one: There is one apple|more: There are %count% apples
+ *
+ * An interval can represent a finite set of numbers:
+ * {1,2,3,4}
+ *
+ * An interval can represent numbers between two numbers:
+ * [1, +Inf]
+ * ]-1,2[
+ *
+ * The left delimiter can be [ (inclusive) or ] (exclusive).
+ * The right delimiter can be [ (exclusive) or ] (inclusive).
+ * Beside numbers, you can use -Inf and +Inf for the infinite.
+ *
+ * @see https://en.wikipedia.org/wiki/ISO_31-11
+ *
+ * @param string $id The message id (may also be an object that can be cast to string)
+ * @param array $parameters An array of parameters for the message
+ * @param string|null $domain The domain for the message or null to use the default
+ * @param string|null $locale The locale or null to use the default
+ *
+ * @return string The translated string
+ *
+ * @throws \InvalidArgumentException If the locale contains invalid characters
+ */
+ public function trans(string $id, array $parameters = [], string $domain = null, string $locale = null);
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation-contracts/TranslatorTrait.php b/plugins/vdomah/jwtauth/vendor/symfony/translation-contracts/TranslatorTrait.php
new file mode 100644
index 0000000..f81637a
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation-contracts/TranslatorTrait.php
@@ -0,0 +1,257 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Contracts\Translation;
+
+use Symfony\Component\Translation\Exception\InvalidArgumentException;
+
+/**
+ * A trait to help implement TranslatorInterface and LocaleAwareInterface.
+ *
+ * @author Fabien Potencier
+ */
+trait TranslatorTrait
+{
+ private $locale;
+
+ /**
+ * {@inheritdoc}
+ */
+ public function setLocale(string $locale)
+ {
+ $this->locale = $locale;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getLocale()
+ {
+ return $this->locale ?: \Locale::getDefault();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function trans(?string $id, array $parameters = [], string $domain = null, string $locale = null): string
+ {
+ if (null === $id || '' === $id) {
+ return '';
+ }
+
+ if (!isset($parameters['%count%']) || !is_numeric($parameters['%count%'])) {
+ return strtr($id, $parameters);
+ }
+
+ $number = (float) $parameters['%count%'];
+ $locale = $locale ?: $this->getLocale();
+
+ $parts = [];
+ if (preg_match('/^\|++$/', $id)) {
+ $parts = explode('|', $id);
+ } elseif (preg_match_all('/(?:\|\||[^\|])++/', $id, $matches)) {
+ $parts = $matches[0];
+ }
+
+ $intervalRegexp = <<<'EOF'
+/^(?P
+ ({\s*
+ (\-?\d+(\.\d+)?[\s*,\s*\-?\d+(\.\d+)?]*)
+ \s*})
+
+ |
+
+ (?P[\[\]])
+ \s*
+ (?P-Inf|\-?\d+(\.\d+)?)
+ \s*,\s*
+ (?P\+?Inf|\-?\d+(\.\d+)?)
+ \s*
+ (?P[\[\]])
+)\s*(?P.*?)$/xs
+EOF;
+
+ $standardRules = [];
+ foreach ($parts as $part) {
+ $part = trim(str_replace('||', '|', $part));
+
+ // try to match an explicit rule, then fallback to the standard ones
+ if (preg_match($intervalRegexp, $part, $matches)) {
+ if ($matches[2]) {
+ foreach (explode(',', $matches[3]) as $n) {
+ if ($number == $n) {
+ return strtr($matches['message'], $parameters);
+ }
+ }
+ } else {
+ $leftNumber = '-Inf' === $matches['left'] ? -INF : (float) $matches['left'];
+ $rightNumber = is_numeric($matches['right']) ? (float) $matches['right'] : INF;
+
+ if (('[' === $matches['left_delimiter'] ? $number >= $leftNumber : $number > $leftNumber)
+ && (']' === $matches['right_delimiter'] ? $number <= $rightNumber : $number < $rightNumber)
+ ) {
+ return strtr($matches['message'], $parameters);
+ }
+ }
+ } elseif (preg_match('/^\w+\:\s*(.*?)$/', $part, $matches)) {
+ $standardRules[] = $matches[1];
+ } else {
+ $standardRules[] = $part;
+ }
+ }
+
+ $position = $this->getPluralizationRule($number, $locale);
+
+ if (!isset($standardRules[$position])) {
+ // when there's exactly one rule given, and that rule is a standard
+ // rule, use this rule
+ if (1 === \count($parts) && isset($standardRules[0])) {
+ return strtr($standardRules[0], $parameters);
+ }
+
+ $message = sprintf('Unable to choose a translation for "%s" with locale "%s" for value "%d". Double check that this translation has the correct plural options (e.g. "There is one apple|There are %%count%% apples").', $id, $locale, $number);
+
+ if (class_exists(InvalidArgumentException::class)) {
+ throw new InvalidArgumentException($message);
+ }
+
+ throw new \InvalidArgumentException($message);
+ }
+
+ return strtr($standardRules[$position], $parameters);
+ }
+
+ /**
+ * Returns the plural position to use for the given locale and number.
+ *
+ * The plural rules are derived from code of the Zend Framework (2010-09-25),
+ * which is subject to the new BSD license (http://framework.zend.com/license/new-bsd).
+ * Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
+ */
+ private function getPluralizationRule(int $number, string $locale): int
+ {
+ switch ('pt_BR' !== $locale && \strlen($locale) > 3 ? substr($locale, 0, strrpos($locale, '_')) : $locale) {
+ case 'af':
+ case 'bn':
+ case 'bg':
+ case 'ca':
+ case 'da':
+ case 'de':
+ case 'el':
+ case 'en':
+ case 'eo':
+ case 'es':
+ case 'et':
+ case 'eu':
+ case 'fa':
+ case 'fi':
+ case 'fo':
+ case 'fur':
+ case 'fy':
+ case 'gl':
+ case 'gu':
+ case 'ha':
+ case 'he':
+ case 'hu':
+ case 'is':
+ case 'it':
+ case 'ku':
+ case 'lb':
+ case 'ml':
+ case 'mn':
+ case 'mr':
+ case 'nah':
+ case 'nb':
+ case 'ne':
+ case 'nl':
+ case 'nn':
+ case 'no':
+ case 'oc':
+ case 'om':
+ case 'or':
+ case 'pa':
+ case 'pap':
+ case 'ps':
+ case 'pt':
+ case 'so':
+ case 'sq':
+ case 'sv':
+ case 'sw':
+ case 'ta':
+ case 'te':
+ case 'tk':
+ case 'ur':
+ case 'zu':
+ return (1 == $number) ? 0 : 1;
+
+ case 'am':
+ case 'bh':
+ case 'fil':
+ case 'fr':
+ case 'gun':
+ case 'hi':
+ case 'hy':
+ case 'ln':
+ case 'mg':
+ case 'nso':
+ case 'pt_BR':
+ case 'ti':
+ case 'wa':
+ return ((0 == $number) || (1 == $number)) ? 0 : 1;
+
+ case 'be':
+ case 'bs':
+ case 'hr':
+ case 'ru':
+ case 'sh':
+ case 'sr':
+ case 'uk':
+ return ((1 == $number % 10) && (11 != $number % 100)) ? 0 : ((($number % 10 >= 2) && ($number % 10 <= 4) && (($number % 100 < 10) || ($number % 100 >= 20))) ? 1 : 2);
+
+ case 'cs':
+ case 'sk':
+ return (1 == $number) ? 0 : ((($number >= 2) && ($number <= 4)) ? 1 : 2);
+
+ case 'ga':
+ return (1 == $number) ? 0 : ((2 == $number) ? 1 : 2);
+
+ case 'lt':
+ return ((1 == $number % 10) && (11 != $number % 100)) ? 0 : ((($number % 10 >= 2) && (($number % 100 < 10) || ($number % 100 >= 20))) ? 1 : 2);
+
+ case 'sl':
+ return (1 == $number % 100) ? 0 : ((2 == $number % 100) ? 1 : (((3 == $number % 100) || (4 == $number % 100)) ? 2 : 3));
+
+ case 'mk':
+ return (1 == $number % 10) ? 0 : 1;
+
+ case 'mt':
+ return (1 == $number) ? 0 : (((0 == $number) || (($number % 100 > 1) && ($number % 100 < 11))) ? 1 : ((($number % 100 > 10) && ($number % 100 < 20)) ? 2 : 3));
+
+ case 'lv':
+ return (0 == $number) ? 0 : (((1 == $number % 10) && (11 != $number % 100)) ? 1 : 2);
+
+ case 'pl':
+ return (1 == $number) ? 0 : ((($number % 10 >= 2) && ($number % 10 <= 4) && (($number % 100 < 12) || ($number % 100 > 14))) ? 1 : 2);
+
+ case 'cy':
+ return (1 == $number) ? 0 : ((2 == $number) ? 1 : (((8 == $number) || (11 == $number)) ? 2 : 3));
+
+ case 'ro':
+ return (1 == $number) ? 0 : (((0 == $number) || (($number % 100 > 0) && ($number % 100 < 20))) ? 1 : 2);
+
+ case 'ar':
+ return (0 == $number) ? 0 : ((1 == $number) ? 1 : ((2 == $number) ? 2 : ((($number % 100 >= 3) && ($number % 100 <= 10)) ? 3 : ((($number % 100 >= 11) && ($number % 100 <= 99)) ? 4 : 5))));
+
+ default:
+ return 0;
+ }
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation-contracts/composer.json b/plugins/vdomah/jwtauth/vendor/symfony/translation-contracts/composer.json
new file mode 100644
index 0000000..cacc4b3
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation-contracts/composer.json
@@ -0,0 +1,33 @@
+{
+ "name": "symfony/translation-contracts",
+ "type": "library",
+ "description": "Generic abstractions related to translation",
+ "keywords": ["abstractions", "contracts", "decoupling", "interfaces", "interoperability", "standards"],
+ "homepage": "https://symfony.com",
+ "license": "MIT",
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "require": {
+ "php": "^7.2.5"
+ },
+ "suggest": {
+ "symfony/translation-implementation": ""
+ },
+ "autoload": {
+ "psr-4": { "Symfony\\Contracts\\Translation\\": "" }
+ },
+ "minimum-stability": "dev",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.1-dev"
+ }
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/CHANGELOG.md b/plugins/vdomah/jwtauth/vendor/symfony/translation/CHANGELOG.md
new file mode 100644
index 0000000..9784532
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/CHANGELOG.md
@@ -0,0 +1,133 @@
+CHANGELOG
+=========
+
+4.4.0
+-----
+
+ * deprecated support for using `null` as the locale in `Translator`
+ * deprecated accepting STDIN implicitly when using the `lint:xliff` command, use `lint:xliff -` (append a dash) instead to make it explicit.
+ * Marked the `TranslationDataCollector` class as `@final`.
+
+4.3.0
+-----
+
+ * Improved Xliff 1.2 loader to load the original file's metadata
+ * Added `TranslatorPathsPass`
+
+4.2.0
+-----
+
+ * Started using ICU parent locales as fallback locales.
+ * allow using the ICU message format using domains with the "+intl-icu" suffix
+ * deprecated `Translator::transChoice()` in favor of using `Translator::trans()` with a `%count%` parameter
+ * deprecated `TranslatorInterface` in favor of `Symfony\Contracts\Translation\TranslatorInterface`
+ * deprecated `MessageSelector`, `Interval` and `PluralizationRules`; use `IdentityTranslator` instead
+ * Added `IntlFormatter` and `IntlFormatterInterface`
+ * added support for multiple files and directories in `XliffLintCommand`
+ * Marked `Translator::getFallbackLocales()` and `TranslationDataCollector::getFallbackLocales()` as internal
+
+4.1.0
+-----
+
+ * The `FileDumper::setBackup()` method is deprecated.
+ * The `TranslationWriter::disableBackup()` method is deprecated.
+ * The `XliffFileDumper` will write "name" on the "unit" node when dumping XLIFF 2.0.
+
+4.0.0
+-----
+
+ * removed the backup feature of the `FileDumper` class
+ * removed `TranslationWriter::writeTranslations()` method
+ * removed support for passing `MessageSelector` instances to the constructor of the `Translator` class
+
+3.4.0
+-----
+
+ * Added `TranslationDumperPass`
+ * Added `TranslationExtractorPass`
+ * Added `TranslatorPass`
+ * Added `TranslationReader` and `TranslationReaderInterface`
+ * Added `` section to the Xliff 2.0 dumper.
+ * Improved Xliff 2.0 loader to load `` section.
+ * Added `TranslationWriterInterface`
+ * Deprecated `TranslationWriter::writeTranslations` in favor of `TranslationWriter::write`
+ * added support for adding custom message formatter and decoupling the default one.
+ * Added `PhpExtractor`
+ * Added `PhpStringTokenParser`
+
+3.2.0
+-----
+
+ * Added support for escaping `|` in plural translations with double pipe.
+
+3.1.0
+-----
+
+ * Deprecated the backup feature of the file dumper classes.
+
+3.0.0
+-----
+
+ * removed `FileDumper::format()` method.
+ * Changed the visibility of the locale property in `Translator` from protected to private.
+
+2.8.0
+-----
+
+ * deprecated FileDumper::format(), overwrite FileDumper::formatCatalogue() instead.
+ * deprecated Translator::getMessages(), rely on TranslatorBagInterface::getCatalogue() instead.
+ * added `FileDumper::formatCatalogue` which allows format the catalogue without dumping it into file.
+ * added option `json_encoding` to JsonFileDumper
+ * added options `as_tree`, `inline` to YamlFileDumper
+ * added support for XLIFF 2.0.
+ * added support for XLIFF target and tool attributes.
+ * added message parameters to DataCollectorTranslator.
+ * [DEPRECATION] The `DiffOperation` class has been deprecated and
+ will be removed in Symfony 3.0, since its operation has nothing to do with 'diff',
+ so the class name is misleading. The `TargetOperation` class should be used for
+ this use-case instead.
+
+2.7.0
+-----
+
+ * added DataCollectorTranslator for collecting the translated messages.
+
+2.6.0
+-----
+
+ * added possibility to cache catalogues
+ * added TranslatorBagInterface
+ * added LoggingTranslator
+ * added Translator::getMessages() for retrieving the message catalogue as an array
+
+2.5.0
+-----
+
+ * added relative file path template to the file dumpers
+ * added optional backup to the file dumpers
+ * changed IcuResFileDumper to extend FileDumper
+
+2.3.0
+-----
+
+ * added classes to make operations on catalogues (like making a diff or a merge on 2 catalogues)
+ * added Translator::getFallbackLocales()
+ * deprecated Translator::setFallbackLocale() in favor of the new Translator::setFallbackLocales() method
+
+2.2.0
+-----
+
+ * QtTranslationsLoader class renamed to QtFileLoader. QtTranslationsLoader is deprecated and will be removed in 2.3.
+ * [BC BREAK] uniformized the exception thrown by the load() method when an error occurs. The load() method now
+ throws Symfony\Component\Translation\Exception\NotFoundResourceException when a resource cannot be found
+ and Symfony\Component\Translation\Exception\InvalidResourceException when a resource is invalid.
+ * changed the exception class thrown by some load() methods from \RuntimeException to \InvalidArgumentException
+ (IcuDatFileLoader, IcuResFileLoader and QtFileLoader)
+
+2.1.0
+-----
+
+ * added support for more than one fallback locale
+ * added support for extracting translation messages from templates (Twig and PHP)
+ * added dumpers for translation catalogs
+ * added support for QT, gettext, and ResourceBundles
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Catalogue/AbstractOperation.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Catalogue/AbstractOperation.php
new file mode 100644
index 0000000..4953563
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Catalogue/AbstractOperation.php
@@ -0,0 +1,157 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Catalogue;
+
+use Symfony\Component\Translation\Exception\InvalidArgumentException;
+use Symfony\Component\Translation\Exception\LogicException;
+use Symfony\Component\Translation\MessageCatalogue;
+use Symfony\Component\Translation\MessageCatalogueInterface;
+
+/**
+ * Base catalogues binary operation class.
+ *
+ * A catalogue binary operation performs operation on
+ * source (the left argument) and target (the right argument) catalogues.
+ *
+ * @author Jean-François Simon
+ */
+abstract class AbstractOperation implements OperationInterface
+{
+ protected $source;
+ protected $target;
+ protected $result;
+
+ /**
+ * @var array|null The domains affected by this operation
+ */
+ private $domains;
+
+ /**
+ * This array stores 'all', 'new' and 'obsolete' messages for all valid domains.
+ *
+ * The data structure of this array is as follows:
+ *
+ * [
+ * 'domain 1' => [
+ * 'all' => [...],
+ * 'new' => [...],
+ * 'obsolete' => [...]
+ * ],
+ * 'domain 2' => [
+ * 'all' => [...],
+ * 'new' => [...],
+ * 'obsolete' => [...]
+ * ],
+ * ...
+ * ]
+ *
+ * @var array The array that stores 'all', 'new' and 'obsolete' messages
+ */
+ protected $messages;
+
+ /**
+ * @throws LogicException
+ */
+ public function __construct(MessageCatalogueInterface $source, MessageCatalogueInterface $target)
+ {
+ if ($source->getLocale() !== $target->getLocale()) {
+ throw new LogicException('Operated catalogues must belong to the same locale.');
+ }
+
+ $this->source = $source;
+ $this->target = $target;
+ $this->result = new MessageCatalogue($source->getLocale());
+ $this->messages = [];
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getDomains()
+ {
+ if (null === $this->domains) {
+ $this->domains = array_values(array_unique(array_merge($this->source->getDomains(), $this->target->getDomains())));
+ }
+
+ return $this->domains;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getMessages($domain)
+ {
+ if (!\in_array($domain, $this->getDomains())) {
+ throw new InvalidArgumentException(sprintf('Invalid domain: "%s".', $domain));
+ }
+
+ if (!isset($this->messages[$domain]['all'])) {
+ $this->processDomain($domain);
+ }
+
+ return $this->messages[$domain]['all'];
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getNewMessages($domain)
+ {
+ if (!\in_array($domain, $this->getDomains())) {
+ throw new InvalidArgumentException(sprintf('Invalid domain: "%s".', $domain));
+ }
+
+ if (!isset($this->messages[$domain]['new'])) {
+ $this->processDomain($domain);
+ }
+
+ return $this->messages[$domain]['new'];
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getObsoleteMessages($domain)
+ {
+ if (!\in_array($domain, $this->getDomains())) {
+ throw new InvalidArgumentException(sprintf('Invalid domain: "%s".', $domain));
+ }
+
+ if (!isset($this->messages[$domain]['obsolete'])) {
+ $this->processDomain($domain);
+ }
+
+ return $this->messages[$domain]['obsolete'];
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getResult()
+ {
+ foreach ($this->getDomains() as $domain) {
+ if (!isset($this->messages[$domain])) {
+ $this->processDomain($domain);
+ }
+ }
+
+ return $this->result;
+ }
+
+ /**
+ * Performs operation on source and target catalogues for the given domain and
+ * stores the results.
+ *
+ * @param string $domain The domain which the operation will be performed for
+ */
+ abstract protected function processDomain($domain);
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Catalogue/MergeOperation.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Catalogue/MergeOperation.php
new file mode 100644
index 0000000..d2f4abd
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Catalogue/MergeOperation.php
@@ -0,0 +1,58 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Catalogue;
+
+use Symfony\Component\Translation\MessageCatalogueInterface;
+
+/**
+ * Merge operation between two catalogues as follows:
+ * all = source ∪ target = {x: x ∈ source ∨ x ∈ target}
+ * new = all ∖ source = {x: x ∈ target ∧ x ∉ source}
+ * obsolete = source ∖ all = {x: x ∈ source ∧ x ∉ source ∧ x ∉ target} = ∅
+ * Basically, the result contains messages from both catalogues.
+ *
+ * @author Jean-François Simon
+ */
+class MergeOperation extends AbstractOperation
+{
+ /**
+ * {@inheritdoc}
+ */
+ protected function processDomain($domain)
+ {
+ $this->messages[$domain] = [
+ 'all' => [],
+ 'new' => [],
+ 'obsolete' => [],
+ ];
+ $intlDomain = $domain.MessageCatalogueInterface::INTL_DOMAIN_SUFFIX;
+
+ foreach ($this->source->all($domain) as $id => $message) {
+ $this->messages[$domain]['all'][$id] = $message;
+ $this->result->add([$id => $message], $this->source->defines($id, $intlDomain) ? $intlDomain : $domain);
+ if (null !== $keyMetadata = $this->source->getMetadata($id, $domain)) {
+ $this->result->setMetadata($id, $keyMetadata, $domain);
+ }
+ }
+
+ foreach ($this->target->all($domain) as $id => $message) {
+ if (!$this->source->has($id, $domain)) {
+ $this->messages[$domain]['all'][$id] = $message;
+ $this->messages[$domain]['new'][$id] = $message;
+ $this->result->add([$id => $message], $this->target->defines($id, $intlDomain) ? $intlDomain : $domain);
+ if (null !== $keyMetadata = $this->target->getMetadata($id, $domain)) {
+ $this->result->setMetadata($id, $keyMetadata, $domain);
+ }
+ }
+ }
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Catalogue/OperationInterface.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Catalogue/OperationInterface.php
new file mode 100644
index 0000000..87d888e
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Catalogue/OperationInterface.php
@@ -0,0 +1,77 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Catalogue;
+
+use Symfony\Component\Translation\MessageCatalogueInterface;
+
+/**
+ * Represents an operation on catalogue(s).
+ *
+ * An instance of this interface performs an operation on one or more catalogues and
+ * stores intermediate and final results of the operation.
+ *
+ * The first catalogue in its argument(s) is called the 'source catalogue' or 'source' and
+ * the following results are stored:
+ *
+ * Messages: also called 'all', are valid messages for the given domain after the operation is performed.
+ *
+ * New Messages: also called 'new' (new = all ∖ source = {x: x ∈ all ∧ x ∉ source}).
+ *
+ * Obsolete Messages: also called 'obsolete' (obsolete = source ∖ all = {x: x ∈ source ∧ x ∉ all}).
+ *
+ * Result: also called 'result', is the resulting catalogue for the given domain that holds the same messages as 'all'.
+ *
+ * @author Jean-François Simon
+ */
+interface OperationInterface
+{
+ /**
+ * Returns domains affected by operation.
+ *
+ * @return array
+ */
+ public function getDomains();
+
+ /**
+ * Returns all valid messages ('all') after operation.
+ *
+ * @param string $domain
+ *
+ * @return array
+ */
+ public function getMessages($domain);
+
+ /**
+ * Returns new messages ('new') after operation.
+ *
+ * @param string $domain
+ *
+ * @return array
+ */
+ public function getNewMessages($domain);
+
+ /**
+ * Returns obsolete messages ('obsolete') after operation.
+ *
+ * @param string $domain
+ *
+ * @return array
+ */
+ public function getObsoleteMessages($domain);
+
+ /**
+ * Returns resulting catalogue ('result').
+ *
+ * @return MessageCatalogueInterface
+ */
+ public function getResult();
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Catalogue/TargetOperation.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Catalogue/TargetOperation.php
new file mode 100644
index 0000000..22aa9a3
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Catalogue/TargetOperation.php
@@ -0,0 +1,72 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Catalogue;
+
+use Symfony\Component\Translation\MessageCatalogueInterface;
+
+/**
+ * Target operation between two catalogues:
+ * intersection = source ∩ target = {x: x ∈ source ∧ x ∈ target}
+ * all = intersection ∪ (target ∖ intersection) = target
+ * new = all ∖ source = {x: x ∈ target ∧ x ∉ source}
+ * obsolete = source ∖ all = source ∖ target = {x: x ∈ source ∧ x ∉ target}
+ * Basically, the result contains messages from the target catalogue.
+ *
+ * @author Michael Lee
+ */
+class TargetOperation extends AbstractOperation
+{
+ /**
+ * {@inheritdoc}
+ */
+ protected function processDomain($domain)
+ {
+ $this->messages[$domain] = [
+ 'all' => [],
+ 'new' => [],
+ 'obsolete' => [],
+ ];
+ $intlDomain = $domain.MessageCatalogueInterface::INTL_DOMAIN_SUFFIX;
+
+ // For 'all' messages, the code can't be simplified as ``$this->messages[$domain]['all'] = $target->all($domain);``,
+ // because doing so will drop messages like {x: x ∈ source ∧ x ∉ target.all ∧ x ∈ target.fallback}
+ //
+ // For 'new' messages, the code can't be simplified as ``array_diff_assoc($this->target->all($domain), $this->source->all($domain));``
+ // because doing so will not exclude messages like {x: x ∈ target ∧ x ∉ source.all ∧ x ∈ source.fallback}
+ //
+ // For 'obsolete' messages, the code can't be simplified as ``array_diff_assoc($this->source->all($domain), $this->target->all($domain))``
+ // because doing so will not exclude messages like {x: x ∈ source ∧ x ∉ target.all ∧ x ∈ target.fallback}
+
+ foreach ($this->source->all($domain) as $id => $message) {
+ if ($this->target->has($id, $domain)) {
+ $this->messages[$domain]['all'][$id] = $message;
+ $this->result->add([$id => $message], $this->target->defines($id, $intlDomain) ? $intlDomain : $domain);
+ if (null !== $keyMetadata = $this->source->getMetadata($id, $domain)) {
+ $this->result->setMetadata($id, $keyMetadata, $domain);
+ }
+ } else {
+ $this->messages[$domain]['obsolete'][$id] = $message;
+ }
+ }
+
+ foreach ($this->target->all($domain) as $id => $message) {
+ if (!$this->source->has($id, $domain)) {
+ $this->messages[$domain]['all'][$id] = $message;
+ $this->messages[$domain]['new'][$id] = $message;
+ $this->result->add([$id => $message], $this->target->defines($id, $intlDomain) ? $intlDomain : $domain);
+ if (null !== $keyMetadata = $this->target->getMetadata($id, $domain)) {
+ $this->result->setMetadata($id, $keyMetadata, $domain);
+ }
+ }
+ }
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Command/XliffLintCommand.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Command/XliffLintCommand.php
new file mode 100644
index 0000000..3f8fe73
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Command/XliffLintCommand.php
@@ -0,0 +1,273 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Command;
+
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Exception\RuntimeException;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Style\SymfonyStyle;
+use Symfony\Component\Translation\Exception\InvalidArgumentException;
+use Symfony\Component\Translation\Util\XliffUtils;
+
+/**
+ * Validates XLIFF files syntax and outputs encountered errors.
+ *
+ * @author Grégoire Pineau
+ * @author Robin Chalas
+ * @author Javier Eguiluz
+ */
+class XliffLintCommand extends Command
+{
+ protected static $defaultName = 'lint:xliff';
+
+ private $format;
+ private $displayCorrectFiles;
+ private $directoryIteratorProvider;
+ private $isReadableProvider;
+ private $requireStrictFileNames;
+
+ public function __construct(string $name = null, callable $directoryIteratorProvider = null, callable $isReadableProvider = null, bool $requireStrictFileNames = true)
+ {
+ parent::__construct($name);
+
+ $this->directoryIteratorProvider = $directoryIteratorProvider;
+ $this->isReadableProvider = $isReadableProvider;
+ $this->requireStrictFileNames = $requireStrictFileNames;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function configure()
+ {
+ $this
+ ->setDescription('Lints a XLIFF file and outputs encountered errors')
+ ->addArgument('filename', InputArgument::IS_ARRAY, 'A file, a directory or "-" for reading from STDIN')
+ ->addOption('format', null, InputOption::VALUE_REQUIRED, 'The output format', 'txt')
+ ->setHelp(<<%command.name% command lints a XLIFF file and outputs to STDOUT
+the first encountered syntax error.
+
+You can validates XLIFF contents passed from STDIN:
+
+ cat filename | php %command.full_name% -
+
+You can also validate the syntax of a file:
+
+ php %command.full_name% filename
+
+Or of a whole directory:
+
+ php %command.full_name% dirname
+ php %command.full_name% dirname --format=json
+
+EOF
+ )
+ ;
+ }
+
+ protected function execute(InputInterface $input, OutputInterface $output)
+ {
+ $io = new SymfonyStyle($input, $output);
+ $filenames = (array) $input->getArgument('filename');
+ $this->format = $input->getOption('format');
+ $this->displayCorrectFiles = $output->isVerbose();
+
+ if (['-'] === $filenames) {
+ return $this->display($io, [$this->validate(file_get_contents('php://stdin'))]);
+ }
+
+ // @deprecated to be removed in 5.0
+ if (!$filenames) {
+ if (0 !== ftell(STDIN)) {
+ throw new RuntimeException('Please provide a filename or pipe file content to STDIN.');
+ }
+
+ @trigger_error('Piping content from STDIN to the "lint:xliff" command without passing the dash symbol "-" as argument is deprecated since Symfony 4.4.', E_USER_DEPRECATED);
+
+ return $this->display($io, [$this->validate(file_get_contents('php://stdin'))]);
+ }
+
+ $filesInfo = [];
+ foreach ($filenames as $filename) {
+ if (!$this->isReadable($filename)) {
+ throw new RuntimeException(sprintf('File or directory "%s" is not readable.', $filename));
+ }
+
+ foreach ($this->getFiles($filename) as $file) {
+ $filesInfo[] = $this->validate(file_get_contents($file), $file);
+ }
+ }
+
+ return $this->display($io, $filesInfo);
+ }
+
+ private function validate(string $content, string $file = null): array
+ {
+ $errors = [];
+
+ // Avoid: Warning DOMDocument::loadXML(): Empty string supplied as input
+ if ('' === trim($content)) {
+ return ['file' => $file, 'valid' => true];
+ }
+
+ $internal = libxml_use_internal_errors(true);
+
+ $document = new \DOMDocument();
+ $document->loadXML($content);
+
+ if (null !== $targetLanguage = $this->getTargetLanguageFromFile($document)) {
+ $normalizedLocale = preg_quote(str_replace('-', '_', $targetLanguage), '/');
+ // strict file names require translation files to be named '____.locale.xlf'
+ // otherwise, both '____.locale.xlf' and 'locale.____.xlf' are allowed
+ // also, the regexp matching must be case-insensitive, as defined for 'target-language' values
+ // http://docs.oasis-open.org/xliff/v1.2/os/xliff-core.html#target-language
+ $expectedFilenamePattern = $this->requireStrictFileNames ? sprintf('/^.*\.(?i:%s)\.(?:xlf|xliff)/', $normalizedLocale) : sprintf('/^(?:.*\.(?i:%s)|(?i:%s)\..*)\.(?:xlf|xliff)/', $normalizedLocale, $normalizedLocale);
+
+ if (0 === preg_match($expectedFilenamePattern, basename($file))) {
+ $errors[] = [
+ 'line' => -1,
+ 'column' => -1,
+ 'message' => sprintf('There is a mismatch between the language included in the file name ("%s") and the "%s" value used in the "target-language" attribute of the file.', basename($file), $targetLanguage),
+ ];
+ }
+ }
+
+ foreach (XliffUtils::validateSchema($document) as $xmlError) {
+ $errors[] = [
+ 'line' => $xmlError['line'],
+ 'column' => $xmlError['column'],
+ 'message' => $xmlError['message'],
+ ];
+ }
+
+ libxml_clear_errors();
+ libxml_use_internal_errors($internal);
+
+ return ['file' => $file, 'valid' => 0 === \count($errors), 'messages' => $errors];
+ }
+
+ private function display(SymfonyStyle $io, array $files)
+ {
+ switch ($this->format) {
+ case 'txt':
+ return $this->displayTxt($io, $files);
+ case 'json':
+ return $this->displayJson($io, $files);
+ default:
+ throw new InvalidArgumentException(sprintf('The format "%s" is not supported.', $this->format));
+ }
+ }
+
+ private function displayTxt(SymfonyStyle $io, array $filesInfo)
+ {
+ $countFiles = \count($filesInfo);
+ $erroredFiles = 0;
+
+ foreach ($filesInfo as $info) {
+ if ($info['valid'] && $this->displayCorrectFiles) {
+ $io->comment('OK '.($info['file'] ? sprintf(' in %s', $info['file']) : ''));
+ } elseif (!$info['valid']) {
+ ++$erroredFiles;
+ $io->text(' ERROR '.($info['file'] ? sprintf(' in %s', $info['file']) : ''));
+ $io->listing(array_map(function ($error) {
+ // general document errors have a '-1' line number
+ return -1 === $error['line'] ? $error['message'] : sprintf('Line %d, Column %d: %s', $error['line'], $error['column'], $error['message']);
+ }, $info['messages']));
+ }
+ }
+
+ if (0 === $erroredFiles) {
+ $io->success(sprintf('All %d XLIFF files contain valid syntax.', $countFiles));
+ } else {
+ $io->warning(sprintf('%d XLIFF files have valid syntax and %d contain errors.', $countFiles - $erroredFiles, $erroredFiles));
+ }
+
+ return min($erroredFiles, 1);
+ }
+
+ private function displayJson(SymfonyStyle $io, array $filesInfo)
+ {
+ $errors = 0;
+
+ array_walk($filesInfo, function (&$v) use (&$errors) {
+ $v['file'] = (string) $v['file'];
+ if (!$v['valid']) {
+ ++$errors;
+ }
+ });
+
+ $io->writeln(json_encode($filesInfo, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES));
+
+ return min($errors, 1);
+ }
+
+ private function getFiles(string $fileOrDirectory)
+ {
+ if (is_file($fileOrDirectory)) {
+ yield new \SplFileInfo($fileOrDirectory);
+
+ return;
+ }
+
+ foreach ($this->getDirectoryIterator($fileOrDirectory) as $file) {
+ if (!\in_array($file->getExtension(), ['xlf', 'xliff'])) {
+ continue;
+ }
+
+ yield $file;
+ }
+ }
+
+ private function getDirectoryIterator(string $directory)
+ {
+ $default = function ($directory) {
+ return new \RecursiveIteratorIterator(
+ new \RecursiveDirectoryIterator($directory, \FilesystemIterator::SKIP_DOTS | \FilesystemIterator::FOLLOW_SYMLINKS),
+ \RecursiveIteratorIterator::LEAVES_ONLY
+ );
+ };
+
+ if (null !== $this->directoryIteratorProvider) {
+ return ($this->directoryIteratorProvider)($directory, $default);
+ }
+
+ return $default($directory);
+ }
+
+ private function isReadable(string $fileOrDirectory)
+ {
+ $default = function ($fileOrDirectory) {
+ return is_readable($fileOrDirectory);
+ };
+
+ if (null !== $this->isReadableProvider) {
+ return ($this->isReadableProvider)($fileOrDirectory, $default);
+ }
+
+ return $default($fileOrDirectory);
+ }
+
+ private function getTargetLanguageFromFile(\DOMDocument $xliffContents): ?string
+ {
+ foreach ($xliffContents->getElementsByTagName('file')[0]->attributes ?? [] as $attribute) {
+ if ('target-language' === $attribute->nodeName) {
+ return $attribute->nodeValue;
+ }
+ }
+
+ return null;
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/DataCollector/TranslationDataCollector.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/DataCollector/TranslationDataCollector.php
new file mode 100644
index 0000000..9b6da11
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/DataCollector/TranslationDataCollector.php
@@ -0,0 +1,174 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\DataCollector;
+
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\HttpKernel\DataCollector\DataCollector;
+use Symfony\Component\HttpKernel\DataCollector\LateDataCollectorInterface;
+use Symfony\Component\Translation\DataCollectorTranslator;
+use Symfony\Component\VarDumper\Cloner\Data;
+
+/**
+ * @author Abdellatif Ait boudad
+ *
+ * @final since Symfony 4.4
+ */
+class TranslationDataCollector extends DataCollector implements LateDataCollectorInterface
+{
+ private $translator;
+
+ public function __construct(DataCollectorTranslator $translator)
+ {
+ $this->translator = $translator;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function lateCollect()
+ {
+ $messages = $this->sanitizeCollectedMessages($this->translator->getCollectedMessages());
+
+ $this->data += $this->computeCount($messages);
+ $this->data['messages'] = $messages;
+
+ $this->data = $this->cloneVar($this->data);
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @param \Throwable|null $exception
+ */
+ public function collect(Request $request, Response $response/*, \Throwable $exception = null*/)
+ {
+ $this->data['locale'] = $this->translator->getLocale();
+ $this->data['fallback_locales'] = $this->translator->getFallbackLocales();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function reset()
+ {
+ $this->data = [];
+ }
+
+ /**
+ * @return array|Data
+ */
+ public function getMessages()
+ {
+ return isset($this->data['messages']) ? $this->data['messages'] : [];
+ }
+
+ /**
+ * @return int
+ */
+ public function getCountMissings()
+ {
+ return isset($this->data[DataCollectorTranslator::MESSAGE_MISSING]) ? $this->data[DataCollectorTranslator::MESSAGE_MISSING] : 0;
+ }
+
+ /**
+ * @return int
+ */
+ public function getCountFallbacks()
+ {
+ return isset($this->data[DataCollectorTranslator::MESSAGE_EQUALS_FALLBACK]) ? $this->data[DataCollectorTranslator::MESSAGE_EQUALS_FALLBACK] : 0;
+ }
+
+ /**
+ * @return int
+ */
+ public function getCountDefines()
+ {
+ return isset($this->data[DataCollectorTranslator::MESSAGE_DEFINED]) ? $this->data[DataCollectorTranslator::MESSAGE_DEFINED] : 0;
+ }
+
+ public function getLocale()
+ {
+ return !empty($this->data['locale']) ? $this->data['locale'] : null;
+ }
+
+ /**
+ * @internal since Symfony 4.2
+ */
+ public function getFallbackLocales()
+ {
+ return (isset($this->data['fallback_locales']) && \count($this->data['fallback_locales']) > 0) ? $this->data['fallback_locales'] : [];
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getName()
+ {
+ return 'translation';
+ }
+
+ private function sanitizeCollectedMessages(array $messages)
+ {
+ $result = [];
+ foreach ($messages as $key => $message) {
+ $messageId = $message['locale'].$message['domain'].$message['id'];
+
+ if (!isset($result[$messageId])) {
+ $message['count'] = 1;
+ $message['parameters'] = !empty($message['parameters']) ? [$message['parameters']] : [];
+ $messages[$key]['translation'] = $this->sanitizeString($message['translation']);
+ $result[$messageId] = $message;
+ } else {
+ if (!empty($message['parameters'])) {
+ $result[$messageId]['parameters'][] = $message['parameters'];
+ }
+
+ ++$result[$messageId]['count'];
+ }
+
+ unset($messages[$key]);
+ }
+
+ return $result;
+ }
+
+ private function computeCount(array $messages)
+ {
+ $count = [
+ DataCollectorTranslator::MESSAGE_DEFINED => 0,
+ DataCollectorTranslator::MESSAGE_MISSING => 0,
+ DataCollectorTranslator::MESSAGE_EQUALS_FALLBACK => 0,
+ ];
+
+ foreach ($messages as $message) {
+ ++$count[$message['state']];
+ }
+
+ return $count;
+ }
+
+ private function sanitizeString(string $string, int $length = 80)
+ {
+ $string = trim(preg_replace('/\s+/', ' ', $string));
+
+ if (false !== $encoding = mb_detect_encoding($string, null, true)) {
+ if (mb_strlen($string, $encoding) > $length) {
+ return mb_substr($string, 0, $length - 3, $encoding).'...';
+ }
+ } elseif (\strlen($string) > $length) {
+ return substr($string, 0, $length - 3).'...';
+ }
+
+ return $string;
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/DataCollectorTranslator.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/DataCollectorTranslator.php
new file mode 100644
index 0000000..94b9e3e
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/DataCollectorTranslator.php
@@ -0,0 +1,182 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation;
+
+use Symfony\Component\HttpKernel\CacheWarmer\WarmableInterface;
+use Symfony\Component\Translation\Exception\InvalidArgumentException;
+use Symfony\Component\Translation\TranslatorInterface as LegacyTranslatorInterface;
+use Symfony\Contracts\Translation\LocaleAwareInterface;
+use Symfony\Contracts\Translation\TranslatorInterface;
+
+/**
+ * @author Abdellatif Ait boudad
+ */
+class DataCollectorTranslator implements LegacyTranslatorInterface, TranslatorInterface, TranslatorBagInterface, WarmableInterface
+{
+ const MESSAGE_DEFINED = 0;
+ const MESSAGE_MISSING = 1;
+ const MESSAGE_EQUALS_FALLBACK = 2;
+
+ /**
+ * @var TranslatorInterface|TranslatorBagInterface
+ */
+ private $translator;
+
+ private $messages = [];
+
+ /**
+ * @param TranslatorInterface $translator The translator must implement TranslatorBagInterface
+ */
+ public function __construct($translator)
+ {
+ if (!$translator instanceof LegacyTranslatorInterface && !$translator instanceof TranslatorInterface) {
+ throw new \TypeError(sprintf('Argument 1 passed to "%s()" must be an instance of "%s", "%s" given.', __METHOD__, TranslatorInterface::class, \is_object($translator) ? \get_class($translator) : \gettype($translator)));
+ }
+ if (!$translator instanceof TranslatorBagInterface || !$translator instanceof LocaleAwareInterface) {
+ throw new InvalidArgumentException(sprintf('The Translator "%s" must implement TranslatorInterface, TranslatorBagInterface and LocaleAwareInterface.', \get_class($translator)));
+ }
+
+ $this->translator = $translator;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function trans($id, array $parameters = [], $domain = null, $locale = null)
+ {
+ $trans = $this->translator->trans($id, $parameters, $domain, $locale);
+ $this->collectMessage($locale, $domain, $id, $trans, $parameters);
+
+ return $trans;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @deprecated since Symfony 4.2, use the trans() method instead with a %count% parameter
+ */
+ public function transChoice($id, $number, array $parameters = [], $domain = null, $locale = null)
+ {
+ if ($this->translator instanceof TranslatorInterface) {
+ $trans = $this->translator->trans($id, ['%count%' => $number] + $parameters, $domain, $locale);
+ } else {
+ $trans = $this->translator->transChoice($id, $number, $parameters, $domain, $locale);
+ }
+
+ $this->collectMessage($locale, $domain, $id, $trans, ['%count%' => $number] + $parameters);
+
+ return $trans;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function setLocale($locale)
+ {
+ $this->translator->setLocale($locale);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getLocale()
+ {
+ return $this->translator->getLocale();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getCatalogue($locale = null)
+ {
+ return $this->translator->getCatalogue($locale);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function warmUp($cacheDir)
+ {
+ if ($this->translator instanceof WarmableInterface) {
+ $this->translator->warmUp($cacheDir);
+ }
+ }
+
+ /**
+ * Gets the fallback locales.
+ *
+ * @return array The fallback locales
+ */
+ public function getFallbackLocales()
+ {
+ if ($this->translator instanceof Translator || method_exists($this->translator, 'getFallbackLocales')) {
+ return $this->translator->getFallbackLocales();
+ }
+
+ return [];
+ }
+
+ /**
+ * Passes through all unknown calls onto the translator object.
+ */
+ public function __call($method, $args)
+ {
+ return $this->translator->{$method}(...$args);
+ }
+
+ /**
+ * @return array
+ */
+ public function getCollectedMessages()
+ {
+ return $this->messages;
+ }
+
+ private function collectMessage(?string $locale, ?string $domain, ?string $id, string $translation, ?array $parameters = [])
+ {
+ if (null === $domain) {
+ $domain = 'messages';
+ }
+
+ $id = (string) $id;
+ $catalogue = $this->translator->getCatalogue($locale);
+ $locale = $catalogue->getLocale();
+ $fallbackLocale = null;
+ if ($catalogue->defines($id, $domain)) {
+ $state = self::MESSAGE_DEFINED;
+ } elseif ($catalogue->has($id, $domain)) {
+ $state = self::MESSAGE_EQUALS_FALLBACK;
+
+ $fallbackCatalogue = $catalogue->getFallbackCatalogue();
+ while ($fallbackCatalogue) {
+ if ($fallbackCatalogue->defines($id, $domain)) {
+ $fallbackLocale = $fallbackCatalogue->getLocale();
+ break;
+ }
+ $fallbackCatalogue = $fallbackCatalogue->getFallbackCatalogue();
+ }
+ } else {
+ $state = self::MESSAGE_MISSING;
+ }
+
+ $this->messages[] = [
+ 'locale' => $locale,
+ 'fallbackLocale' => $fallbackLocale,
+ 'domain' => $domain,
+ 'id' => $id,
+ 'translation' => $translation,
+ 'parameters' => $parameters,
+ 'state' => $state,
+ 'transChoiceNumber' => isset($parameters['%count%']) && is_numeric($parameters['%count%']) ? $parameters['%count%'] : null,
+ ];
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/DependencyInjection/TranslationDumperPass.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/DependencyInjection/TranslationDumperPass.php
new file mode 100644
index 0000000..930f36d
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/DependencyInjection/TranslationDumperPass.php
@@ -0,0 +1,44 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\DependencyInjection;
+
+use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Reference;
+
+/**
+ * Adds tagged translation.formatter services to translation writer.
+ */
+class TranslationDumperPass implements CompilerPassInterface
+{
+ private $writerServiceId;
+ private $dumperTag;
+
+ public function __construct(string $writerServiceId = 'translation.writer', string $dumperTag = 'translation.dumper')
+ {
+ $this->writerServiceId = $writerServiceId;
+ $this->dumperTag = $dumperTag;
+ }
+
+ public function process(ContainerBuilder $container)
+ {
+ if (!$container->hasDefinition($this->writerServiceId)) {
+ return;
+ }
+
+ $definition = $container->getDefinition($this->writerServiceId);
+
+ foreach ($container->findTaggedServiceIds($this->dumperTag, true) as $id => $attributes) {
+ $definition->addMethodCall('addDumper', [$attributes[0]['alias'], new Reference($id)]);
+ }
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/DependencyInjection/TranslationExtractorPass.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/DependencyInjection/TranslationExtractorPass.php
new file mode 100644
index 0000000..d08b2ba
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/DependencyInjection/TranslationExtractorPass.php
@@ -0,0 +1,49 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\DependencyInjection;
+
+use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Exception\RuntimeException;
+use Symfony\Component\DependencyInjection\Reference;
+
+/**
+ * Adds tagged translation.extractor services to translation extractor.
+ */
+class TranslationExtractorPass implements CompilerPassInterface
+{
+ private $extractorServiceId;
+ private $extractorTag;
+
+ public function __construct(string $extractorServiceId = 'translation.extractor', string $extractorTag = 'translation.extractor')
+ {
+ $this->extractorServiceId = $extractorServiceId;
+ $this->extractorTag = $extractorTag;
+ }
+
+ public function process(ContainerBuilder $container)
+ {
+ if (!$container->hasDefinition($this->extractorServiceId)) {
+ return;
+ }
+
+ $definition = $container->getDefinition($this->extractorServiceId);
+
+ foreach ($container->findTaggedServiceIds($this->extractorTag, true) as $id => $attributes) {
+ if (!isset($attributes[0]['alias'])) {
+ throw new RuntimeException(sprintf('The alias for the tag "translation.extractor" of service "%s" must be set.', $id));
+ }
+
+ $definition->addMethodCall('addExtractor', [$attributes[0]['alias'], new Reference($id)]);
+ }
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/DependencyInjection/TranslatorPass.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/DependencyInjection/TranslatorPass.php
new file mode 100644
index 0000000..ed4a840
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/DependencyInjection/TranslatorPass.php
@@ -0,0 +1,89 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\DependencyInjection;
+
+use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
+use Symfony\Component\DependencyInjection\Compiler\ServiceLocatorTagPass;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Reference;
+
+class TranslatorPass implements CompilerPassInterface
+{
+ private $translatorServiceId;
+ private $readerServiceId;
+ private $loaderTag;
+ private $debugCommandServiceId;
+ private $updateCommandServiceId;
+
+ public function __construct(string $translatorServiceId = 'translator.default', string $readerServiceId = 'translation.reader', string $loaderTag = 'translation.loader', string $debugCommandServiceId = 'console.command.translation_debug', string $updateCommandServiceId = 'console.command.translation_update')
+ {
+ $this->translatorServiceId = $translatorServiceId;
+ $this->readerServiceId = $readerServiceId;
+ $this->loaderTag = $loaderTag;
+ $this->debugCommandServiceId = $debugCommandServiceId;
+ $this->updateCommandServiceId = $updateCommandServiceId;
+ }
+
+ public function process(ContainerBuilder $container)
+ {
+ if (!$container->hasDefinition($this->translatorServiceId)) {
+ return;
+ }
+
+ $loaders = [];
+ $loaderRefs = [];
+ foreach ($container->findTaggedServiceIds($this->loaderTag, true) as $id => $attributes) {
+ $loaderRefs[$id] = new Reference($id);
+ $loaders[$id][] = $attributes[0]['alias'];
+ if (isset($attributes[0]['legacy-alias'])) {
+ $loaders[$id][] = $attributes[0]['legacy-alias'];
+ }
+ }
+
+ if ($container->hasDefinition($this->readerServiceId)) {
+ $definition = $container->getDefinition($this->readerServiceId);
+ foreach ($loaders as $id => $formats) {
+ foreach ($formats as $format) {
+ $definition->addMethodCall('addLoader', [$format, $loaderRefs[$id]]);
+ }
+ }
+ }
+
+ $container
+ ->findDefinition($this->translatorServiceId)
+ ->replaceArgument(0, ServiceLocatorTagPass::register($container, $loaderRefs))
+ ->replaceArgument(3, $loaders)
+ ;
+
+ if (!$container->hasParameter('twig.default_path')) {
+ return;
+ }
+
+ $paths = array_keys($container->getDefinition('twig.template_iterator')->getArgument(2));
+ if ($container->hasDefinition($this->debugCommandServiceId)) {
+ $definition = $container->getDefinition($this->debugCommandServiceId);
+ $definition->replaceArgument(4, $container->getParameter('twig.default_path'));
+
+ if (\count($definition->getArguments()) > 6) {
+ $definition->replaceArgument(6, $paths);
+ }
+ }
+ if ($container->hasDefinition($this->updateCommandServiceId)) {
+ $definition = $container->getDefinition($this->updateCommandServiceId);
+ $definition->replaceArgument(5, $container->getParameter('twig.default_path'));
+
+ if (\count($definition->getArguments()) > 7) {
+ $definition->replaceArgument(7, $paths);
+ }
+ }
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/DependencyInjection/TranslatorPathsPass.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/DependencyInjection/TranslatorPathsPass.php
new file mode 100644
index 0000000..8ff2587
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/DependencyInjection/TranslatorPathsPass.php
@@ -0,0 +1,144 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\DependencyInjection;
+
+use Symfony\Component\DependencyInjection\Compiler\AbstractRecursivePass;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Definition;
+use Symfony\Component\DependencyInjection\Reference;
+use Symfony\Component\DependencyInjection\ServiceLocator;
+
+/**
+ * @author Yonel Ceruto
+ */
+class TranslatorPathsPass extends AbstractRecursivePass
+{
+ private $translatorServiceId;
+ private $debugCommandServiceId;
+ private $updateCommandServiceId;
+ private $resolverServiceId;
+ private $level = 0;
+ private $paths = [];
+ private $definitions = [];
+ private $controllers = [];
+
+ public function __construct(string $translatorServiceId = 'translator', string $debugCommandServiceId = 'console.command.translation_debug', string $updateCommandServiceId = 'console.command.translation_update', string $resolverServiceId = 'argument_resolver.service')
+ {
+ $this->translatorServiceId = $translatorServiceId;
+ $this->debugCommandServiceId = $debugCommandServiceId;
+ $this->updateCommandServiceId = $updateCommandServiceId;
+ $this->resolverServiceId = $resolverServiceId;
+ }
+
+ public function process(ContainerBuilder $container)
+ {
+ if (!$container->hasDefinition($this->translatorServiceId)) {
+ return;
+ }
+
+ foreach ($this->findControllerArguments($container) as $controller => $argument) {
+ $id = substr($controller, 0, strpos($controller, ':') ?: \strlen($controller));
+ if ($container->hasDefinition($id)) {
+ list($locatorRef) = $argument->getValues();
+ $this->controllers[(string) $locatorRef][$container->getDefinition($id)->getClass()] = true;
+ }
+ }
+
+ try {
+ parent::process($container);
+
+ $paths = [];
+ foreach ($this->paths as $class => $_) {
+ if (($r = $container->getReflectionClass($class)) && !$r->isInterface()) {
+ $paths[] = $r->getFileName();
+ }
+ }
+ if ($paths) {
+ if ($container->hasDefinition($this->debugCommandServiceId)) {
+ $definition = $container->getDefinition($this->debugCommandServiceId);
+ $definition->replaceArgument(6, array_merge($definition->getArgument(6), $paths));
+ }
+ if ($container->hasDefinition($this->updateCommandServiceId)) {
+ $definition = $container->getDefinition($this->updateCommandServiceId);
+ $definition->replaceArgument(7, array_merge($definition->getArgument(7), $paths));
+ }
+ }
+ } finally {
+ $this->level = 0;
+ $this->paths = [];
+ $this->definitions = [];
+ }
+ }
+
+ protected function processValue($value, $isRoot = false)
+ {
+ if ($value instanceof Reference) {
+ if ((string) $value === $this->translatorServiceId) {
+ for ($i = $this->level - 1; $i >= 0; --$i) {
+ $class = $this->definitions[$i]->getClass();
+
+ if (ServiceLocator::class === $class) {
+ if (!isset($this->controllers[$this->currentId])) {
+ continue;
+ }
+ foreach ($this->controllers[$this->currentId] as $class => $_) {
+ $this->paths[$class] = true;
+ }
+ } else {
+ $this->paths[$class] = true;
+ }
+
+ break;
+ }
+ }
+
+ return $value;
+ }
+
+ if ($value instanceof Definition) {
+ $this->definitions[$this->level++] = $value;
+ $value = parent::processValue($value, $isRoot);
+ unset($this->definitions[--$this->level]);
+
+ return $value;
+ }
+
+ return parent::processValue($value, $isRoot);
+ }
+
+ private function findControllerArguments(ContainerBuilder $container): array
+ {
+ if ($container->hasDefinition($this->resolverServiceId)) {
+ $argument = $container->getDefinition($this->resolverServiceId)->getArgument(0);
+ if ($argument instanceof Reference) {
+ $argument = $container->getDefinition($argument);
+ }
+
+ return $argument->getArgument(0);
+ }
+
+ if ($container->hasDefinition('debug.'.$this->resolverServiceId)) {
+ $argument = $container->getDefinition('debug.'.$this->resolverServiceId)->getArgument(0);
+ if ($argument instanceof Reference) {
+ $argument = $container->getDefinition($argument);
+ }
+ $argument = $argument->getArgument(0);
+ if ($argument instanceof Reference) {
+ $argument = $container->getDefinition($argument);
+ }
+
+ return $argument->getArgument(0);
+ }
+
+ return [];
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Dumper/CsvFileDumper.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Dumper/CsvFileDumper.php
new file mode 100644
index 0000000..bfa8db6
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Dumper/CsvFileDumper.php
@@ -0,0 +1,63 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Dumper;
+
+use Symfony\Component\Translation\MessageCatalogue;
+
+/**
+ * CsvFileDumper generates a csv formatted string representation of a message catalogue.
+ *
+ * @author Stealth35
+ */
+class CsvFileDumper extends FileDumper
+{
+ private $delimiter = ';';
+ private $enclosure = '"';
+
+ /**
+ * {@inheritdoc}
+ */
+ public function formatCatalogue(MessageCatalogue $messages, $domain, array $options = [])
+ {
+ $handle = fopen('php://memory', 'r+b');
+
+ foreach ($messages->all($domain) as $source => $target) {
+ fputcsv($handle, [$source, $target], $this->delimiter, $this->enclosure);
+ }
+
+ rewind($handle);
+ $output = stream_get_contents($handle);
+ fclose($handle);
+
+ return $output;
+ }
+
+ /**
+ * Sets the delimiter and escape character for CSV.
+ *
+ * @param string $delimiter Delimiter character
+ * @param string $enclosure Enclosure character
+ */
+ public function setCsvControl($delimiter = ';', $enclosure = '"')
+ {
+ $this->delimiter = $delimiter;
+ $this->enclosure = $enclosure;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function getExtension()
+ {
+ return 'csv';
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Dumper/DumperInterface.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Dumper/DumperInterface.php
new file mode 100644
index 0000000..445b701
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Dumper/DumperInterface.php
@@ -0,0 +1,30 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Dumper;
+
+use Symfony\Component\Translation\MessageCatalogue;
+
+/**
+ * DumperInterface is the interface implemented by all translation dumpers.
+ * There is no common option.
+ *
+ * @author Michel Salib
+ */
+interface DumperInterface
+{
+ /**
+ * Dumps the message catalogue.
+ *
+ * @param array $options Options that are used by the dumper
+ */
+ public function dump(MessageCatalogue $messages, $options = []);
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Dumper/FileDumper.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Dumper/FileDumper.php
new file mode 100644
index 0000000..2009c53
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Dumper/FileDumper.php
@@ -0,0 +1,130 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Dumper;
+
+use Symfony\Component\Translation\Exception\InvalidArgumentException;
+use Symfony\Component\Translation\Exception\RuntimeException;
+use Symfony\Component\Translation\MessageCatalogue;
+
+/**
+ * FileDumper is an implementation of DumperInterface that dump a message catalogue to file(s).
+ *
+ * Options:
+ * - path (mandatory): the directory where the files should be saved
+ *
+ * @author Michel Salib
+ */
+abstract class FileDumper implements DumperInterface
+{
+ /**
+ * A template for the relative paths to files.
+ *
+ * @var string
+ */
+ protected $relativePathTemplate = '%domain%.%locale%.%extension%';
+
+ /**
+ * Sets the template for the relative paths to files.
+ *
+ * @param string $relativePathTemplate A template for the relative paths to files
+ */
+ public function setRelativePathTemplate($relativePathTemplate)
+ {
+ $this->relativePathTemplate = $relativePathTemplate;
+ }
+
+ /**
+ * Sets backup flag.
+ *
+ * @param bool $backup
+ *
+ * @deprecated since Symfony 4.1
+ */
+ public function setBackup($backup)
+ {
+ @trigger_error(sprintf('The "%s()" method is deprecated since Symfony 4.1.', __METHOD__), E_USER_DEPRECATED);
+
+ if (false !== $backup) {
+ throw new \LogicException('The backup feature is no longer supported.');
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function dump(MessageCatalogue $messages, $options = [])
+ {
+ if (!\array_key_exists('path', $options)) {
+ throw new InvalidArgumentException('The file dumper needs a path option.');
+ }
+
+ // save a file for each domain
+ foreach ($messages->getDomains() as $domain) {
+ $fullpath = $options['path'].'/'.$this->getRelativePath($domain, $messages->getLocale());
+ if (!file_exists($fullpath)) {
+ $directory = \dirname($fullpath);
+ if (!file_exists($directory) && !@mkdir($directory, 0777, true)) {
+ throw new RuntimeException(sprintf('Unable to create directory "%s".', $directory));
+ }
+ }
+
+ $intlDomain = $domain.MessageCatalogue::INTL_DOMAIN_SUFFIX;
+ $intlMessages = $messages->all($intlDomain);
+
+ if ($intlMessages) {
+ $intlPath = $options['path'].'/'.$this->getRelativePath($intlDomain, $messages->getLocale());
+ file_put_contents($intlPath, $this->formatCatalogue($messages, $intlDomain, $options));
+
+ $messages->replace([], $intlDomain);
+
+ try {
+ if ($messages->all($domain)) {
+ file_put_contents($fullpath, $this->formatCatalogue($messages, $domain, $options));
+ }
+ continue;
+ } finally {
+ $messages->replace($intlMessages, $intlDomain);
+ }
+ }
+
+ file_put_contents($fullpath, $this->formatCatalogue($messages, $domain, $options));
+ }
+ }
+
+ /**
+ * Transforms a domain of a message catalogue to its string representation.
+ *
+ * @param string $domain
+ *
+ * @return string representation
+ */
+ abstract public function formatCatalogue(MessageCatalogue $messages, $domain, array $options = []);
+
+ /**
+ * Gets the file extension of the dumper.
+ *
+ * @return string file extension
+ */
+ abstract protected function getExtension();
+
+ /**
+ * Gets the relative file path using the template.
+ */
+ private function getRelativePath(string $domain, string $locale): string
+ {
+ return strtr($this->relativePathTemplate, [
+ '%domain%' => $domain,
+ '%locale%' => $locale,
+ '%extension%' => $this->getExtension(),
+ ]);
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Dumper/IcuResFileDumper.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Dumper/IcuResFileDumper.php
new file mode 100644
index 0000000..829e0d0
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Dumper/IcuResFileDumper.php
@@ -0,0 +1,104 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Dumper;
+
+use Symfony\Component\Translation\MessageCatalogue;
+
+/**
+ * IcuResDumper generates an ICU ResourceBundle formatted string representation of a message catalogue.
+ *
+ * @author Stealth35
+ */
+class IcuResFileDumper extends FileDumper
+{
+ /**
+ * {@inheritdoc}
+ */
+ protected $relativePathTemplate = '%domain%/%locale%.%extension%';
+
+ /**
+ * {@inheritdoc}
+ */
+ public function formatCatalogue(MessageCatalogue $messages, $domain, array $options = [])
+ {
+ $data = $indexes = $resources = '';
+
+ foreach ($messages->all($domain) as $source => $target) {
+ $indexes .= pack('v', \strlen($data) + 28);
+ $data .= $source."\0";
+ }
+
+ $data .= $this->writePadding($data);
+
+ $keyTop = $this->getPosition($data);
+
+ foreach ($messages->all($domain) as $source => $target) {
+ $resources .= pack('V', $this->getPosition($data));
+
+ $data .= pack('V', \strlen($target))
+ .mb_convert_encoding($target."\0", 'UTF-16LE', 'UTF-8')
+ .$this->writePadding($data)
+ ;
+ }
+
+ $resOffset = $this->getPosition($data);
+
+ $data .= pack('v', \count($messages->all($domain)))
+ .$indexes
+ .$this->writePadding($data)
+ .$resources
+ ;
+
+ $bundleTop = $this->getPosition($data);
+
+ $root = pack('V7',
+ $resOffset + (2 << 28), // Resource Offset + Resource Type
+ 6, // Index length
+ $keyTop, // Index keys top
+ $bundleTop, // Index resources top
+ $bundleTop, // Index bundle top
+ \count($messages->all($domain)), // Index max table length
+ 0 // Index attributes
+ );
+
+ $header = pack('vC2v4C12@32',
+ 32, // Header size
+ 0xDA, 0x27, // Magic number 1 and 2
+ 20, 0, 0, 2, // Rest of the header, ..., Size of a char
+ 0x52, 0x65, 0x73, 0x42, // Data format identifier
+ 1, 2, 0, 0, // Data version
+ 1, 4, 0, 0 // Unicode version
+ );
+
+ return $header.$root.$data;
+ }
+
+ private function writePadding(string $data): ?string
+ {
+ $padding = \strlen($data) % 4;
+
+ return $padding ? str_repeat("\xAA", 4 - $padding) : null;
+ }
+
+ private function getPosition(string $data)
+ {
+ return (\strlen($data) + 28) / 4;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function getExtension()
+ {
+ return 'res';
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Dumper/IniFileDumper.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Dumper/IniFileDumper.php
new file mode 100644
index 0000000..45ff961
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Dumper/IniFileDumper.php
@@ -0,0 +1,45 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Dumper;
+
+use Symfony\Component\Translation\MessageCatalogue;
+
+/**
+ * IniFileDumper generates an ini formatted string representation of a message catalogue.
+ *
+ * @author Stealth35
+ */
+class IniFileDumper extends FileDumper
+{
+ /**
+ * {@inheritdoc}
+ */
+ public function formatCatalogue(MessageCatalogue $messages, $domain, array $options = [])
+ {
+ $output = '';
+
+ foreach ($messages->all($domain) as $source => $target) {
+ $escapeTarget = str_replace('"', '\"', $target);
+ $output .= $source.'="'.$escapeTarget."\"\n";
+ }
+
+ return $output;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function getExtension()
+ {
+ return 'ini';
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Dumper/JsonFileDumper.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Dumper/JsonFileDumper.php
new file mode 100644
index 0000000..2af8231
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Dumper/JsonFileDumper.php
@@ -0,0 +1,40 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Dumper;
+
+use Symfony\Component\Translation\MessageCatalogue;
+
+/**
+ * JsonFileDumper generates an json formatted string representation of a message catalogue.
+ *
+ * @author singles
+ */
+class JsonFileDumper extends FileDumper
+{
+ /**
+ * {@inheritdoc}
+ */
+ public function formatCatalogue(MessageCatalogue $messages, $domain, array $options = [])
+ {
+ $flags = $options['json_encoding'] ?? JSON_PRETTY_PRINT;
+
+ return json_encode($messages->all($domain), $flags);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function getExtension()
+ {
+ return 'json';
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Dumper/MoFileDumper.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Dumper/MoFileDumper.php
new file mode 100644
index 0000000..5a96dac
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Dumper/MoFileDumper.php
@@ -0,0 +1,82 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Dumper;
+
+use Symfony\Component\Translation\Loader\MoFileLoader;
+use Symfony\Component\Translation\MessageCatalogue;
+
+/**
+ * MoFileDumper generates a gettext formatted string representation of a message catalogue.
+ *
+ * @author Stealth35
+ */
+class MoFileDumper extends FileDumper
+{
+ /**
+ * {@inheritdoc}
+ */
+ public function formatCatalogue(MessageCatalogue $messages, $domain, array $options = [])
+ {
+ $sources = $targets = $sourceOffsets = $targetOffsets = '';
+ $offsets = [];
+ $size = 0;
+
+ foreach ($messages->all($domain) as $source => $target) {
+ $offsets[] = array_map('strlen', [$sources, $source, $targets, $target]);
+ $sources .= "\0".$source;
+ $targets .= "\0".$target;
+ ++$size;
+ }
+
+ $header = [
+ 'magicNumber' => MoFileLoader::MO_LITTLE_ENDIAN_MAGIC,
+ 'formatRevision' => 0,
+ 'count' => $size,
+ 'offsetId' => MoFileLoader::MO_HEADER_SIZE,
+ 'offsetTranslated' => MoFileLoader::MO_HEADER_SIZE + (8 * $size),
+ 'sizeHashes' => 0,
+ 'offsetHashes' => MoFileLoader::MO_HEADER_SIZE + (16 * $size),
+ ];
+
+ $sourcesSize = \strlen($sources);
+ $sourcesStart = $header['offsetHashes'] + 1;
+
+ foreach ($offsets as $offset) {
+ $sourceOffsets .= $this->writeLong($offset[1])
+ .$this->writeLong($offset[0] + $sourcesStart);
+ $targetOffsets .= $this->writeLong($offset[3])
+ .$this->writeLong($offset[2] + $sourcesStart + $sourcesSize);
+ }
+
+ $output = implode('', array_map([$this, 'writeLong'], $header))
+ .$sourceOffsets
+ .$targetOffsets
+ .$sources
+ .$targets
+ ;
+
+ return $output;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function getExtension()
+ {
+ return 'mo';
+ }
+
+ private function writeLong($str): string
+ {
+ return pack('V*', $str);
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Dumper/PhpFileDumper.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Dumper/PhpFileDumper.php
new file mode 100644
index 0000000..e77afc2
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Dumper/PhpFileDumper.php
@@ -0,0 +1,38 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Dumper;
+
+use Symfony\Component\Translation\MessageCatalogue;
+
+/**
+ * PhpFileDumper generates PHP files from a message catalogue.
+ *
+ * @author Michel Salib
+ */
+class PhpFileDumper extends FileDumper
+{
+ /**
+ * {@inheritdoc}
+ */
+ public function formatCatalogue(MessageCatalogue $messages, $domain, array $options = [])
+ {
+ return "all($domain), true).";\n";
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function getExtension()
+ {
+ return 'php';
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Dumper/PoFileDumper.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Dumper/PoFileDumper.php
new file mode 100644
index 0000000..2cc9e88
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Dumper/PoFileDumper.php
@@ -0,0 +1,137 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Dumper;
+
+use Symfony\Component\Translation\MessageCatalogue;
+
+/**
+ * PoFileDumper generates a gettext formatted string representation of a message catalogue.
+ *
+ * @author Stealth35
+ */
+class PoFileDumper extends FileDumper
+{
+ /**
+ * {@inheritdoc}
+ */
+ public function formatCatalogue(MessageCatalogue $messages, $domain, array $options = [])
+ {
+ $output = 'msgid ""'."\n";
+ $output .= 'msgstr ""'."\n";
+ $output .= '"Content-Type: text/plain; charset=UTF-8\n"'."\n";
+ $output .= '"Content-Transfer-Encoding: 8bit\n"'."\n";
+ $output .= '"Language: '.$messages->getLocale().'\n"'."\n";
+ $output .= "\n";
+
+ $newLine = false;
+ foreach ($messages->all($domain) as $source => $target) {
+ if ($newLine) {
+ $output .= "\n";
+ } else {
+ $newLine = true;
+ }
+ $metadata = $messages->getMetadata($source, $domain);
+
+ if (isset($metadata['comments'])) {
+ $output .= $this->formatComments($metadata['comments']);
+ }
+ if (isset($metadata['flags'])) {
+ $output .= $this->formatComments(implode(',', (array) $metadata['flags']), ',');
+ }
+ if (isset($metadata['sources'])) {
+ $output .= $this->formatComments(implode(' ', (array) $metadata['sources']), ':');
+ }
+
+ $sourceRules = $this->getStandardRules($source);
+ $targetRules = $this->getStandardRules($target);
+ if (2 == \count($sourceRules) && $targetRules !== []) {
+ $output .= sprintf('msgid "%s"'."\n", $this->escape($sourceRules[0]));
+ $output .= sprintf('msgid_plural "%s"'."\n", $this->escape($sourceRules[1]));
+ foreach ($targetRules as $i => $targetRule) {
+ $output .= sprintf('msgstr[%d] "%s"'."\n", $i, $this->escape($targetRule));
+ }
+ } else {
+ $output .= sprintf('msgid "%s"'."\n", $this->escape($source));
+ $output .= sprintf('msgstr "%s"'."\n", $this->escape($target));
+ }
+ }
+
+ return $output;
+ }
+
+ private function getStandardRules(string $id)
+ {
+ // Partly copied from TranslatorTrait::trans.
+ $parts = [];
+ if (preg_match('/^\|++$/', $id)) {
+ $parts = explode('|', $id);
+ } elseif (preg_match_all('/(?:\|\||[^\|])++/', $id, $matches)) {
+ $parts = $matches[0];
+ }
+
+ $intervalRegexp = <<<'EOF'
+/^(?P
+ ({\s*
+ (\-?\d+(\.\d+)?[\s*,\s*\-?\d+(\.\d+)?]*)
+ \s*})
+
+ |
+
+ (?P[\[\]])
+ \s*
+ (?P-Inf|\-?\d+(\.\d+)?)
+ \s*,\s*
+ (?P\+?Inf|\-?\d+(\.\d+)?)
+ \s*
+ (?P[\[\]])
+)\s*(?P.*?)$/xs
+EOF;
+
+ $standardRules = [];
+ foreach ($parts as $part) {
+ $part = trim(str_replace('||', '|', $part));
+
+ if (preg_match($intervalRegexp, $part)) {
+ // Explicit rule is not a standard rule.
+ return [];
+ } else {
+ $standardRules[] = $part;
+ }
+ }
+
+ return $standardRules;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function getExtension()
+ {
+ return 'po';
+ }
+
+ private function escape(string $str): string
+ {
+ return addcslashes($str, "\0..\37\42\134");
+ }
+
+ private function formatComments($comments, string $prefix = ''): ?string
+ {
+ $output = null;
+
+ foreach ((array) $comments as $comment) {
+ $output .= sprintf('#%s %s'."\n", $prefix, $comment);
+ }
+
+ return $output;
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Dumper/QtFileDumper.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Dumper/QtFileDumper.php
new file mode 100644
index 0000000..79a64b2
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Dumper/QtFileDumper.php
@@ -0,0 +1,61 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Dumper;
+
+use Symfony\Component\Translation\MessageCatalogue;
+
+/**
+ * QtFileDumper generates ts files from a message catalogue.
+ *
+ * @author Benjamin Eberlei
+ */
+class QtFileDumper extends FileDumper
+{
+ /**
+ * {@inheritdoc}
+ */
+ public function formatCatalogue(MessageCatalogue $messages, $domain, array $options = [])
+ {
+ $dom = new \DOMDocument('1.0', 'utf-8');
+ $dom->formatOutput = true;
+ $ts = $dom->appendChild($dom->createElement('TS'));
+ $context = $ts->appendChild($dom->createElement('context'));
+ $context->appendChild($dom->createElement('name', $domain));
+
+ foreach ($messages->all($domain) as $source => $target) {
+ $message = $context->appendChild($dom->createElement('message'));
+ $metadata = $messages->getMetadata($source, $domain);
+ if (isset($metadata['sources'])) {
+ foreach ((array) $metadata['sources'] as $location) {
+ $loc = explode(':', $location, 2);
+ $location = $message->appendChild($dom->createElement('location'));
+ $location->setAttribute('filename', $loc[0]);
+ if (isset($loc[1])) {
+ $location->setAttribute('line', $loc[1]);
+ }
+ }
+ }
+ $message->appendChild($dom->createElement('source', $source));
+ $message->appendChild($dom->createElement('translation', $target));
+ }
+
+ return $dom->saveXML();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function getExtension()
+ {
+ return 'ts';
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Dumper/XliffFileDumper.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Dumper/XliffFileDumper.php
new file mode 100644
index 0000000..dd9d788
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Dumper/XliffFileDumper.php
@@ -0,0 +1,203 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Dumper;
+
+use Symfony\Component\Translation\Exception\InvalidArgumentException;
+use Symfony\Component\Translation\MessageCatalogue;
+
+/**
+ * XliffFileDumper generates xliff files from a message catalogue.
+ *
+ * @author Michel Salib
+ */
+class XliffFileDumper extends FileDumper
+{
+ /**
+ * {@inheritdoc}
+ */
+ public function formatCatalogue(MessageCatalogue $messages, $domain, array $options = [])
+ {
+ $xliffVersion = '1.2';
+ if (\array_key_exists('xliff_version', $options)) {
+ $xliffVersion = $options['xliff_version'];
+ }
+
+ if (\array_key_exists('default_locale', $options)) {
+ $defaultLocale = $options['default_locale'];
+ } else {
+ $defaultLocale = \Locale::getDefault();
+ }
+
+ if ('1.2' === $xliffVersion) {
+ return $this->dumpXliff1($defaultLocale, $messages, $domain, $options);
+ }
+ if ('2.0' === $xliffVersion) {
+ return $this->dumpXliff2($defaultLocale, $messages, $domain);
+ }
+
+ throw new InvalidArgumentException(sprintf('No support implemented for dumping XLIFF version "%s".', $xliffVersion));
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function getExtension()
+ {
+ return 'xlf';
+ }
+
+ private function dumpXliff1(string $defaultLocale, MessageCatalogue $messages, ?string $domain, array $options = [])
+ {
+ $toolInfo = ['tool-id' => 'symfony', 'tool-name' => 'Symfony'];
+ if (\array_key_exists('tool_info', $options)) {
+ $toolInfo = array_merge($toolInfo, $options['tool_info']);
+ }
+
+ $dom = new \DOMDocument('1.0', 'utf-8');
+ $dom->formatOutput = true;
+
+ $xliff = $dom->appendChild($dom->createElement('xliff'));
+ $xliff->setAttribute('version', '1.2');
+ $xliff->setAttribute('xmlns', 'urn:oasis:names:tc:xliff:document:1.2');
+
+ $xliffFile = $xliff->appendChild($dom->createElement('file'));
+ $xliffFile->setAttribute('source-language', str_replace('_', '-', $defaultLocale));
+ $xliffFile->setAttribute('target-language', str_replace('_', '-', $messages->getLocale()));
+ $xliffFile->setAttribute('datatype', 'plaintext');
+ $xliffFile->setAttribute('original', 'file.ext');
+
+ $xliffHead = $xliffFile->appendChild($dom->createElement('header'));
+ $xliffTool = $xliffHead->appendChild($dom->createElement('tool'));
+ foreach ($toolInfo as $id => $value) {
+ $xliffTool->setAttribute($id, $value);
+ }
+
+ $xliffBody = $xliffFile->appendChild($dom->createElement('body'));
+ foreach ($messages->all($domain) as $source => $target) {
+ $translation = $dom->createElement('trans-unit');
+
+ $translation->setAttribute('id', strtr(substr(base64_encode(hash('sha256', $source, true)), 0, 7), '/+', '._'));
+ $translation->setAttribute('resname', $source);
+
+ $s = $translation->appendChild($dom->createElement('source'));
+ $s->appendChild($dom->createTextNode($source));
+
+ // Does the target contain characters requiring a CDATA section?
+ $text = 1 === preg_match('/[&<>]/', $target) ? $dom->createCDATASection($target) : $dom->createTextNode($target);
+
+ $targetElement = $dom->createElement('target');
+ $metadata = $messages->getMetadata($source, $domain);
+ if ($this->hasMetadataArrayInfo('target-attributes', $metadata)) {
+ foreach ($metadata['target-attributes'] as $name => $value) {
+ $targetElement->setAttribute($name, $value);
+ }
+ }
+ $t = $translation->appendChild($targetElement);
+ $t->appendChild($text);
+
+ if ($this->hasMetadataArrayInfo('notes', $metadata)) {
+ foreach ($metadata['notes'] as $note) {
+ if (!isset($note['content'])) {
+ continue;
+ }
+
+ $n = $translation->appendChild($dom->createElement('note'));
+ $n->appendChild($dom->createTextNode($note['content']));
+
+ if (isset($note['priority'])) {
+ $n->setAttribute('priority', $note['priority']);
+ }
+
+ if (isset($note['from'])) {
+ $n->setAttribute('from', $note['from']);
+ }
+ }
+ }
+
+ $xliffBody->appendChild($translation);
+ }
+
+ return $dom->saveXML();
+ }
+
+ private function dumpXliff2(string $defaultLocale, MessageCatalogue $messages, ?string $domain)
+ {
+ $dom = new \DOMDocument('1.0', 'utf-8');
+ $dom->formatOutput = true;
+
+ $xliff = $dom->appendChild($dom->createElement('xliff'));
+ $xliff->setAttribute('xmlns', 'urn:oasis:names:tc:xliff:document:2.0');
+ $xliff->setAttribute('version', '2.0');
+ $xliff->setAttribute('srcLang', str_replace('_', '-', $defaultLocale));
+ $xliff->setAttribute('trgLang', str_replace('_', '-', $messages->getLocale()));
+
+ $xliffFile = $xliff->appendChild($dom->createElement('file'));
+ if (MessageCatalogue::INTL_DOMAIN_SUFFIX === substr($domain, -($suffixLength = \strlen(MessageCatalogue::INTL_DOMAIN_SUFFIX)))) {
+ $xliffFile->setAttribute('id', substr($domain, 0, -$suffixLength).'.'.$messages->getLocale());
+ } else {
+ $xliffFile->setAttribute('id', $domain.'.'.$messages->getLocale());
+ }
+
+ foreach ($messages->all($domain) as $source => $target) {
+ $translation = $dom->createElement('unit');
+ $translation->setAttribute('id', strtr(substr(base64_encode(hash('sha256', $source, true)), 0, 7), '/+', '._'));
+ $name = $source;
+ if (\strlen($source) > 80) {
+ $name = substr(md5($source), -7);
+ }
+ $translation->setAttribute('name', $name);
+ $metadata = $messages->getMetadata($source, $domain);
+
+ // Add notes section
+ if ($this->hasMetadataArrayInfo('notes', $metadata)) {
+ $notesElement = $dom->createElement('notes');
+ foreach ($metadata['notes'] as $note) {
+ $n = $dom->createElement('note');
+ $n->appendChild($dom->createTextNode(isset($note['content']) ? $note['content'] : ''));
+ unset($note['content']);
+
+ foreach ($note as $name => $value) {
+ $n->setAttribute($name, $value);
+ }
+ $notesElement->appendChild($n);
+ }
+ $translation->appendChild($notesElement);
+ }
+
+ $segment = $translation->appendChild($dom->createElement('segment'));
+
+ $s = $segment->appendChild($dom->createElement('source'));
+ $s->appendChild($dom->createTextNode($source));
+
+ // Does the target contain characters requiring a CDATA section?
+ $text = 1 === preg_match('/[&<>]/', $target) ? $dom->createCDATASection($target) : $dom->createTextNode($target);
+
+ $targetElement = $dom->createElement('target');
+ if ($this->hasMetadataArrayInfo('target-attributes', $metadata)) {
+ foreach ($metadata['target-attributes'] as $name => $value) {
+ $targetElement->setAttribute($name, $value);
+ }
+ }
+ $t = $segment->appendChild($targetElement);
+ $t->appendChild($text);
+
+ $xliffFile->appendChild($translation);
+ }
+
+ return $dom->saveXML();
+ }
+
+ private function hasMetadataArrayInfo(string $key, array $metadata = null): bool
+ {
+ return null !== $metadata && \array_key_exists($key, $metadata) && ($metadata[$key] instanceof \Traversable || \is_array($metadata[$key]));
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Dumper/YamlFileDumper.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Dumper/YamlFileDumper.php
new file mode 100644
index 0000000..d6e4af8
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Dumper/YamlFileDumper.php
@@ -0,0 +1,62 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Dumper;
+
+use Symfony\Component\Translation\Exception\LogicException;
+use Symfony\Component\Translation\MessageCatalogue;
+use Symfony\Component\Translation\Util\ArrayConverter;
+use Symfony\Component\Yaml\Yaml;
+
+/**
+ * YamlFileDumper generates yaml files from a message catalogue.
+ *
+ * @author Michel Salib
+ */
+class YamlFileDumper extends FileDumper
+{
+ private $extension;
+
+ public function __construct(string $extension = 'yml')
+ {
+ $this->extension = $extension;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function formatCatalogue(MessageCatalogue $messages, $domain, array $options = [])
+ {
+ if (!class_exists('Symfony\Component\Yaml\Yaml')) {
+ throw new LogicException('Dumping translations in the YAML format requires the Symfony Yaml component.');
+ }
+
+ $data = $messages->all($domain);
+
+ if (isset($options['as_tree']) && $options['as_tree']) {
+ $data = ArrayConverter::expandToTree($data);
+ }
+
+ if (isset($options['inline']) && ($inline = (int) $options['inline']) > 0) {
+ return Yaml::dump($data, $inline);
+ }
+
+ return Yaml::dump($data);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function getExtension()
+ {
+ return $this->extension;
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Exception/ExceptionInterface.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Exception/ExceptionInterface.php
new file mode 100644
index 0000000..8f9c54e
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Exception/ExceptionInterface.php
@@ -0,0 +1,21 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Exception;
+
+/**
+ * Exception interface for all exceptions thrown by the component.
+ *
+ * @author Fabien Potencier
+ */
+interface ExceptionInterface extends \Throwable
+{
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Exception/InvalidArgumentException.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Exception/InvalidArgumentException.php
new file mode 100644
index 0000000..90d0669
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Exception/InvalidArgumentException.php
@@ -0,0 +1,21 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Exception;
+
+/**
+ * Base InvalidArgumentException for the Translation component.
+ *
+ * @author Abdellatif Ait boudad
+ */
+class InvalidArgumentException extends \InvalidArgumentException implements ExceptionInterface
+{
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Exception/InvalidResourceException.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Exception/InvalidResourceException.php
new file mode 100644
index 0000000..cf07943
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Exception/InvalidResourceException.php
@@ -0,0 +1,21 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Exception;
+
+/**
+ * Thrown when a resource cannot be loaded.
+ *
+ * @author Fabien Potencier
+ */
+class InvalidResourceException extends \InvalidArgumentException implements ExceptionInterface
+{
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Exception/LogicException.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Exception/LogicException.php
new file mode 100644
index 0000000..9019c7e
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Exception/LogicException.php
@@ -0,0 +1,21 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Exception;
+
+/**
+ * Base LogicException for Translation component.
+ *
+ * @author Abdellatif Ait boudad
+ */
+class LogicException extends \LogicException implements ExceptionInterface
+{
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Exception/NotFoundResourceException.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Exception/NotFoundResourceException.php
new file mode 100644
index 0000000..cff73ae
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Exception/NotFoundResourceException.php
@@ -0,0 +1,21 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Exception;
+
+/**
+ * Thrown when a resource does not exist.
+ *
+ * @author Fabien Potencier
+ */
+class NotFoundResourceException extends \InvalidArgumentException implements ExceptionInterface
+{
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Exception/RuntimeException.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Exception/RuntimeException.php
new file mode 100644
index 0000000..dcd7940
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Exception/RuntimeException.php
@@ -0,0 +1,21 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Exception;
+
+/**
+ * Base RuntimeException for the Translation component.
+ *
+ * @author Abdellatif Ait boudad
+ */
+class RuntimeException extends \RuntimeException implements ExceptionInterface
+{
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Extractor/AbstractFileExtractor.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Extractor/AbstractFileExtractor.php
new file mode 100644
index 0000000..618df73
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Extractor/AbstractFileExtractor.php
@@ -0,0 +1,80 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Extractor;
+
+use Symfony\Component\Translation\Exception\InvalidArgumentException;
+
+/**
+ * Base class used by classes that extract translation messages from files.
+ *
+ * @author Marcos D. Sánchez
+ */
+abstract class AbstractFileExtractor
+{
+ /**
+ * @param string|iterable $resource Files, a file or a directory
+ *
+ * @return iterable
+ */
+ protected function extractFiles($resource)
+ {
+ if (is_iterable($resource)) {
+ $files = [];
+ foreach ($resource as $file) {
+ if ($this->canBeExtracted($file)) {
+ $files[] = $this->toSplFileInfo($file);
+ }
+ }
+ } elseif (is_file($resource)) {
+ $files = $this->canBeExtracted($resource) ? [$this->toSplFileInfo($resource)] : [];
+ } else {
+ $files = $this->extractFromDirectory($resource);
+ }
+
+ return $files;
+ }
+
+ private function toSplFileInfo(string $file): \SplFileInfo
+ {
+ return new \SplFileInfo($file);
+ }
+
+ /**
+ * @param string $file
+ *
+ * @return bool
+ *
+ * @throws InvalidArgumentException
+ */
+ protected function isFile($file)
+ {
+ if (!is_file($file)) {
+ throw new InvalidArgumentException(sprintf('The "%s" file does not exist.', $file));
+ }
+
+ return true;
+ }
+
+ /**
+ * @param string $file
+ *
+ * @return bool
+ */
+ abstract protected function canBeExtracted($file);
+
+ /**
+ * @param string|array $resource Files, a file or a directory
+ *
+ * @return iterable files to be extracted
+ */
+ abstract protected function extractFromDirectory($resource);
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Extractor/ChainExtractor.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Extractor/ChainExtractor.php
new file mode 100644
index 0000000..2683f5d
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Extractor/ChainExtractor.php
@@ -0,0 +1,59 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Extractor;
+
+use Symfony\Component\Translation\MessageCatalogue;
+
+/**
+ * ChainExtractor extracts translation messages from template files.
+ *
+ * @author Michel Salib
+ */
+class ChainExtractor implements ExtractorInterface
+{
+ /**
+ * The extractors.
+ *
+ * @var ExtractorInterface[]
+ */
+ private $extractors = [];
+
+ /**
+ * Adds a loader to the translation extractor.
+ *
+ * @param string $format The format of the loader
+ */
+ public function addExtractor($format, ExtractorInterface $extractor)
+ {
+ $this->extractors[$format] = $extractor;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function setPrefix($prefix)
+ {
+ foreach ($this->extractors as $extractor) {
+ $extractor->setPrefix($prefix);
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function extract($directory, MessageCatalogue $catalogue)
+ {
+ foreach ($this->extractors as $extractor) {
+ $extractor->extract($directory, $catalogue);
+ }
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Extractor/ExtractorInterface.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Extractor/ExtractorInterface.php
new file mode 100644
index 0000000..91de201
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Extractor/ExtractorInterface.php
@@ -0,0 +1,37 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Extractor;
+
+use Symfony\Component\Translation\MessageCatalogue;
+
+/**
+ * Extracts translation messages from a directory or files to the catalogue.
+ * New found messages are injected to the catalogue using the prefix.
+ *
+ * @author Michel Salib
+ */
+interface ExtractorInterface
+{
+ /**
+ * Extracts translation messages from files, a file or a directory to the catalogue.
+ *
+ * @param string|array $resource Files, a file or a directory
+ */
+ public function extract($resource, MessageCatalogue $catalogue);
+
+ /**
+ * Sets the prefix that should be used for new found messages.
+ *
+ * @param string $prefix The prefix
+ */
+ public function setPrefix($prefix);
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Extractor/PhpExtractor.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Extractor/PhpExtractor.php
new file mode 100644
index 0000000..5237bf6
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Extractor/PhpExtractor.php
@@ -0,0 +1,275 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Extractor;
+
+use Symfony\Component\Finder\Finder;
+use Symfony\Component\Translation\MessageCatalogue;
+
+/**
+ * PhpExtractor extracts translation messages from a PHP template.
+ *
+ * @author Michel Salib
+ */
+class PhpExtractor extends AbstractFileExtractor implements ExtractorInterface
+{
+ const MESSAGE_TOKEN = 300;
+ const METHOD_ARGUMENTS_TOKEN = 1000;
+ const DOMAIN_TOKEN = 1001;
+
+ /**
+ * Prefix for new found message.
+ *
+ * @var string
+ */
+ private $prefix = '';
+
+ /**
+ * The sequence that captures translation messages.
+ *
+ * @var array
+ */
+ protected $sequences = [
+ [
+ '->',
+ 'trans',
+ '(',
+ self::MESSAGE_TOKEN,
+ ',',
+ self::METHOD_ARGUMENTS_TOKEN,
+ ',',
+ self::DOMAIN_TOKEN,
+ ],
+ [
+ '->',
+ 'transChoice',
+ '(',
+ self::MESSAGE_TOKEN,
+ ',',
+ self::METHOD_ARGUMENTS_TOKEN,
+ ',',
+ self::METHOD_ARGUMENTS_TOKEN,
+ ',',
+ self::DOMAIN_TOKEN,
+ ],
+ [
+ '->',
+ 'trans',
+ '(',
+ self::MESSAGE_TOKEN,
+ ],
+ [
+ '->',
+ 'transChoice',
+ '(',
+ self::MESSAGE_TOKEN,
+ ],
+ ];
+
+ /**
+ * {@inheritdoc}
+ */
+ public function extract($resource, MessageCatalogue $catalog)
+ {
+ $files = $this->extractFiles($resource);
+ foreach ($files as $file) {
+ $this->parseTokens(token_get_all(file_get_contents($file)), $catalog, $file);
+
+ gc_mem_caches();
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function setPrefix($prefix)
+ {
+ $this->prefix = $prefix;
+ }
+
+ /**
+ * Normalizes a token.
+ *
+ * @param mixed $token
+ *
+ * @return string|null
+ */
+ protected function normalizeToken($token)
+ {
+ if (isset($token[1]) && 'b"' !== $token) {
+ return $token[1];
+ }
+
+ return $token;
+ }
+
+ /**
+ * Seeks to a non-whitespace token.
+ */
+ private function seekToNextRelevantToken(\Iterator $tokenIterator)
+ {
+ for (; $tokenIterator->valid(); $tokenIterator->next()) {
+ $t = $tokenIterator->current();
+ if (T_WHITESPACE !== $t[0]) {
+ break;
+ }
+ }
+ }
+
+ private function skipMethodArgument(\Iterator $tokenIterator)
+ {
+ $openBraces = 0;
+
+ for (; $tokenIterator->valid(); $tokenIterator->next()) {
+ $t = $tokenIterator->current();
+
+ if ('[' === $t[0] || '(' === $t[0]) {
+ ++$openBraces;
+ }
+
+ if (']' === $t[0] || ')' === $t[0]) {
+ --$openBraces;
+ }
+
+ if ((0 === $openBraces && ',' === $t[0]) || (-1 === $openBraces && ')' === $t[0])) {
+ break;
+ }
+ }
+ }
+
+ /**
+ * Extracts the message from the iterator while the tokens
+ * match allowed message tokens.
+ */
+ private function getValue(\Iterator $tokenIterator)
+ {
+ $message = '';
+ $docToken = '';
+ $docPart = '';
+
+ for (; $tokenIterator->valid(); $tokenIterator->next()) {
+ $t = $tokenIterator->current();
+ if ('.' === $t) {
+ // Concatenate with next token
+ continue;
+ }
+ if (!isset($t[1])) {
+ break;
+ }
+
+ switch ($t[0]) {
+ case T_START_HEREDOC:
+ $docToken = $t[1];
+ break;
+ case T_ENCAPSED_AND_WHITESPACE:
+ case T_CONSTANT_ENCAPSED_STRING:
+ if ('' === $docToken) {
+ $message .= PhpStringTokenParser::parse($t[1]);
+ } else {
+ $docPart = $t[1];
+ }
+ break;
+ case T_END_HEREDOC:
+ $message .= PhpStringTokenParser::parseDocString($docToken, $docPart);
+ $docToken = '';
+ $docPart = '';
+ break;
+ case T_WHITESPACE:
+ break;
+ default:
+ break 2;
+ }
+ }
+
+ return $message;
+ }
+
+ /**
+ * Extracts trans message from PHP tokens.
+ *
+ * @param array $tokens
+ * @param string $filename
+ */
+ protected function parseTokens($tokens, MessageCatalogue $catalog/*, string $filename*/)
+ {
+ if (\func_num_args() < 3 && __CLASS__ !== static::class && __CLASS__ !== (new \ReflectionMethod($this, __FUNCTION__))->getDeclaringClass()->getName() && !$this instanceof \PHPUnit\Framework\MockObject\MockObject && !$this instanceof \Prophecy\Prophecy\ProphecySubjectInterface) {
+ @trigger_error(sprintf('The "%s()" method will have a new "string $filename" argument in version 5.0, not defining it is deprecated since Symfony 4.3.', __METHOD__), E_USER_DEPRECATED);
+ }
+ $filename = 2 < \func_num_args() ? func_get_arg(2) : '';
+
+ $tokenIterator = new \ArrayIterator($tokens);
+
+ for ($key = 0; $key < $tokenIterator->count(); ++$key) {
+ foreach ($this->sequences as $sequence) {
+ $message = '';
+ $domain = 'messages';
+ $tokenIterator->seek($key);
+
+ foreach ($sequence as $sequenceKey => $item) {
+ $this->seekToNextRelevantToken($tokenIterator);
+
+ if ($this->normalizeToken($tokenIterator->current()) === $item) {
+ $tokenIterator->next();
+ continue;
+ } elseif (self::MESSAGE_TOKEN === $item) {
+ $message = $this->getValue($tokenIterator);
+
+ if (\count($sequence) === ($sequenceKey + 1)) {
+ break;
+ }
+ } elseif (self::METHOD_ARGUMENTS_TOKEN === $item) {
+ $this->skipMethodArgument($tokenIterator);
+ } elseif (self::DOMAIN_TOKEN === $item) {
+ $domainToken = $this->getValue($tokenIterator);
+ if ('' !== $domainToken) {
+ $domain = $domainToken;
+ }
+
+ break;
+ } else {
+ break;
+ }
+ }
+
+ if ($message) {
+ $catalog->set($message, $this->prefix.$message, $domain);
+ $metadata = $catalog->getMetadata($message, $domain) ?? [];
+ $normalizedFilename = preg_replace('{[\\\\/]+}', '/', $filename);
+ $metadata['sources'][] = $normalizedFilename.':'.$tokens[$key][2];
+ $catalog->setMetadata($message, $metadata, $domain);
+ break;
+ }
+ }
+ }
+ }
+
+ /**
+ * @param string $file
+ *
+ * @return bool
+ *
+ * @throws \InvalidArgumentException
+ */
+ protected function canBeExtracted($file)
+ {
+ return $this->isFile($file) && 'php' === pathinfo($file, PATHINFO_EXTENSION);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function extractFromDirectory($directory)
+ {
+ $finder = new Finder();
+
+ return $finder->files()->name('*.php')->in($directory);
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Extractor/PhpStringTokenParser.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Extractor/PhpStringTokenParser.php
new file mode 100644
index 0000000..4531e91
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Extractor/PhpStringTokenParser.php
@@ -0,0 +1,142 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Extractor;
+
+/*
+ * The following is derived from code at http://github.com/nikic/PHP-Parser
+ *
+ * Copyright (c) 2011 by Nikita Popov
+ *
+ * Some rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ *
+ * * The names of the contributors may not be used to endorse or
+ * promote products derived from this software without specific
+ * prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+class PhpStringTokenParser
+{
+ protected static $replacements = [
+ '\\' => '\\',
+ '$' => '$',
+ 'n' => "\n",
+ 'r' => "\r",
+ 't' => "\t",
+ 'f' => "\f",
+ 'v' => "\v",
+ 'e' => "\x1B",
+ ];
+
+ /**
+ * Parses a string token.
+ *
+ * @param string $str String token content
+ *
+ * @return string The parsed string
+ */
+ public static function parse($str)
+ {
+ $bLength = 0;
+ if ('b' === $str[0]) {
+ $bLength = 1;
+ }
+
+ if ('\'' === $str[$bLength]) {
+ return str_replace(
+ ['\\\\', '\\\''],
+ ['\\', '\''],
+ substr($str, $bLength + 1, -1)
+ );
+ } else {
+ return self::parseEscapeSequences(substr($str, $bLength + 1, -1), '"');
+ }
+ }
+
+ /**
+ * Parses escape sequences in strings (all string types apart from single quoted).
+ *
+ * @param string $str String without quotes
+ * @param string|null $quote Quote type
+ *
+ * @return string String with escape sequences parsed
+ */
+ public static function parseEscapeSequences($str, $quote)
+ {
+ if (null !== $quote) {
+ $str = str_replace('\\'.$quote, $quote, $str);
+ }
+
+ return preg_replace_callback(
+ '~\\\\([\\\\$nrtfve]|[xX][0-9a-fA-F]{1,2}|[0-7]{1,3})~',
+ [__CLASS__, 'parseCallback'],
+ $str
+ );
+ }
+
+ private static function parseCallback(array $matches): string
+ {
+ $str = $matches[1];
+
+ if (isset(self::$replacements[$str])) {
+ return self::$replacements[$str];
+ } elseif ('x' === $str[0] || 'X' === $str[0]) {
+ return \chr(hexdec($str));
+ } else {
+ return \chr(octdec($str));
+ }
+ }
+
+ /**
+ * Parses a constant doc string.
+ *
+ * @param string $startToken Doc string start token content (<<
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Formatter;
+
+/**
+ * @author Abdellatif Ait boudad
+ *
+ * @deprecated since Symfony 4.2, use MessageFormatterInterface::format() with a %count% parameter instead
+ */
+interface ChoiceMessageFormatterInterface
+{
+ /**
+ * Formats a localized message pattern with given arguments.
+ *
+ * @param string $message The message (may also be an object that can be cast to string)
+ * @param int $number The number to use to find the indice of the message
+ * @param string $locale The message locale
+ * @param array $parameters An array of parameters for the message
+ *
+ * @return string
+ */
+ public function choiceFormat($message, $number, $locale, array $parameters = []);
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Formatter/IntlFormatter.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Formatter/IntlFormatter.php
new file mode 100644
index 0000000..9101a63
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Formatter/IntlFormatter.php
@@ -0,0 +1,60 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Formatter;
+
+use Symfony\Component\Translation\Exception\InvalidArgumentException;
+use Symfony\Component\Translation\Exception\LogicException;
+
+/**
+ * @author Guilherme Blanco
+ * @author Abdellatif Ait boudad
+ */
+class IntlFormatter implements IntlFormatterInterface
+{
+ private $hasMessageFormatter;
+ private $cache = [];
+
+ /**
+ * {@inheritdoc}
+ */
+ public function formatIntl(string $message, string $locale, array $parameters = []): string
+ {
+ // MessageFormatter constructor throws an exception if the message is empty
+ if ('' === $message) {
+ return '';
+ }
+
+ if (!$formatter = $this->cache[$locale][$message] ?? null) {
+ if (!($this->hasMessageFormatter ?? $this->hasMessageFormatter = class_exists(\MessageFormatter::class))) {
+ throw new LogicException('Cannot parse message translation: please install the "intl" PHP extension or the "symfony/polyfill-intl-messageformatter" package.');
+ }
+ try {
+ $this->cache[$locale][$message] = $formatter = new \MessageFormatter($locale, $message);
+ } catch (\IntlException $e) {
+ throw new InvalidArgumentException(sprintf('Invalid message format (error #%d): '.intl_get_error_message(), intl_get_error_code()), 0, $e);
+ }
+ }
+
+ foreach ($parameters as $key => $value) {
+ if (\in_array($key[0] ?? null, ['%', '{'], true)) {
+ unset($parameters[$key]);
+ $parameters[trim($key, '%{ }')] = $value;
+ }
+ }
+
+ if (false === $message = $formatter->format($parameters)) {
+ throw new InvalidArgumentException(sprintf('Unable to format message (error #%s): '.$formatter->getErrorMessage(), $formatter->getErrorCode()));
+ }
+
+ return $message;
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Formatter/IntlFormatterInterface.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Formatter/IntlFormatterInterface.php
new file mode 100644
index 0000000..02fc6ac
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Formatter/IntlFormatterInterface.php
@@ -0,0 +1,27 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Formatter;
+
+/**
+ * Formats ICU message patterns.
+ *
+ * @author Nicolas Grekas
+ */
+interface IntlFormatterInterface
+{
+ /**
+ * Formats a localized message using rules defined by ICU MessageFormat.
+ *
+ * @see http://icu-project.org/apiref/icu4c/classMessageFormat.html#details
+ */
+ public function formatIntl(string $message, string $locale, array $parameters = []): string;
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Formatter/MessageFormatter.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Formatter/MessageFormatter.php
new file mode 100644
index 0000000..a167640
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Formatter/MessageFormatter.php
@@ -0,0 +1,82 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Formatter;
+
+use Symfony\Component\Translation\IdentityTranslator;
+use Symfony\Component\Translation\MessageSelector;
+use Symfony\Component\Translation\TranslatorInterface as LegacyTranslatorInterface;
+use Symfony\Contracts\Translation\TranslatorInterface;
+
+// Help opcache.preload discover always-needed symbols
+class_exists(IntlFormatter::class);
+
+/**
+ * @author Abdellatif Ait boudad
+ */
+class MessageFormatter implements MessageFormatterInterface, IntlFormatterInterface, ChoiceMessageFormatterInterface
+{
+ private $translator;
+ private $intlFormatter;
+
+ /**
+ * @param TranslatorInterface|null $translator An identity translator to use as selector for pluralization
+ */
+ public function __construct($translator = null, IntlFormatterInterface $intlFormatter = null)
+ {
+ if ($translator instanceof MessageSelector) {
+ $translator = new IdentityTranslator($translator);
+ } elseif (null !== $translator && !$translator instanceof TranslatorInterface && !$translator instanceof LegacyTranslatorInterface) {
+ throw new \TypeError(sprintf('Argument 1 passed to "%s()" must be an instance of "%s", "%s" given.', __METHOD__, TranslatorInterface::class, \is_object($translator) ? \get_class($translator) : \gettype($translator)));
+ }
+
+ $this->translator = $translator ?? new IdentityTranslator();
+ $this->intlFormatter = $intlFormatter ?? new IntlFormatter();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function format($message, $locale, array $parameters = [])
+ {
+ if ($this->translator instanceof TranslatorInterface) {
+ return $this->translator->trans($message, $parameters, null, $locale);
+ }
+
+ return strtr($message, $parameters);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function formatIntl(string $message, string $locale, array $parameters = []): string
+ {
+ return $this->intlFormatter->formatIntl($message, $locale, $parameters);
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @deprecated since Symfony 4.2, use format() with a %count% parameter instead
+ */
+ public function choiceFormat($message, $number, $locale, array $parameters = [])
+ {
+ @trigger_error(sprintf('The "%s()" method is deprecated since Symfony 4.2, use the format() one instead with a %%count%% parameter.', __METHOD__), E_USER_DEPRECATED);
+
+ $parameters = ['%count%' => $number] + $parameters;
+
+ if ($this->translator instanceof TranslatorInterface) {
+ return $this->format($message, $locale, $parameters);
+ }
+
+ return $this->format($this->translator->transChoice($message, $number, [], null, $locale), $locale, $parameters);
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Formatter/MessageFormatterInterface.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Formatter/MessageFormatterInterface.php
new file mode 100644
index 0000000..370c055
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Formatter/MessageFormatterInterface.php
@@ -0,0 +1,30 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Formatter;
+
+/**
+ * @author Guilherme Blanco
+ * @author Abdellatif Ait boudad
+ */
+interface MessageFormatterInterface
+{
+ /**
+ * Formats a localized message pattern with given arguments.
+ *
+ * @param string $message The message (may also be an object that can be cast to string)
+ * @param string $locale The message locale
+ * @param array $parameters An array of parameters for the message
+ *
+ * @return string
+ */
+ public function format($message, $locale, array $parameters = []);
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/IdentityTranslator.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/IdentityTranslator.php
new file mode 100644
index 0000000..87b40bf
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/IdentityTranslator.php
@@ -0,0 +1,77 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation;
+
+use Symfony\Component\Translation\TranslatorInterface as LegacyTranslatorInterface;
+use Symfony\Contracts\Translation\TranslatorInterface;
+use Symfony\Contracts\Translation\TranslatorTrait;
+
+/**
+ * IdentityTranslator does not translate anything.
+ *
+ * @author Fabien Potencier
+ */
+class IdentityTranslator implements LegacyTranslatorInterface, TranslatorInterface
+{
+ use TranslatorTrait {
+ trans as private doTrans;
+ setLocale as private doSetLocale;
+ }
+
+ private $selector;
+
+ public function __construct(MessageSelector $selector = null)
+ {
+ $this->selector = $selector;
+
+ if (__CLASS__ !== static::class) {
+ @trigger_error(sprintf('Calling "%s()" is deprecated since Symfony 4.2.', __METHOD__), E_USER_DEPRECATED);
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function trans($id, array $parameters = [], $domain = null, $locale = null)
+ {
+ return $this->doTrans($id, $parameters, $domain, $locale);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function setLocale($locale)
+ {
+ $this->doSetLocale($locale);
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @deprecated since Symfony 4.2, use the trans() method instead with a %count% parameter
+ */
+ public function transChoice($id, $number, array $parameters = [], $domain = null, $locale = null)
+ {
+ @trigger_error(sprintf('The "%s()" method is deprecated since Symfony 4.2, use the trans() one instead with a "%%count%%" parameter.', __METHOD__), E_USER_DEPRECATED);
+
+ if ($this->selector) {
+ return strtr($this->selector->choose((string) $id, $number, $locale ?: $this->getLocale()), $parameters);
+ }
+
+ return $this->trans($id, ['%count%' => $number] + $parameters, $domain, $locale);
+ }
+
+ private function getPluralizationRule(int $number, string $locale): int
+ {
+ return PluralizationRules::get($number, $locale, false);
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Interval.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Interval.php
new file mode 100644
index 0000000..1adc43f
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Interval.php
@@ -0,0 +1,112 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation;
+
+@trigger_error(sprintf('The "%s" class is deprecated since Symfony 4.2, use IdentityTranslator instead.', Interval::class), E_USER_DEPRECATED);
+
+use Symfony\Component\Translation\Exception\InvalidArgumentException;
+
+/**
+ * Tests if a given number belongs to a given math interval.
+ *
+ * An interval can represent a finite set of numbers:
+ *
+ * {1,2,3,4}
+ *
+ * An interval can represent numbers between two numbers:
+ *
+ * [1, +Inf]
+ * ]-1,2[
+ *
+ * The left delimiter can be [ (inclusive) or ] (exclusive).
+ * The right delimiter can be [ (exclusive) or ] (inclusive).
+ * Beside numbers, you can use -Inf and +Inf for the infinite.
+ *
+ * @author Fabien Potencier
+ *
+ * @see http://en.wikipedia.org/wiki/Interval_%28mathematics%29#The_ISO_notation
+ * @deprecated since Symfony 4.2, use IdentityTranslator instead
+ */
+class Interval
+{
+ /**
+ * Tests if the given number is in the math interval.
+ *
+ * @param int $number A number
+ * @param string $interval An interval
+ *
+ * @return bool
+ *
+ * @throws InvalidArgumentException
+ */
+ public static function test($number, $interval)
+ {
+ $interval = trim($interval);
+
+ if (!preg_match('/^'.self::getIntervalRegexp().'$/x', $interval, $matches)) {
+ throw new InvalidArgumentException(sprintf('"%s" is not a valid interval.', $interval));
+ }
+
+ if ($matches[1]) {
+ foreach (explode(',', $matches[2]) as $n) {
+ if ($number == $n) {
+ return true;
+ }
+ }
+ } else {
+ $leftNumber = self::convertNumber($matches['left']);
+ $rightNumber = self::convertNumber($matches['right']);
+
+ return
+ ('[' === $matches['left_delimiter'] ? $number >= $leftNumber : $number > $leftNumber)
+ && (']' === $matches['right_delimiter'] ? $number <= $rightNumber : $number < $rightNumber)
+ ;
+ }
+
+ return false;
+ }
+
+ /**
+ * Returns a Regexp that matches valid intervals.
+ *
+ * @return string A Regexp (without the delimiters)
+ */
+ public static function getIntervalRegexp()
+ {
+ return <<[\[\]])
+ \s*
+ (?P-Inf|\-?\d+(\.\d+)?)
+ \s*,\s*
+ (?P\+?Inf|\-?\d+(\.\d+)?)
+ \s*
+ (?P[\[\]])
+EOF;
+ }
+
+ private static function convertNumber(string $number): float
+ {
+ if ('-Inf' === $number) {
+ return log(0);
+ } elseif ('+Inf' === $number || 'Inf' === $number) {
+ return -log(0);
+ }
+
+ return (float) $number;
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/LICENSE b/plugins/vdomah/jwtauth/vendor/symfony/translation/LICENSE
new file mode 100644
index 0000000..9e936ec
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2004-2020 Fabien Potencier
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is furnished
+to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Loader/ArrayLoader.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Loader/ArrayLoader.php
new file mode 100644
index 0000000..2e9a428
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Loader/ArrayLoader.php
@@ -0,0 +1,58 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Loader;
+
+use Symfony\Component\Translation\MessageCatalogue;
+
+/**
+ * ArrayLoader loads translations from a PHP array.
+ *
+ * @author Fabien Potencier
+ */
+class ArrayLoader implements LoaderInterface
+{
+ /**
+ * {@inheritdoc}
+ */
+ public function load($resource, $locale, $domain = 'messages')
+ {
+ $resource = $this->flatten($resource);
+ $catalogue = new MessageCatalogue($locale);
+ $catalogue->add($resource, $domain);
+
+ return $catalogue;
+ }
+
+ /**
+ * Flattens an nested array of translations.
+ *
+ * The scheme used is:
+ * 'key' => ['key2' => ['key3' => 'value']]
+ * Becomes:
+ * 'key.key2.key3' => 'value'
+ */
+ private function flatten(array $messages): array
+ {
+ $result = [];
+ foreach ($messages as $key => $value) {
+ if (\is_array($value)) {
+ foreach ($this->flatten($value) as $k => $v) {
+ $result[$key.'.'.$k] = $v;
+ }
+ } else {
+ $result[$key] = $value;
+ }
+ }
+
+ return $result;
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Loader/CsvFileLoader.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Loader/CsvFileLoader.php
new file mode 100644
index 0000000..db17bd5
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Loader/CsvFileLoader.php
@@ -0,0 +1,69 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Loader;
+
+use Symfony\Component\Translation\Exception\NotFoundResourceException;
+
+/**
+ * CsvFileLoader loads translations from CSV files.
+ *
+ * @author Saša Stamenković
+ */
+class CsvFileLoader extends FileLoader
+{
+ private $delimiter = ';';
+ private $enclosure = '"';
+ private $escape = '\\';
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function loadResource($resource)
+ {
+ $messages = [];
+
+ try {
+ $file = new \SplFileObject($resource, 'rb');
+ } catch (\RuntimeException $e) {
+ throw new NotFoundResourceException(sprintf('Error opening file "%s".', $resource), 0, $e);
+ }
+
+ $file->setFlags(\SplFileObject::READ_CSV | \SplFileObject::SKIP_EMPTY);
+ $file->setCsvControl($this->delimiter, $this->enclosure, $this->escape);
+
+ foreach ($file as $data) {
+ if (false === $data) {
+ continue;
+ }
+
+ if ('#' !== substr($data[0], 0, 1) && isset($data[1]) && 2 === \count($data)) {
+ $messages[$data[0]] = $data[1];
+ }
+ }
+
+ return $messages;
+ }
+
+ /**
+ * Sets the delimiter, enclosure, and escape character for CSV.
+ *
+ * @param string $delimiter Delimiter character
+ * @param string $enclosure Enclosure character
+ * @param string $escape Escape character
+ */
+ public function setCsvControl($delimiter = ';', $enclosure = '"', $escape = '\\')
+ {
+ $this->delimiter = $delimiter;
+ $this->enclosure = $enclosure;
+ $this->escape = $escape;
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Loader/FileLoader.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Loader/FileLoader.php
new file mode 100644
index 0000000..7ec54a3
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Loader/FileLoader.php
@@ -0,0 +1,65 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Loader;
+
+use Symfony\Component\Config\Resource\FileResource;
+use Symfony\Component\Translation\Exception\InvalidResourceException;
+use Symfony\Component\Translation\Exception\NotFoundResourceException;
+
+/**
+ * @author Abdellatif Ait boudad
+ */
+abstract class FileLoader extends ArrayLoader
+{
+ /**
+ * {@inheritdoc}
+ */
+ public function load($resource, $locale, $domain = 'messages')
+ {
+ if (!stream_is_local($resource)) {
+ throw new InvalidResourceException(sprintf('This is not a local file "%s".', $resource));
+ }
+
+ if (!file_exists($resource)) {
+ throw new NotFoundResourceException(sprintf('File "%s" not found.', $resource));
+ }
+
+ $messages = $this->loadResource($resource);
+
+ // empty resource
+ if (null === $messages) {
+ $messages = [];
+ }
+
+ // not an array
+ if (!\is_array($messages)) {
+ throw new InvalidResourceException(sprintf('Unable to load file "%s".', $resource));
+ }
+
+ $catalogue = parent::load($messages, $locale, $domain);
+
+ if (class_exists('Symfony\Component\Config\Resource\FileResource')) {
+ $catalogue->addResource(new FileResource($resource));
+ }
+
+ return $catalogue;
+ }
+
+ /**
+ * @param string $resource
+ *
+ * @return array
+ *
+ * @throws InvalidResourceException if stream content has an invalid format
+ */
+ abstract protected function loadResource($resource);
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Loader/IcuDatFileLoader.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Loader/IcuDatFileLoader.php
new file mode 100644
index 0000000..545c2b0
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Loader/IcuDatFileLoader.php
@@ -0,0 +1,61 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Loader;
+
+use Symfony\Component\Config\Resource\FileResource;
+use Symfony\Component\Translation\Exception\InvalidResourceException;
+use Symfony\Component\Translation\Exception\NotFoundResourceException;
+use Symfony\Component\Translation\MessageCatalogue;
+
+/**
+ * IcuResFileLoader loads translations from a resource bundle.
+ *
+ * @author stealth35
+ */
+class IcuDatFileLoader extends IcuResFileLoader
+{
+ /**
+ * {@inheritdoc}
+ */
+ public function load($resource, $locale, $domain = 'messages')
+ {
+ if (!stream_is_local($resource.'.dat')) {
+ throw new InvalidResourceException(sprintf('This is not a local file "%s".', $resource));
+ }
+
+ if (!file_exists($resource.'.dat')) {
+ throw new NotFoundResourceException(sprintf('File "%s" not found.', $resource));
+ }
+
+ try {
+ $rb = new \ResourceBundle($locale, $resource);
+ } catch (\Exception $e) {
+ $rb = null;
+ }
+
+ if (!$rb) {
+ throw new InvalidResourceException(sprintf('Cannot load resource "%s".', $resource));
+ } elseif (intl_is_failure($rb->getErrorCode())) {
+ throw new InvalidResourceException($rb->getErrorMessage(), $rb->getErrorCode());
+ }
+
+ $messages = $this->flatten($rb);
+ $catalogue = new MessageCatalogue($locale);
+ $catalogue->add($messages, $domain);
+
+ if (class_exists('Symfony\Component\Config\Resource\FileResource')) {
+ $catalogue->addResource(new FileResource($resource.'.dat'));
+ }
+
+ return $catalogue;
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Loader/IcuResFileLoader.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Loader/IcuResFileLoader.php
new file mode 100644
index 0000000..6dddf63
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Loader/IcuResFileLoader.php
@@ -0,0 +1,91 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Loader;
+
+use Symfony\Component\Config\Resource\DirectoryResource;
+use Symfony\Component\Translation\Exception\InvalidResourceException;
+use Symfony\Component\Translation\Exception\NotFoundResourceException;
+use Symfony\Component\Translation\MessageCatalogue;
+
+/**
+ * IcuResFileLoader loads translations from a resource bundle.
+ *
+ * @author stealth35
+ */
+class IcuResFileLoader implements LoaderInterface
+{
+ /**
+ * {@inheritdoc}
+ */
+ public function load($resource, $locale, $domain = 'messages')
+ {
+ if (!stream_is_local($resource)) {
+ throw new InvalidResourceException(sprintf('This is not a local file "%s".', $resource));
+ }
+
+ if (!is_dir($resource)) {
+ throw new NotFoundResourceException(sprintf('File "%s" not found.', $resource));
+ }
+
+ try {
+ $rb = new \ResourceBundle($locale, $resource);
+ } catch (\Exception $e) {
+ $rb = null;
+ }
+
+ if (!$rb) {
+ throw new InvalidResourceException(sprintf('Cannot load resource "%s".', $resource));
+ } elseif (intl_is_failure($rb->getErrorCode())) {
+ throw new InvalidResourceException($rb->getErrorMessage(), $rb->getErrorCode());
+ }
+
+ $messages = $this->flatten($rb);
+ $catalogue = new MessageCatalogue($locale);
+ $catalogue->add($messages, $domain);
+
+ if (class_exists('Symfony\Component\Config\Resource\DirectoryResource')) {
+ $catalogue->addResource(new DirectoryResource($resource));
+ }
+
+ return $catalogue;
+ }
+
+ /**
+ * Flattens an ResourceBundle.
+ *
+ * The scheme used is:
+ * key { key2 { key3 { "value" } } }
+ * Becomes:
+ * 'key.key2.key3' => 'value'
+ *
+ * This function takes an array by reference and will modify it
+ *
+ * @param \ResourceBundle $rb The ResourceBundle that will be flattened
+ * @param array $messages Used internally for recursive calls
+ * @param string $path Current path being parsed, used internally for recursive calls
+ *
+ * @return array the flattened ResourceBundle
+ */
+ protected function flatten(\ResourceBundle $rb, array &$messages = [], $path = null)
+ {
+ foreach ($rb as $key => $value) {
+ $nodePath = $path ? $path.'.'.$key : $key;
+ if ($value instanceof \ResourceBundle) {
+ $this->flatten($value, $messages, $nodePath);
+ } else {
+ $messages[$nodePath] = $value;
+ }
+ }
+
+ return $messages;
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Loader/IniFileLoader.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Loader/IniFileLoader.php
new file mode 100644
index 0000000..11d9b27
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Loader/IniFileLoader.php
@@ -0,0 +1,28 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Loader;
+
+/**
+ * IniFileLoader loads translations from an ini file.
+ *
+ * @author stealth35
+ */
+class IniFileLoader extends FileLoader
+{
+ /**
+ * {@inheritdoc}
+ */
+ protected function loadResource($resource)
+ {
+ return parse_ini_file($resource, true);
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Loader/JsonFileLoader.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Loader/JsonFileLoader.php
new file mode 100644
index 0000000..9f15dbc
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Loader/JsonFileLoader.php
@@ -0,0 +1,60 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Loader;
+
+use Symfony\Component\Translation\Exception\InvalidResourceException;
+
+/**
+ * JsonFileLoader loads translations from an json file.
+ *
+ * @author singles
+ */
+class JsonFileLoader extends FileLoader
+{
+ /**
+ * {@inheritdoc}
+ */
+ protected function loadResource($resource)
+ {
+ $messages = [];
+ if ($data = file_get_contents($resource)) {
+ $messages = json_decode($data, true);
+
+ if (0 < $errorCode = json_last_error()) {
+ throw new InvalidResourceException('Error parsing JSON: '.$this->getJSONErrorMessage($errorCode));
+ }
+ }
+
+ return $messages;
+ }
+
+ /**
+ * Translates JSON_ERROR_* constant into meaningful message.
+ */
+ private function getJSONErrorMessage(int $errorCode): string
+ {
+ switch ($errorCode) {
+ case JSON_ERROR_DEPTH:
+ return 'Maximum stack depth exceeded';
+ case JSON_ERROR_STATE_MISMATCH:
+ return 'Underflow or the modes mismatch';
+ case JSON_ERROR_CTRL_CHAR:
+ return 'Unexpected control character found';
+ case JSON_ERROR_SYNTAX:
+ return 'Syntax error, malformed JSON';
+ case JSON_ERROR_UTF8:
+ return 'Malformed UTF-8 characters, possibly incorrectly encoded';
+ default:
+ return 'Unknown error';
+ }
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Loader/LoaderInterface.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Loader/LoaderInterface.php
new file mode 100644
index 0000000..1785402
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Loader/LoaderInterface.php
@@ -0,0 +1,38 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Loader;
+
+use Symfony\Component\Translation\Exception\InvalidResourceException;
+use Symfony\Component\Translation\Exception\NotFoundResourceException;
+use Symfony\Component\Translation\MessageCatalogue;
+
+/**
+ * LoaderInterface is the interface implemented by all translation loaders.
+ *
+ * @author Fabien Potencier
+ */
+interface LoaderInterface
+{
+ /**
+ * Loads a locale.
+ *
+ * @param mixed $resource A resource
+ * @param string $locale A locale
+ * @param string $domain The domain
+ *
+ * @return MessageCatalogue A MessageCatalogue instance
+ *
+ * @throws NotFoundResourceException when the resource cannot be found
+ * @throws InvalidResourceException when the resource cannot be loaded
+ */
+ public function load($resource, $locale, $domain = 'messages');
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Loader/MoFileLoader.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Loader/MoFileLoader.php
new file mode 100644
index 0000000..d344c6e
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Loader/MoFileLoader.php
@@ -0,0 +1,140 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Loader;
+
+use Symfony\Component\Translation\Exception\InvalidResourceException;
+
+/**
+ * @copyright Copyright (c) 2010, Union of RAD http://union-of-rad.org (http://lithify.me/)
+ */
+class MoFileLoader extends FileLoader
+{
+ /**
+ * Magic used for validating the format of a MO file as well as
+ * detecting if the machine used to create that file was little endian.
+ */
+ const MO_LITTLE_ENDIAN_MAGIC = 0x950412de;
+
+ /**
+ * Magic used for validating the format of a MO file as well as
+ * detecting if the machine used to create that file was big endian.
+ */
+ const MO_BIG_ENDIAN_MAGIC = 0xde120495;
+
+ /**
+ * The size of the header of a MO file in bytes.
+ */
+ const MO_HEADER_SIZE = 28;
+
+ /**
+ * Parses machine object (MO) format, independent of the machine's endian it
+ * was created on. Both 32bit and 64bit systems are supported.
+ *
+ * {@inheritdoc}
+ */
+ protected function loadResource($resource)
+ {
+ $stream = fopen($resource, 'r');
+
+ $stat = fstat($stream);
+
+ if ($stat['size'] < self::MO_HEADER_SIZE) {
+ throw new InvalidResourceException('MO stream content has an invalid format.');
+ }
+ $magic = unpack('V1', fread($stream, 4));
+ $magic = hexdec(substr(dechex(current($magic)), -8));
+
+ if (self::MO_LITTLE_ENDIAN_MAGIC == $magic) {
+ $isBigEndian = false;
+ } elseif (self::MO_BIG_ENDIAN_MAGIC == $magic) {
+ $isBigEndian = true;
+ } else {
+ throw new InvalidResourceException('MO stream content has an invalid format.');
+ }
+
+ // formatRevision
+ $this->readLong($stream, $isBigEndian);
+ $count = $this->readLong($stream, $isBigEndian);
+ $offsetId = $this->readLong($stream, $isBigEndian);
+ $offsetTranslated = $this->readLong($stream, $isBigEndian);
+ // sizeHashes
+ $this->readLong($stream, $isBigEndian);
+ // offsetHashes
+ $this->readLong($stream, $isBigEndian);
+
+ $messages = [];
+
+ for ($i = 0; $i < $count; ++$i) {
+ $pluralId = null;
+ $translated = null;
+
+ fseek($stream, $offsetId + $i * 8);
+
+ $length = $this->readLong($stream, $isBigEndian);
+ $offset = $this->readLong($stream, $isBigEndian);
+
+ if ($length < 1) {
+ continue;
+ }
+
+ fseek($stream, $offset);
+ $singularId = fread($stream, $length);
+
+ if (false !== strpos($singularId, "\000")) {
+ list($singularId, $pluralId) = explode("\000", $singularId);
+ }
+
+ fseek($stream, $offsetTranslated + $i * 8);
+ $length = $this->readLong($stream, $isBigEndian);
+ $offset = $this->readLong($stream, $isBigEndian);
+
+ if ($length < 1) {
+ continue;
+ }
+
+ fseek($stream, $offset);
+ $translated = fread($stream, $length);
+
+ if (false !== strpos($translated, "\000")) {
+ $translated = explode("\000", $translated);
+ }
+
+ $ids = ['singular' => $singularId, 'plural' => $pluralId];
+ $item = compact('ids', 'translated');
+
+ if (!empty($item['ids']['singular'])) {
+ $id = $item['ids']['singular'];
+ if (isset($item['ids']['plural'])) {
+ $id .= '|'.$item['ids']['plural'];
+ }
+ $messages[$id] = stripcslashes(implode('|', (array) $item['translated']));
+ }
+ }
+
+ fclose($stream);
+
+ return array_filter($messages);
+ }
+
+ /**
+ * Reads an unsigned long from stream respecting endianness.
+ *
+ * @param resource $stream
+ */
+ private function readLong($stream, bool $isBigEndian): int
+ {
+ $result = unpack($isBigEndian ? 'N1' : 'V1', fread($stream, 4));
+ $result = current($result);
+
+ return (int) substr($result, -8);
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Loader/PhpFileLoader.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Loader/PhpFileLoader.php
new file mode 100644
index 0000000..0991c3d
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Loader/PhpFileLoader.php
@@ -0,0 +1,42 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Loader;
+
+/**
+ * PhpFileLoader loads translations from PHP files returning an array of translations.
+ *
+ * @author Fabien Potencier
+ */
+class PhpFileLoader extends FileLoader
+{
+ private static $cache = [];
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function loadResource($resource)
+ {
+ if ([] === self::$cache && \function_exists('opcache_invalidate') && filter_var(ini_get('opcache.enable'), FILTER_VALIDATE_BOOLEAN) && (!\in_array(\PHP_SAPI, ['cli', 'phpdbg'], true) || filter_var(ini_get('opcache.enable_cli'), FILTER_VALIDATE_BOOLEAN))) {
+ self::$cache = null;
+ }
+
+ if (null === self::$cache) {
+ return require $resource;
+ }
+
+ if (isset(self::$cache[$resource])) {
+ return self::$cache[$resource];
+ }
+
+ return self::$cache[$resource] = require $resource;
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Loader/PoFileLoader.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Loader/PoFileLoader.php
new file mode 100644
index 0000000..5e460fb
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Loader/PoFileLoader.php
@@ -0,0 +1,149 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Loader;
+
+/**
+ * @copyright Copyright (c) 2010, Union of RAD https://github.com/UnionOfRAD/lithium
+ * @copyright Copyright (c) 2012, Clemens Tolboom
+ */
+class PoFileLoader extends FileLoader
+{
+ /**
+ * Parses portable object (PO) format.
+ *
+ * From https://www.gnu.org/software/gettext/manual/gettext.html#PO-Files
+ * we should be able to parse files having:
+ *
+ * white-space
+ * # translator-comments
+ * #. extracted-comments
+ * #: reference...
+ * #, flag...
+ * #| msgid previous-untranslated-string
+ * msgid untranslated-string
+ * msgstr translated-string
+ *
+ * extra or different lines are:
+ *
+ * #| msgctxt previous-context
+ * #| msgid previous-untranslated-string
+ * msgctxt context
+ *
+ * #| msgid previous-untranslated-string-singular
+ * #| msgid_plural previous-untranslated-string-plural
+ * msgid untranslated-string-singular
+ * msgid_plural untranslated-string-plural
+ * msgstr[0] translated-string-case-0
+ * ...
+ * msgstr[N] translated-string-case-n
+ *
+ * The definition states:
+ * - white-space and comments are optional.
+ * - msgid "" that an empty singleline defines a header.
+ *
+ * This parser sacrifices some features of the reference implementation the
+ * differences to that implementation are as follows.
+ * - No support for comments spanning multiple lines.
+ * - Translator and extracted comments are treated as being the same type.
+ * - Message IDs are allowed to have other encodings as just US-ASCII.
+ *
+ * Items with an empty id are ignored.
+ *
+ * {@inheritdoc}
+ */
+ protected function loadResource($resource)
+ {
+ $stream = fopen($resource, 'r');
+
+ $defaults = [
+ 'ids' => [],
+ 'translated' => null,
+ ];
+
+ $messages = [];
+ $item = $defaults;
+ $flags = [];
+
+ while ($line = fgets($stream)) {
+ $line = trim($line);
+
+ if ('' === $line) {
+ // Whitespace indicated current item is done
+ if (!\in_array('fuzzy', $flags)) {
+ $this->addMessage($messages, $item);
+ }
+ $item = $defaults;
+ $flags = [];
+ } elseif ('#,' === substr($line, 0, 2)) {
+ $flags = array_map('trim', explode(',', substr($line, 2)));
+ } elseif ('msgid "' === substr($line, 0, 7)) {
+ // We start a new msg so save previous
+ // TODO: this fails when comments or contexts are added
+ $this->addMessage($messages, $item);
+ $item = $defaults;
+ $item['ids']['singular'] = substr($line, 7, -1);
+ } elseif ('msgstr "' === substr($line, 0, 8)) {
+ $item['translated'] = substr($line, 8, -1);
+ } elseif ('"' === $line[0]) {
+ $continues = isset($item['translated']) ? 'translated' : 'ids';
+
+ if (\is_array($item[$continues])) {
+ end($item[$continues]);
+ $item[$continues][key($item[$continues])] .= substr($line, 1, -1);
+ } else {
+ $item[$continues] .= substr($line, 1, -1);
+ }
+ } elseif ('msgid_plural "' === substr($line, 0, 14)) {
+ $item['ids']['plural'] = substr($line, 14, -1);
+ } elseif ('msgstr[' === substr($line, 0, 7)) {
+ $size = strpos($line, ']');
+ $item['translated'][(int) substr($line, 7, 1)] = substr($line, $size + 3, -1);
+ }
+ }
+ // save last item
+ if (!\in_array('fuzzy', $flags)) {
+ $this->addMessage($messages, $item);
+ }
+ fclose($stream);
+
+ return $messages;
+ }
+
+ /**
+ * Save a translation item to the messages.
+ *
+ * A .po file could contain by error missing plural indexes. We need to
+ * fix these before saving them.
+ */
+ private function addMessage(array &$messages, array $item)
+ {
+ if (!empty($item['ids']['singular'])) {
+ $id = stripcslashes($item['ids']['singular']);
+ if (isset($item['ids']['plural'])) {
+ $id .= '|'.stripcslashes($item['ids']['plural']);
+ }
+
+ $translated = (array) $item['translated'];
+ // PO are by definition indexed so sort by index.
+ ksort($translated);
+ // Make sure every index is filled.
+ end($translated);
+ $count = key($translated);
+ // Fill missing spots with '-'.
+ $empties = array_fill(0, $count + 1, '-');
+ $translated += $empties;
+ ksort($translated);
+
+ $messages[$id] = stripcslashes(implode('|', $translated));
+ }
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Loader/QtFileLoader.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Loader/QtFileLoader.php
new file mode 100644
index 0000000..2d4a4c0
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Loader/QtFileLoader.php
@@ -0,0 +1,77 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Loader;
+
+use Symfony\Component\Config\Resource\FileResource;
+use Symfony\Component\Config\Util\XmlUtils;
+use Symfony\Component\Translation\Exception\InvalidResourceException;
+use Symfony\Component\Translation\Exception\NotFoundResourceException;
+use Symfony\Component\Translation\MessageCatalogue;
+
+/**
+ * QtFileLoader loads translations from QT Translations XML files.
+ *
+ * @author Benjamin Eberlei
+ */
+class QtFileLoader implements LoaderInterface
+{
+ /**
+ * {@inheritdoc}
+ */
+ public function load($resource, $locale, $domain = 'messages')
+ {
+ if (!stream_is_local($resource)) {
+ throw new InvalidResourceException(sprintf('This is not a local file "%s".', $resource));
+ }
+
+ if (!file_exists($resource)) {
+ throw new NotFoundResourceException(sprintf('File "%s" not found.', $resource));
+ }
+
+ try {
+ $dom = XmlUtils::loadFile($resource);
+ } catch (\InvalidArgumentException $e) {
+ throw new InvalidResourceException(sprintf('Unable to load "%s".', $resource), $e->getCode(), $e);
+ }
+
+ $internalErrors = libxml_use_internal_errors(true);
+ libxml_clear_errors();
+
+ $xpath = new \DOMXPath($dom);
+ $nodes = $xpath->evaluate('//TS/context/name[text()="'.$domain.'"]');
+
+ $catalogue = new MessageCatalogue($locale);
+ if (1 == $nodes->length) {
+ $translations = $nodes->item(0)->nextSibling->parentNode->parentNode->getElementsByTagName('message');
+ foreach ($translations as $translation) {
+ $translationValue = (string) $translation->getElementsByTagName('translation')->item(0)->nodeValue;
+
+ if (!empty($translationValue)) {
+ $catalogue->set(
+ (string) $translation->getElementsByTagName('source')->item(0)->nodeValue,
+ $translationValue,
+ $domain
+ );
+ }
+ $translation = $translation->nextSibling;
+ }
+
+ if (class_exists('Symfony\Component\Config\Resource\FileResource')) {
+ $catalogue->addResource(new FileResource($resource));
+ }
+ }
+
+ libxml_use_internal_errors($internalErrors);
+
+ return $catalogue;
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Loader/XliffFileLoader.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Loader/XliffFileLoader.php
new file mode 100644
index 0000000..f9056d9
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Loader/XliffFileLoader.php
@@ -0,0 +1,208 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Loader;
+
+use Symfony\Component\Config\Resource\FileResource;
+use Symfony\Component\Config\Util\XmlUtils;
+use Symfony\Component\Translation\Exception\InvalidResourceException;
+use Symfony\Component\Translation\Exception\NotFoundResourceException;
+use Symfony\Component\Translation\MessageCatalogue;
+use Symfony\Component\Translation\Util\XliffUtils;
+
+/**
+ * XliffFileLoader loads translations from XLIFF files.
+ *
+ * @author Fabien Potencier
+ */
+class XliffFileLoader implements LoaderInterface
+{
+ /**
+ * {@inheritdoc}
+ */
+ public function load($resource, $locale, $domain = 'messages')
+ {
+ if (!stream_is_local($resource)) {
+ throw new InvalidResourceException(sprintf('This is not a local file "%s".', $resource));
+ }
+
+ if (!file_exists($resource)) {
+ throw new NotFoundResourceException(sprintf('File "%s" not found.', $resource));
+ }
+
+ $catalogue = new MessageCatalogue($locale);
+ $this->extract($resource, $catalogue, $domain);
+
+ if (class_exists('Symfony\Component\Config\Resource\FileResource')) {
+ $catalogue->addResource(new FileResource($resource));
+ }
+
+ return $catalogue;
+ }
+
+ private function extract($resource, MessageCatalogue $catalogue, string $domain)
+ {
+ try {
+ $dom = XmlUtils::loadFile($resource);
+ } catch (\InvalidArgumentException $e) {
+ throw new InvalidResourceException(sprintf('Unable to load "%s": ', $resource).$e->getMessage(), $e->getCode(), $e);
+ }
+
+ $xliffVersion = XliffUtils::getVersionNumber($dom);
+ if ($errors = XliffUtils::validateSchema($dom)) {
+ throw new InvalidResourceException(sprintf('Invalid resource provided: "%s"; Errors: '.XliffUtils::getErrorsAsString($errors), $resource));
+ }
+
+ if ('1.2' === $xliffVersion) {
+ $this->extractXliff1($dom, $catalogue, $domain);
+ }
+
+ if ('2.0' === $xliffVersion) {
+ $this->extractXliff2($dom, $catalogue, $domain);
+ }
+ }
+
+ /**
+ * Extract messages and metadata from DOMDocument into a MessageCatalogue.
+ */
+ private function extractXliff1(\DOMDocument $dom, MessageCatalogue $catalogue, string $domain)
+ {
+ $xml = simplexml_import_dom($dom);
+ $encoding = strtoupper($dom->encoding);
+
+ $namespace = 'urn:oasis:names:tc:xliff:document:1.2';
+ $xml->registerXPathNamespace('xliff', $namespace);
+
+ foreach ($xml->xpath('//xliff:file') as $file) {
+ $fileAttributes = $file->attributes();
+
+ $file->registerXPathNamespace('xliff', $namespace);
+
+ foreach ($file->xpath('.//xliff:trans-unit') as $translation) {
+ $attributes = $translation->attributes();
+
+ if (!(isset($attributes['resname']) || isset($translation->source))) {
+ continue;
+ }
+
+ $source = isset($attributes['resname']) && $attributes['resname'] ? $attributes['resname'] : $translation->source;
+ // If the xlf file has another encoding specified, try to convert it because
+ // simple_xml will always return utf-8 encoded values
+ $target = $this->utf8ToCharset((string) ($translation->target ?? $translation->source), $encoding);
+
+ $catalogue->set((string) $source, $target, $domain);
+
+ $metadata = [
+ 'source' => (string) $translation->source,
+ 'file' => [
+ 'original' => (string) $fileAttributes['original'],
+ ],
+ ];
+ if ($notes = $this->parseNotesMetadata($translation->note, $encoding)) {
+ $metadata['notes'] = $notes;
+ }
+
+ if (isset($translation->target) && $translation->target->attributes()) {
+ $metadata['target-attributes'] = [];
+ foreach ($translation->target->attributes() as $key => $value) {
+ $metadata['target-attributes'][$key] = (string) $value;
+ }
+ }
+
+ if (isset($attributes['id'])) {
+ $metadata['id'] = (string) $attributes['id'];
+ }
+
+ $catalogue->setMetadata((string) $source, $metadata, $domain);
+ }
+ }
+ }
+
+ private function extractXliff2(\DOMDocument $dom, MessageCatalogue $catalogue, string $domain)
+ {
+ $xml = simplexml_import_dom($dom);
+ $encoding = strtoupper($dom->encoding);
+
+ $xml->registerXPathNamespace('xliff', 'urn:oasis:names:tc:xliff:document:2.0');
+
+ foreach ($xml->xpath('//xliff:unit') as $unit) {
+ foreach ($unit->segment as $segment) {
+ $source = $segment->source;
+
+ // If the xlf file has another encoding specified, try to convert it because
+ // simple_xml will always return utf-8 encoded values
+ $target = $this->utf8ToCharset((string) (isset($segment->target) ? $segment->target : $source), $encoding);
+
+ $catalogue->set((string) $source, $target, $domain);
+
+ $metadata = [];
+ if (isset($segment->target) && $segment->target->attributes()) {
+ $metadata['target-attributes'] = [];
+ foreach ($segment->target->attributes() as $key => $value) {
+ $metadata['target-attributes'][$key] = (string) $value;
+ }
+ }
+
+ if (isset($unit->notes)) {
+ $metadata['notes'] = [];
+ foreach ($unit->notes->note as $noteNode) {
+ $note = [];
+ foreach ($noteNode->attributes() as $key => $value) {
+ $note[$key] = (string) $value;
+ }
+ $note['content'] = (string) $noteNode;
+ $metadata['notes'][] = $note;
+ }
+ }
+
+ $catalogue->setMetadata((string) $source, $metadata, $domain);
+ }
+ }
+ }
+
+ /**
+ * Convert a UTF8 string to the specified encoding.
+ */
+ private function utf8ToCharset(string $content, string $encoding = null): string
+ {
+ if ('UTF-8' !== $encoding && !empty($encoding)) {
+ return mb_convert_encoding($content, $encoding, 'UTF-8');
+ }
+
+ return $content;
+ }
+
+ private function parseNotesMetadata(\SimpleXMLElement $noteElement = null, string $encoding = null): array
+ {
+ $notes = [];
+
+ if (null === $noteElement) {
+ return $notes;
+ }
+
+ /** @var \SimpleXMLElement $xmlNote */
+ foreach ($noteElement as $xmlNote) {
+ $noteAttributes = $xmlNote->attributes();
+ $note = ['content' => $this->utf8ToCharset((string) $xmlNote, $encoding)];
+ if (isset($noteAttributes['priority'])) {
+ $note['priority'] = (int) $noteAttributes['priority'];
+ }
+
+ if (isset($noteAttributes['from'])) {
+ $note['from'] = (string) $noteAttributes['from'];
+ }
+
+ $notes[] = $note;
+ }
+
+ return $notes;
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Loader/YamlFileLoader.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Loader/YamlFileLoader.php
new file mode 100644
index 0000000..e4bee0c
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Loader/YamlFileLoader.php
@@ -0,0 +1,54 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Loader;
+
+use Symfony\Component\Translation\Exception\InvalidResourceException;
+use Symfony\Component\Translation\Exception\LogicException;
+use Symfony\Component\Yaml\Exception\ParseException;
+use Symfony\Component\Yaml\Parser as YamlParser;
+use Symfony\Component\Yaml\Yaml;
+
+/**
+ * YamlFileLoader loads translations from Yaml files.
+ *
+ * @author Fabien Potencier
+ */
+class YamlFileLoader extends FileLoader
+{
+ private $yamlParser;
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function loadResource($resource)
+ {
+ if (null === $this->yamlParser) {
+ if (!class_exists('Symfony\Component\Yaml\Parser')) {
+ throw new LogicException('Loading translations from the YAML format requires the Symfony Yaml component.');
+ }
+
+ $this->yamlParser = new YamlParser();
+ }
+
+ try {
+ $messages = $this->yamlParser->parseFile($resource, Yaml::PARSE_CONSTANT);
+ } catch (ParseException $e) {
+ throw new InvalidResourceException(sprintf('The file "%s" does not contain valid YAML: ', $resource).$e->getMessage(), 0, $e);
+ }
+
+ if (null !== $messages && !\is_array($messages)) {
+ throw new InvalidResourceException(sprintf('Unable to load file "%s".', $resource));
+ }
+
+ return $messages ?: [];
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/LoggingTranslator.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/LoggingTranslator.php
new file mode 100644
index 0000000..a001192
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/LoggingTranslator.php
@@ -0,0 +1,152 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation;
+
+use Psr\Log\LoggerInterface;
+use Symfony\Component\Translation\Exception\InvalidArgumentException;
+use Symfony\Component\Translation\TranslatorInterface as LegacyTranslatorInterface;
+use Symfony\Contracts\Translation\LocaleAwareInterface;
+use Symfony\Contracts\Translation\TranslatorInterface;
+
+/**
+ * @author Abdellatif Ait boudad
+ */
+class LoggingTranslator implements TranslatorInterface, LegacyTranslatorInterface, TranslatorBagInterface
+{
+ /**
+ * @var TranslatorInterface|TranslatorBagInterface
+ */
+ private $translator;
+
+ private $logger;
+
+ /**
+ * @param TranslatorInterface $translator The translator must implement TranslatorBagInterface
+ */
+ public function __construct($translator, LoggerInterface $logger)
+ {
+ if (!$translator instanceof LegacyTranslatorInterface && !$translator instanceof TranslatorInterface) {
+ throw new \TypeError(sprintf('Argument 1 passed to "%s()" must be an instance of "%s", "%s" given.', __METHOD__, TranslatorInterface::class, \is_object($translator) ? \get_class($translator) : \gettype($translator)));
+ }
+ if (!$translator instanceof TranslatorBagInterface || !$translator instanceof LocaleAwareInterface) {
+ throw new InvalidArgumentException(sprintf('The Translator "%s" must implement TranslatorInterface, TranslatorBagInterface and LocaleAwareInterface.', \get_class($translator)));
+ }
+
+ $this->translator = $translator;
+ $this->logger = $logger;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function trans($id, array $parameters = [], $domain = null, $locale = null)
+ {
+ $trans = $this->translator->trans($id, $parameters, $domain, $locale);
+ $this->log($id, $domain, $locale);
+
+ return $trans;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @deprecated since Symfony 4.2, use the trans() method instead with a %count% parameter
+ */
+ public function transChoice($id, $number, array $parameters = [], $domain = null, $locale = null)
+ {
+ @trigger_error(sprintf('The "%s()" method is deprecated since Symfony 4.2, use the trans() one instead with a "%%count%%" parameter.', __METHOD__), E_USER_DEPRECATED);
+
+ if ($this->translator instanceof TranslatorInterface) {
+ $trans = $this->translator->trans($id, ['%count%' => $number] + $parameters, $domain, $locale);
+ } else {
+ $trans = $this->translator->transChoice($id, $number, $parameters, $domain, $locale);
+ }
+
+ $this->log($id, $domain, $locale);
+
+ return $trans;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function setLocale($locale)
+ {
+ $prev = $this->translator->getLocale();
+ $this->translator->setLocale($locale);
+ if ($prev === $locale) {
+ return;
+ }
+
+ $this->logger->debug(sprintf('The locale of the translator has changed from "%s" to "%s".', $prev, $locale));
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getLocale()
+ {
+ return $this->translator->getLocale();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getCatalogue($locale = null)
+ {
+ return $this->translator->getCatalogue($locale);
+ }
+
+ /**
+ * Gets the fallback locales.
+ *
+ * @return array The fallback locales
+ */
+ public function getFallbackLocales()
+ {
+ if ($this->translator instanceof Translator || method_exists($this->translator, 'getFallbackLocales')) {
+ return $this->translator->getFallbackLocales();
+ }
+
+ return [];
+ }
+
+ /**
+ * Passes through all unknown calls onto the translator object.
+ */
+ public function __call($method, $args)
+ {
+ return $this->translator->{$method}(...$args);
+ }
+
+ /**
+ * Logs for missing translations.
+ */
+ private function log(?string $id, ?string $domain, ?string $locale)
+ {
+ if (null === $domain) {
+ $domain = 'messages';
+ }
+
+ $id = (string) $id;
+ $catalogue = $this->translator->getCatalogue($locale);
+ if ($catalogue->defines($id, $domain)) {
+ return;
+ }
+
+ if ($catalogue->has($id, $domain)) {
+ $this->logger->debug('Translation use fallback catalogue.', ['id' => $id, 'domain' => $domain, 'locale' => $catalogue->getLocale()]);
+ } else {
+ $this->logger->warning('Translation not found.', ['id' => $id, 'domain' => $domain, 'locale' => $catalogue->getLocale()]);
+ }
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/MessageCatalogue.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/MessageCatalogue.php
new file mode 100644
index 0000000..75ec5b4
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/MessageCatalogue.php
@@ -0,0 +1,322 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation;
+
+use Symfony\Component\Config\Resource\ResourceInterface;
+use Symfony\Component\Translation\Exception\LogicException;
+
+/**
+ * @author Fabien Potencier
+ */
+class MessageCatalogue implements MessageCatalogueInterface, MetadataAwareInterface
+{
+ private $messages = [];
+ private $metadata = [];
+ private $resources = [];
+ private $locale;
+ private $fallbackCatalogue;
+ private $parent;
+
+ /**
+ * @param string $locale The locale
+ * @param array $messages An array of messages classified by domain
+ */
+ public function __construct(?string $locale, array $messages = [])
+ {
+ if (null === $locale) {
+ @trigger_error(sprintf('Passing "null" to the first argument of the "%s" method has been deprecated since Symfony 4.4 and will throw an error in 5.0.', __METHOD__), E_USER_DEPRECATED);
+ }
+
+ $this->locale = $locale;
+ $this->messages = $messages;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getLocale()
+ {
+ return $this->locale;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getDomains()
+ {
+ $domains = [];
+ $suffixLength = \strlen(self::INTL_DOMAIN_SUFFIX);
+
+ foreach ($this->messages as $domain => $messages) {
+ if (\strlen($domain) > $suffixLength && false !== $i = strpos($domain, self::INTL_DOMAIN_SUFFIX, -$suffixLength)) {
+ $domain = substr($domain, 0, $i);
+ }
+ $domains[$domain] = $domain;
+ }
+
+ return array_values($domains);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function all($domain = null)
+ {
+ if (null !== $domain) {
+ // skip messages merge if intl-icu requested explicitly
+ if (false !== strpos($domain, self::INTL_DOMAIN_SUFFIX)) {
+ return $this->messages[$domain] ?? [];
+ }
+
+ return ($this->messages[$domain.self::INTL_DOMAIN_SUFFIX] ?? []) + ($this->messages[$domain] ?? []);
+ }
+
+ $allMessages = [];
+ $suffixLength = \strlen(self::INTL_DOMAIN_SUFFIX);
+
+ foreach ($this->messages as $domain => $messages) {
+ if (\strlen($domain) > $suffixLength && false !== $i = strpos($domain, self::INTL_DOMAIN_SUFFIX, -$suffixLength)) {
+ $domain = substr($domain, 0, $i);
+ $allMessages[$domain] = $messages + ($allMessages[$domain] ?? []);
+ } else {
+ $allMessages[$domain] = ($allMessages[$domain] ?? []) + $messages;
+ }
+ }
+
+ return $allMessages;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function set($id, $translation, $domain = 'messages')
+ {
+ $this->add([$id => $translation], $domain);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function has($id, $domain = 'messages')
+ {
+ if (isset($this->messages[$domain][$id]) || isset($this->messages[$domain.self::INTL_DOMAIN_SUFFIX][$id])) {
+ return true;
+ }
+
+ if (null !== $this->fallbackCatalogue) {
+ return $this->fallbackCatalogue->has($id, $domain);
+ }
+
+ return false;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function defines($id, $domain = 'messages')
+ {
+ return isset($this->messages[$domain][$id]) || isset($this->messages[$domain.self::INTL_DOMAIN_SUFFIX][$id]);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function get($id, $domain = 'messages')
+ {
+ if (isset($this->messages[$domain.self::INTL_DOMAIN_SUFFIX][$id])) {
+ return $this->messages[$domain.self::INTL_DOMAIN_SUFFIX][$id];
+ }
+
+ if (isset($this->messages[$domain][$id])) {
+ return $this->messages[$domain][$id];
+ }
+
+ if (null !== $this->fallbackCatalogue) {
+ return $this->fallbackCatalogue->get($id, $domain);
+ }
+
+ return $id;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function replace($messages, $domain = 'messages')
+ {
+ unset($this->messages[$domain], $this->messages[$domain.self::INTL_DOMAIN_SUFFIX]);
+
+ $this->add($messages, $domain);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function add($messages, $domain = 'messages')
+ {
+ if (!isset($this->messages[$domain])) {
+ $this->messages[$domain] = [];
+ }
+ $intlDomain = $domain;
+ $suffixLength = \strlen(self::INTL_DOMAIN_SUFFIX);
+ if (\strlen($domain) > $suffixLength && false !== strpos($domain, self::INTL_DOMAIN_SUFFIX, -$suffixLength)) {
+ $intlDomain .= self::INTL_DOMAIN_SUFFIX;
+ }
+ foreach ($messages as $id => $message) {
+ if (isset($this->messages[$intlDomain]) && \array_key_exists($id, $this->messages[$intlDomain])) {
+ $this->messages[$intlDomain][$id] = $message;
+ } else {
+ $this->messages[$domain][$id] = $message;
+ }
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function addCatalogue(MessageCatalogueInterface $catalogue)
+ {
+ if ($catalogue->getLocale() !== $this->locale) {
+ throw new LogicException(sprintf('Cannot add a catalogue for locale "%s" as the current locale for this catalogue is "%s".', $catalogue->getLocale(), $this->locale));
+ }
+
+ foreach ($catalogue->all() as $domain => $messages) {
+ if ($intlMessages = $catalogue->all($domain.self::INTL_DOMAIN_SUFFIX)) {
+ $this->add($intlMessages, $domain.self::INTL_DOMAIN_SUFFIX);
+ $messages = array_diff_key($messages, $intlMessages);
+ }
+ $this->add($messages, $domain);
+ }
+
+ foreach ($catalogue->getResources() as $resource) {
+ $this->addResource($resource);
+ }
+
+ if ($catalogue instanceof MetadataAwareInterface) {
+ $metadata = $catalogue->getMetadata('', '');
+ $this->addMetadata($metadata);
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function addFallbackCatalogue(MessageCatalogueInterface $catalogue)
+ {
+ // detect circular references
+ $c = $catalogue;
+ while ($c = $c->getFallbackCatalogue()) {
+ if ($c->getLocale() === $this->getLocale()) {
+ throw new LogicException(sprintf('Circular reference detected when adding a fallback catalogue for locale "%s".', $catalogue->getLocale()));
+ }
+ }
+
+ $c = $this;
+ do {
+ if ($c->getLocale() === $catalogue->getLocale()) {
+ throw new LogicException(sprintf('Circular reference detected when adding a fallback catalogue for locale "%s".', $catalogue->getLocale()));
+ }
+
+ foreach ($catalogue->getResources() as $resource) {
+ $c->addResource($resource);
+ }
+ } while ($c = $c->parent);
+
+ $catalogue->parent = $this;
+ $this->fallbackCatalogue = $catalogue;
+
+ foreach ($catalogue->getResources() as $resource) {
+ $this->addResource($resource);
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getFallbackCatalogue()
+ {
+ return $this->fallbackCatalogue;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getResources()
+ {
+ return array_values($this->resources);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function addResource(ResourceInterface $resource)
+ {
+ $this->resources[$resource->__toString()] = $resource;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getMetadata($key = '', $domain = 'messages')
+ {
+ if ('' == $domain) {
+ return $this->metadata;
+ }
+
+ if (isset($this->metadata[$domain])) {
+ if ('' == $key) {
+ return $this->metadata[$domain];
+ }
+
+ if (isset($this->metadata[$domain][$key])) {
+ return $this->metadata[$domain][$key];
+ }
+ }
+
+ return null;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function setMetadata($key, $value, $domain = 'messages')
+ {
+ $this->metadata[$domain][$key] = $value;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function deleteMetadata($key = '', $domain = 'messages')
+ {
+ if ('' == $domain) {
+ $this->metadata = [];
+ } elseif ('' == $key) {
+ unset($this->metadata[$domain]);
+ } else {
+ unset($this->metadata[$domain][$key]);
+ }
+ }
+
+ /**
+ * Adds current values with the new values.
+ *
+ * @param array $values Values to add
+ */
+ private function addMetadata(array $values)
+ {
+ foreach ($values as $domain => $keys) {
+ foreach ($keys as $key => $value) {
+ $this->setMetadata($key, $value, $domain);
+ }
+ }
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/MessageCatalogueInterface.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/MessageCatalogueInterface.php
new file mode 100644
index 0000000..f3d3f5e
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/MessageCatalogueInterface.php
@@ -0,0 +1,138 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation;
+
+use Symfony\Component\Config\Resource\ResourceInterface;
+
+/**
+ * MessageCatalogueInterface.
+ *
+ * @author Fabien Potencier
+ */
+interface MessageCatalogueInterface
+{
+ const INTL_DOMAIN_SUFFIX = '+intl-icu';
+
+ /**
+ * Gets the catalogue locale.
+ *
+ * @return string The locale
+ */
+ public function getLocale();
+
+ /**
+ * Gets the domains.
+ *
+ * @return array An array of domains
+ */
+ public function getDomains();
+
+ /**
+ * Gets the messages within a given domain.
+ *
+ * If $domain is null, it returns all messages.
+ *
+ * @param string $domain The domain name
+ *
+ * @return array An array of messages
+ */
+ public function all($domain = null);
+
+ /**
+ * Sets a message translation.
+ *
+ * @param string $id The message id
+ * @param string $translation The messages translation
+ * @param string $domain The domain name
+ */
+ public function set($id, $translation, $domain = 'messages');
+
+ /**
+ * Checks if a message has a translation.
+ *
+ * @param string $id The message id
+ * @param string $domain The domain name
+ *
+ * @return bool true if the message has a translation, false otherwise
+ */
+ public function has($id, $domain = 'messages');
+
+ /**
+ * Checks if a message has a translation (it does not take into account the fallback mechanism).
+ *
+ * @param string $id The message id
+ * @param string $domain The domain name
+ *
+ * @return bool true if the message has a translation, false otherwise
+ */
+ public function defines($id, $domain = 'messages');
+
+ /**
+ * Gets a message translation.
+ *
+ * @param string $id The message id
+ * @param string $domain The domain name
+ *
+ * @return string The message translation
+ */
+ public function get($id, $domain = 'messages');
+
+ /**
+ * Sets translations for a given domain.
+ *
+ * @param array $messages An array of translations
+ * @param string $domain The domain name
+ */
+ public function replace($messages, $domain = 'messages');
+
+ /**
+ * Adds translations for a given domain.
+ *
+ * @param array $messages An array of translations
+ * @param string $domain The domain name
+ */
+ public function add($messages, $domain = 'messages');
+
+ /**
+ * Merges translations from the given Catalogue into the current one.
+ *
+ * The two catalogues must have the same locale.
+ */
+ public function addCatalogue(self $catalogue);
+
+ /**
+ * Merges translations from the given Catalogue into the current one
+ * only when the translation does not exist.
+ *
+ * This is used to provide default translations when they do not exist for the current locale.
+ */
+ public function addFallbackCatalogue(self $catalogue);
+
+ /**
+ * Gets the fallback catalogue.
+ *
+ * @return self|null A MessageCatalogueInterface instance or null when no fallback has been set
+ */
+ public function getFallbackCatalogue();
+
+ /**
+ * Returns an array of resources loaded to build this collection.
+ *
+ * @return ResourceInterface[] An array of resources
+ */
+ public function getResources();
+
+ /**
+ * Adds a resource for this collection.
+ */
+ public function addResource(ResourceInterface $resource);
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/MessageSelector.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/MessageSelector.php
new file mode 100644
index 0000000..0f0febb
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/MessageSelector.php
@@ -0,0 +1,98 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation;
+
+@trigger_error(sprintf('The "%s" class is deprecated since Symfony 4.2, use IdentityTranslator instead.', MessageSelector::class), E_USER_DEPRECATED);
+
+use Symfony\Component\Translation\Exception\InvalidArgumentException;
+
+/**
+ * MessageSelector.
+ *
+ * @author Fabien Potencier
+ * @author Bernhard Schussek
+ *
+ * @deprecated since Symfony 4.2, use IdentityTranslator instead.
+ */
+class MessageSelector
+{
+ /**
+ * Given a message with different plural translations separated by a
+ * pipe (|), this method returns the correct portion of the message based
+ * on the given number, locale and the pluralization rules in the message
+ * itself.
+ *
+ * The message supports two different types of pluralization rules:
+ *
+ * interval: {0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples
+ * indexed: There is one apple|There are %count% apples
+ *
+ * The indexed solution can also contain labels (e.g. one: There is one apple).
+ * This is purely for making the translations more clear - it does not
+ * affect the functionality.
+ *
+ * The two methods can also be mixed:
+ * {0} There are no apples|one: There is one apple|more: There are %count% apples
+ *
+ * @param string $message The message being translated
+ * @param int|float $number The number of items represented for the message
+ * @param string $locale The locale to use for choosing
+ *
+ * @return string
+ *
+ * @throws InvalidArgumentException
+ */
+ public function choose($message, $number, $locale)
+ {
+ $parts = [];
+ if (preg_match('/^\|++$/', $message)) {
+ $parts = explode('|', $message);
+ } elseif (preg_match_all('/(?:\|\||[^\|])++/', $message, $matches)) {
+ $parts = $matches[0];
+ }
+
+ $explicitRules = [];
+ $standardRules = [];
+ foreach ($parts as $part) {
+ $part = trim(str_replace('||', '|', $part));
+
+ if (preg_match('/^(?P'.Interval::getIntervalRegexp().')\s*(?P.*?)$/xs', $part, $matches)) {
+ $explicitRules[$matches['interval']] = $matches['message'];
+ } elseif (preg_match('/^\w+\:\s*(.*?)$/', $part, $matches)) {
+ $standardRules[] = $matches[1];
+ } else {
+ $standardRules[] = $part;
+ }
+ }
+
+ // try to match an explicit rule, then fallback to the standard ones
+ foreach ($explicitRules as $interval => $m) {
+ if (Interval::test($number, $interval)) {
+ return $m;
+ }
+ }
+
+ $position = PluralizationRules::get($number, $locale);
+
+ if (!isset($standardRules[$position])) {
+ // when there's exactly one rule given, and that rule is a standard
+ // rule, use this rule
+ if (1 === \count($parts) && isset($standardRules[0])) {
+ return $standardRules[0];
+ }
+
+ throw new InvalidArgumentException(sprintf('Unable to choose a translation for "%s" with locale "%s" for value "%d". Double check that this translation has the correct plural options (e.g. "There is one apple|There are %%count%% apples").', $message, $locale, $number));
+ }
+
+ return $standardRules[$position];
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/MetadataAwareInterface.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/MetadataAwareInterface.php
new file mode 100644
index 0000000..e93c6fb
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/MetadataAwareInterface.php
@@ -0,0 +1,54 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation;
+
+/**
+ * MetadataAwareInterface.
+ *
+ * @author Fabien Potencier
+ */
+interface MetadataAwareInterface
+{
+ /**
+ * Gets metadata for the given domain and key.
+ *
+ * Passing an empty domain will return an array with all metadata indexed by
+ * domain and then by key. Passing an empty key will return an array with all
+ * metadata for the given domain.
+ *
+ * @param string $key The key
+ * @param string $domain The domain name
+ *
+ * @return mixed The value that was set or an array with the domains/keys or null
+ */
+ public function getMetadata($key = '', $domain = 'messages');
+
+ /**
+ * Adds metadata to a message domain.
+ *
+ * @param string $key The key
+ * @param mixed $value The value
+ * @param string $domain The domain name
+ */
+ public function setMetadata($key, $value, $domain = 'messages');
+
+ /**
+ * Deletes metadata for the given key and domain.
+ *
+ * Passing an empty domain will delete all metadata. Passing an empty key will
+ * delete all metadata for the given domain.
+ *
+ * @param string $key The key
+ * @param string $domain The domain name
+ */
+ public function deleteMetadata($key = '', $domain = 'messages');
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/PluralizationRules.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/PluralizationRules.php
new file mode 100644
index 0000000..77c2760
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/PluralizationRules.php
@@ -0,0 +1,218 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation;
+
+/**
+ * Returns the plural rules for a given locale.
+ *
+ * @author Fabien Potencier
+ *
+ * @deprecated since Symfony 4.2, use IdentityTranslator instead
+ */
+class PluralizationRules
+{
+ private static $rules = [];
+
+ /**
+ * Returns the plural position to use for the given locale and number.
+ *
+ * @param int $number The number
+ * @param string $locale The locale
+ *
+ * @return int The plural position
+ */
+ public static function get($number, $locale/*, bool $triggerDeprecation = true*/)
+ {
+ if (3 > \func_num_args() || func_get_arg(2)) {
+ @trigger_error(sprintf('The "%s" class is deprecated since Symfony 4.2.', __CLASS__), E_USER_DEPRECATED);
+ }
+
+ if ('pt_BR' === $locale) {
+ // temporary set a locale for brazilian
+ $locale = 'xbr';
+ }
+
+ if (\strlen($locale) > 3) {
+ $locale = substr($locale, 0, -\strlen(strrchr($locale, '_')));
+ }
+
+ if (isset(self::$rules[$locale])) {
+ $return = self::$rules[$locale]($number);
+
+ if (!\is_int($return) || $return < 0) {
+ return 0;
+ }
+
+ return $return;
+ }
+
+ /*
+ * The plural rules are derived from code of the Zend Framework (2010-09-25),
+ * which is subject to the new BSD license (http://framework.zend.com/license/new-bsd).
+ * Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
+ */
+ switch ($locale) {
+ case 'az':
+ case 'bo':
+ case 'dz':
+ case 'id':
+ case 'ja':
+ case 'jv':
+ case 'ka':
+ case 'km':
+ case 'kn':
+ case 'ko':
+ case 'ms':
+ case 'th':
+ case 'tr':
+ case 'vi':
+ case 'zh':
+ return 0;
+
+ case 'af':
+ case 'bn':
+ case 'bg':
+ case 'ca':
+ case 'da':
+ case 'de':
+ case 'el':
+ case 'en':
+ case 'eo':
+ case 'es':
+ case 'et':
+ case 'eu':
+ case 'fa':
+ case 'fi':
+ case 'fo':
+ case 'fur':
+ case 'fy':
+ case 'gl':
+ case 'gu':
+ case 'ha':
+ case 'he':
+ case 'hu':
+ case 'is':
+ case 'it':
+ case 'ku':
+ case 'lb':
+ case 'ml':
+ case 'mn':
+ case 'mr':
+ case 'nah':
+ case 'nb':
+ case 'ne':
+ case 'nl':
+ case 'nn':
+ case 'no':
+ case 'oc':
+ case 'om':
+ case 'or':
+ case 'pa':
+ case 'pap':
+ case 'ps':
+ case 'pt':
+ case 'so':
+ case 'sq':
+ case 'sv':
+ case 'sw':
+ case 'ta':
+ case 'te':
+ case 'tk':
+ case 'ur':
+ case 'zu':
+ return (1 == $number) ? 0 : 1;
+
+ case 'am':
+ case 'bh':
+ case 'fil':
+ case 'fr':
+ case 'gun':
+ case 'hi':
+ case 'hy':
+ case 'ln':
+ case 'mg':
+ case 'nso':
+ case 'xbr':
+ case 'ti':
+ case 'wa':
+ return ((0 == $number) || (1 == $number)) ? 0 : 1;
+
+ case 'be':
+ case 'bs':
+ case 'hr':
+ case 'ru':
+ case 'sh':
+ case 'sr':
+ case 'uk':
+ return ((1 == $number % 10) && (11 != $number % 100)) ? 0 : ((($number % 10 >= 2) && ($number % 10 <= 4) && (($number % 100 < 10) || ($number % 100 >= 20))) ? 1 : 2);
+
+ case 'cs':
+ case 'sk':
+ return (1 == $number) ? 0 : ((($number >= 2) && ($number <= 4)) ? 1 : 2);
+
+ case 'ga':
+ return (1 == $number) ? 0 : ((2 == $number) ? 1 : 2);
+
+ case 'lt':
+ return ((1 == $number % 10) && (11 != $number % 100)) ? 0 : ((($number % 10 >= 2) && (($number % 100 < 10) || ($number % 100 >= 20))) ? 1 : 2);
+
+ case 'sl':
+ return (1 == $number % 100) ? 0 : ((2 == $number % 100) ? 1 : (((3 == $number % 100) || (4 == $number % 100)) ? 2 : 3));
+
+ case 'mk':
+ return (1 == $number % 10) ? 0 : 1;
+
+ case 'mt':
+ return (1 == $number) ? 0 : (((0 == $number) || (($number % 100 > 1) && ($number % 100 < 11))) ? 1 : ((($number % 100 > 10) && ($number % 100 < 20)) ? 2 : 3));
+
+ case 'lv':
+ return (0 == $number) ? 0 : (((1 == $number % 10) && (11 != $number % 100)) ? 1 : 2);
+
+ case 'pl':
+ return (1 == $number) ? 0 : ((($number % 10 >= 2) && ($number % 10 <= 4) && (($number % 100 < 12) || ($number % 100 > 14))) ? 1 : 2);
+
+ case 'cy':
+ return (1 == $number) ? 0 : ((2 == $number) ? 1 : (((8 == $number) || (11 == $number)) ? 2 : 3));
+
+ case 'ro':
+ return (1 == $number) ? 0 : (((0 == $number) || (($number % 100 > 0) && ($number % 100 < 20))) ? 1 : 2);
+
+ case 'ar':
+ return (0 == $number) ? 0 : ((1 == $number) ? 1 : ((2 == $number) ? 2 : ((($number % 100 >= 3) && ($number % 100 <= 10)) ? 3 : ((($number % 100 >= 11) && ($number % 100 <= 99)) ? 4 : 5))));
+
+ default:
+ return 0;
+ }
+ }
+
+ /**
+ * Overrides the default plural rule for a given locale.
+ *
+ * @param callable $rule A PHP callable
+ * @param string $locale The locale
+ */
+ public static function set(callable $rule, $locale)
+ {
+ @trigger_error(sprintf('The "%s" class is deprecated since Symfony 4.2.', __CLASS__), E_USER_DEPRECATED);
+
+ if ('pt_BR' === $locale) {
+ // temporary set a locale for brazilian
+ $locale = 'xbr';
+ }
+
+ if (\strlen($locale) > 3) {
+ $locale = substr($locale, 0, -\strlen(strrchr($locale, '_')));
+ }
+
+ self::$rules[$locale] = $rule;
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/README.md b/plugins/vdomah/jwtauth/vendor/symfony/translation/README.md
new file mode 100644
index 0000000..f4f1706
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/README.md
@@ -0,0 +1,31 @@
+Translation Component
+=====================
+
+The Translation component provides tools to internationalize your application.
+
+Getting Started
+---------------
+
+```
+$ composer require symfony/translation
+```
+
+```php
+use Symfony\Component\Translation\Translator;
+
+$translator = new Translator('fr_FR');
+$translator->addResource('array', [
+ 'Hello World!' => 'Bonjour !',
+], 'fr_FR');
+
+echo $translator->trans('Hello World!'); // outputs « Bonjour ! »
+```
+
+Resources
+---------
+
+ * [Documentation](https://symfony.com/doc/current/translation.html)
+ * [Contributing](https://symfony.com/doc/current/contributing/index.html)
+ * [Report issues](https://github.com/symfony/symfony/issues) and
+ [send Pull Requests](https://github.com/symfony/symfony/pulls)
+ in the [main Symfony repository](https://github.com/symfony/symfony)
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Reader/TranslationReader.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Reader/TranslationReader.php
new file mode 100644
index 0000000..2b98345
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Reader/TranslationReader.php
@@ -0,0 +1,62 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Reader;
+
+use Symfony\Component\Finder\Finder;
+use Symfony\Component\Translation\Loader\LoaderInterface;
+use Symfony\Component\Translation\MessageCatalogue;
+
+/**
+ * TranslationReader reads translation messages from translation files.
+ *
+ * @author Michel Salib
+ */
+class TranslationReader implements TranslationReaderInterface
+{
+ /**
+ * Loaders used for import.
+ *
+ * @var array
+ */
+ private $loaders = [];
+
+ /**
+ * Adds a loader to the translation extractor.
+ *
+ * @param string $format The format of the loader
+ */
+ public function addLoader($format, LoaderInterface $loader)
+ {
+ $this->loaders[$format] = $loader;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function read($directory, MessageCatalogue $catalogue)
+ {
+ if (!is_dir($directory)) {
+ return;
+ }
+
+ foreach ($this->loaders as $format => $loader) {
+ // load any existing translation files
+ $finder = new Finder();
+ $extension = $catalogue->getLocale().'.'.$format;
+ $files = $finder->files()->name('*.'.$extension)->in($directory);
+ foreach ($files as $file) {
+ $domain = substr($file->getFilename(), 0, -1 * \strlen($extension) - 1);
+ $catalogue->addCatalogue($loader->load($file->getPathname(), $catalogue->getLocale(), $domain));
+ }
+ }
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Reader/TranslationReaderInterface.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Reader/TranslationReaderInterface.php
new file mode 100644
index 0000000..0b2ad33
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Reader/TranslationReaderInterface.php
@@ -0,0 +1,29 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Reader;
+
+use Symfony\Component\Translation\MessageCatalogue;
+
+/**
+ * TranslationReader reads translation messages from translation files.
+ *
+ * @author Tobias Nyholm
+ */
+interface TranslationReaderInterface
+{
+ /**
+ * Reads translation messages from a directory to the catalogue.
+ *
+ * @param string $directory
+ */
+ public function read($directory, MessageCatalogue $catalogue);
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Resources/bin/translation-status.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Resources/bin/translation-status.php
new file mode 100644
index 0000000..44918c9
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Resources/bin/translation-status.php
@@ -0,0 +1,207 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+$usageInstructions = << false,
+ // NULL = analyze all locales
+ 'locale_to_analyze' => null,
+ // the reference files all the other translations are compared to
+ 'original_files' => [
+ 'src/Symfony/Component/Form/Resources/translations/validators.en.xlf',
+ 'src/Symfony/Component/Security/Core/Resources/translations/security.en.xlf',
+ 'src/Symfony/Component/Validator/Resources/translations/validators.en.xlf',
+ ],
+];
+
+$argc = $_SERVER['argc'];
+$argv = $_SERVER['argv'];
+
+if ($argc > 3) {
+ echo str_replace('translation-status.php', $argv[0], $usageInstructions);
+ exit(1);
+}
+
+foreach (array_slice($argv, 1) as $argumentOrOption) {
+ if (0 === strpos($argumentOrOption, '-')) {
+ $config['verbose_output'] = true;
+ } else {
+ $config['locale_to_analyze'] = $argumentOrOption;
+ }
+}
+
+foreach ($config['original_files'] as $originalFilePath) {
+ if (!file_exists($originalFilePath)) {
+ echo sprintf('The following file does not exist. Make sure that you execute this command at the root dir of the Symfony code repository.%s %s', PHP_EOL, $originalFilePath);
+ exit(1);
+ }
+}
+
+$totalMissingTranslations = 0;
+
+foreach ($config['original_files'] as $originalFilePath) {
+ $translationFilePaths = findTranslationFiles($originalFilePath, $config['locale_to_analyze']);
+ $translationStatus = calculateTranslationStatus($originalFilePath, $translationFilePaths);
+
+ $totalMissingTranslations += array_sum(array_map(function ($translation) {
+ return count($translation['missingKeys']);
+ }, array_values($translationStatus)));
+
+ printTranslationStatus($originalFilePath, $translationStatus, $config['verbose_output']);
+}
+
+exit($totalMissingTranslations > 0 ? 1 : 0);
+
+function findTranslationFiles($originalFilePath, $localeToAnalyze)
+{
+ $translations = [];
+
+ $translationsDir = dirname($originalFilePath);
+ $originalFileName = basename($originalFilePath);
+ $translationFileNamePattern = str_replace('.en.', '.*.', $originalFileName);
+
+ $translationFiles = glob($translationsDir.'/'.$translationFileNamePattern, GLOB_NOSORT);
+ sort($translationFiles);
+ foreach ($translationFiles as $filePath) {
+ $locale = extractLocaleFromFilePath($filePath);
+
+ if (null !== $localeToAnalyze && $locale !== $localeToAnalyze) {
+ continue;
+ }
+
+ $translations[$locale] = $filePath;
+ }
+
+ return $translations;
+}
+
+function calculateTranslationStatus($originalFilePath, $translationFilePaths)
+{
+ $translationStatus = [];
+ $allTranslationKeys = extractTranslationKeys($originalFilePath);
+
+ foreach ($translationFilePaths as $locale => $translationPath) {
+ $translatedKeys = extractTranslationKeys($translationPath);
+ $missingKeys = array_diff_key($allTranslationKeys, $translatedKeys);
+
+ $translationStatus[$locale] = [
+ 'total' => count($allTranslationKeys),
+ 'translated' => count($translatedKeys),
+ 'missingKeys' => $missingKeys,
+ ];
+ }
+
+ return $translationStatus;
+}
+
+function printTranslationStatus($originalFilePath, $translationStatus, $verboseOutput)
+{
+ printTitle($originalFilePath);
+ printTable($translationStatus, $verboseOutput);
+ echo PHP_EOL.PHP_EOL;
+}
+
+function extractLocaleFromFilePath($filePath)
+{
+ $parts = explode('.', $filePath);
+
+ return $parts[count($parts) - 2];
+}
+
+function extractTranslationKeys($filePath)
+{
+ $translationKeys = [];
+ $contents = new \SimpleXMLElement(file_get_contents($filePath));
+
+ foreach ($contents->file->body->{'trans-unit'} as $translationKey) {
+ $translationId = (string) $translationKey['id'];
+ $translationKey = (string) $translationKey->source;
+
+ $translationKeys[$translationId] = $translationKey;
+ }
+
+ return $translationKeys;
+}
+
+function printTitle($title)
+{
+ echo $title.PHP_EOL;
+ echo str_repeat('=', strlen($title)).PHP_EOL.PHP_EOL;
+}
+
+function printTable($translations, $verboseOutput)
+{
+ if (0 === count($translations)) {
+ echo 'No translations found';
+
+ return;
+ }
+ $longestLocaleNameLength = max(array_map('strlen', array_keys($translations)));
+
+ foreach ($translations as $locale => $translation) {
+ if ($translation['translated'] > $translation['total']) {
+ textColorRed();
+ } elseif ($translation['translated'] === $translation['total']) {
+ textColorGreen();
+ }
+
+ echo sprintf('| Locale: %-'.$longestLocaleNameLength.'s | Translated: %d/%d', $locale, $translation['translated'], $translation['total']).PHP_EOL;
+
+ textColorNormal();
+
+ if (true === $verboseOutput && count($translation['missingKeys']) > 0) {
+ echo str_repeat('-', 80).PHP_EOL;
+ echo '| Missing Translations:'.PHP_EOL;
+
+ foreach ($translation['missingKeys'] as $id => $content) {
+ echo sprintf('| (id=%s) %s', $id, $content).PHP_EOL;
+ }
+
+ echo str_repeat('-', 80).PHP_EOL;
+ }
+ }
+}
+
+function textColorGreen()
+{
+ echo "\033[32m";
+}
+
+function textColorRed()
+{
+ echo "\033[31m";
+}
+
+function textColorNormal()
+{
+ echo "\033[0m";
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Resources/data/parents.json b/plugins/vdomah/jwtauth/vendor/symfony/translation/Resources/data/parents.json
new file mode 100644
index 0000000..6e45d9f
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Resources/data/parents.json
@@ -0,0 +1,136 @@
+{
+ "az_Cyrl": "root",
+ "bs_Cyrl": "root",
+ "en_150": "en_001",
+ "en_AG": "en_001",
+ "en_AI": "en_001",
+ "en_AT": "en_150",
+ "en_AU": "en_001",
+ "en_BB": "en_001",
+ "en_BE": "en_150",
+ "en_BM": "en_001",
+ "en_BS": "en_001",
+ "en_BW": "en_001",
+ "en_BZ": "en_001",
+ "en_CA": "en_001",
+ "en_CC": "en_001",
+ "en_CH": "en_150",
+ "en_CK": "en_001",
+ "en_CM": "en_001",
+ "en_CX": "en_001",
+ "en_CY": "en_001",
+ "en_DE": "en_150",
+ "en_DG": "en_001",
+ "en_DK": "en_150",
+ "en_DM": "en_001",
+ "en_ER": "en_001",
+ "en_FI": "en_150",
+ "en_FJ": "en_001",
+ "en_FK": "en_001",
+ "en_FM": "en_001",
+ "en_GB": "en_001",
+ "en_GD": "en_001",
+ "en_GG": "en_001",
+ "en_GH": "en_001",
+ "en_GI": "en_001",
+ "en_GM": "en_001",
+ "en_GY": "en_001",
+ "en_HK": "en_001",
+ "en_IE": "en_001",
+ "en_IL": "en_001",
+ "en_IM": "en_001",
+ "en_IN": "en_001",
+ "en_IO": "en_001",
+ "en_JE": "en_001",
+ "en_JM": "en_001",
+ "en_KE": "en_001",
+ "en_KI": "en_001",
+ "en_KN": "en_001",
+ "en_KY": "en_001",
+ "en_LC": "en_001",
+ "en_LR": "en_001",
+ "en_LS": "en_001",
+ "en_MG": "en_001",
+ "en_MO": "en_001",
+ "en_MS": "en_001",
+ "en_MT": "en_001",
+ "en_MU": "en_001",
+ "en_MW": "en_001",
+ "en_MY": "en_001",
+ "en_NA": "en_001",
+ "en_NF": "en_001",
+ "en_NG": "en_001",
+ "en_NL": "en_150",
+ "en_NR": "en_001",
+ "en_NU": "en_001",
+ "en_NZ": "en_001",
+ "en_PG": "en_001",
+ "en_PH": "en_001",
+ "en_PK": "en_001",
+ "en_PN": "en_001",
+ "en_PW": "en_001",
+ "en_RW": "en_001",
+ "en_SB": "en_001",
+ "en_SC": "en_001",
+ "en_SD": "en_001",
+ "en_SE": "en_150",
+ "en_SG": "en_001",
+ "en_SH": "en_001",
+ "en_SI": "en_150",
+ "en_SL": "en_001",
+ "en_SS": "en_001",
+ "en_SX": "en_001",
+ "en_SZ": "en_001",
+ "en_TC": "en_001",
+ "en_TK": "en_001",
+ "en_TO": "en_001",
+ "en_TT": "en_001",
+ "en_TV": "en_001",
+ "en_TZ": "en_001",
+ "en_UG": "en_001",
+ "en_VC": "en_001",
+ "en_VG": "en_001",
+ "en_VU": "en_001",
+ "en_WS": "en_001",
+ "en_ZA": "en_001",
+ "en_ZM": "en_001",
+ "en_ZW": "en_001",
+ "es_AR": "es_419",
+ "es_BO": "es_419",
+ "es_BR": "es_419",
+ "es_BZ": "es_419",
+ "es_CL": "es_419",
+ "es_CO": "es_419",
+ "es_CR": "es_419",
+ "es_CU": "es_419",
+ "es_DO": "es_419",
+ "es_EC": "es_419",
+ "es_GT": "es_419",
+ "es_HN": "es_419",
+ "es_MX": "es_419",
+ "es_NI": "es_419",
+ "es_PA": "es_419",
+ "es_PE": "es_419",
+ "es_PR": "es_419",
+ "es_PY": "es_419",
+ "es_SV": "es_419",
+ "es_US": "es_419",
+ "es_UY": "es_419",
+ "es_VE": "es_419",
+ "pa_Arab": "root",
+ "pt_AO": "pt_PT",
+ "pt_CH": "pt_PT",
+ "pt_CV": "pt_PT",
+ "pt_GQ": "pt_PT",
+ "pt_GW": "pt_PT",
+ "pt_LU": "pt_PT",
+ "pt_MO": "pt_PT",
+ "pt_MZ": "pt_PT",
+ "pt_ST": "pt_PT",
+ "pt_TL": "pt_PT",
+ "sr_Latn": "root",
+ "uz_Arab": "root",
+ "uz_Cyrl": "root",
+ "zh_Hant": "root",
+ "zh_Hant_MO": "zh_Hant_HK"
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Resources/schemas/xliff-core-1.2-strict.xsd b/plugins/vdomah/jwtauth/vendor/symfony/translation/Resources/schemas/xliff-core-1.2-strict.xsd
new file mode 100644
index 0000000..dface62
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Resources/schemas/xliff-core-1.2-strict.xsd
@@ -0,0 +1,2223 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Values for the attribute 'context-type'.
+
+
+
+
+ Indicates a database content.
+
+
+
+
+ Indicates the content of an element within an XML document.
+
+
+
+
+ Indicates the name of an element within an XML document.
+
+
+
+
+ Indicates the line number from the sourcefile (see context-type="sourcefile") where the <source> is found.
+
+
+
+
+ Indicates a the number of parameters contained within the <source>.
+
+
+
+
+ Indicates notes pertaining to the parameters in the <source>.
+
+
+
+
+ Indicates the content of a record within a database.
+
+
+
+
+ Indicates the name of a record within a database.
+
+
+
+
+ Indicates the original source file in the case that multiple files are merged to form the original file from which the XLIFF file is created. This differs from the original <file> attribute in that this sourcefile is one of many that make up that file.
+
+
+
+
+
+
+ Values for the attribute 'count-type'.
+
+
+
+
+ Indicates the count units are items that are used X times in a certain context; example: this is a reusable text unit which is used 42 times in other texts.
+
+
+
+
+ Indicates the count units are translation units existing already in the same document.
+
+
+
+
+ Indicates a total count.
+
+
+
+
+
+
+ Values for the attribute 'ctype' when used other elements than <ph> or <x>.
+
+
+
+
+ Indicates a run of bolded text.
+
+
+
+
+ Indicates a run of text in italics.
+
+
+
+
+ Indicates a run of underlined text.
+
+
+
+
+ Indicates a run of hyper-text.
+
+
+
+
+
+
+ Values for the attribute 'ctype' when used with <ph> or <x>.
+
+
+
+
+ Indicates a inline image.
+
+
+
+
+ Indicates a page break.
+
+
+
+
+ Indicates a line break.
+
+
+
+
+
+
+
+
+
+
+
+ Values for the attribute 'datatype'.
+
+
+
+
+ Indicates Active Server Page data.
+
+
+
+
+ Indicates C source file data.
+
+
+
+
+ Indicates Channel Definition Format (CDF) data.
+
+
+
+
+ Indicates ColdFusion data.
+
+
+
+
+ Indicates C++ source file data.
+
+
+
+
+ Indicates C-Sharp data.
+
+
+
+
+ Indicates strings from C, ASM, and driver files data.
+
+
+
+
+ Indicates comma-separated values data.
+
+
+
+
+ Indicates database data.
+
+
+
+
+ Indicates portions of document that follows data and contains metadata.
+
+
+
+
+ Indicates portions of document that precedes data and contains metadata.
+
+
+
+
+ Indicates data from standard UI file operations dialogs (e.g., Open, Save, Save As, Export, Import).
+
+
+
+
+ Indicates standard user input screen data.
+
+
+
+
+ Indicates HyperText Markup Language (HTML) data - document instance.
+
+
+
+
+ Indicates content within an HTML document’s <body> element.
+
+
+
+
+ Indicates Windows INI file data.
+
+
+
+
+ Indicates Interleaf data.
+
+
+
+
+ Indicates Java source file data (extension '.java').
+
+
+
+
+ Indicates Java property resource bundle data.
+
+
+
+
+ Indicates Java list resource bundle data.
+
+
+
+
+ Indicates JavaScript source file data.
+
+
+
+
+ Indicates JScript source file data.
+
+
+
+
+ Indicates information relating to formatting.
+
+
+
+
+ Indicates LISP source file data.
+
+
+
+
+ Indicates information relating to margin formats.
+
+
+
+
+ Indicates a file containing menu.
+
+
+
+
+ Indicates numerically identified string table.
+
+
+
+
+ Indicates Maker Interchange Format (MIF) data.
+
+
+
+
+ Indicates that the datatype attribute value is a MIME Type value and is defined in the mime-type attribute.
+
+
+
+
+ Indicates GNU Machine Object data.
+
+
+
+
+ Indicates Message Librarian strings created by Novell's Message Librarian Tool.
+
+
+
+
+ Indicates information to be displayed at the bottom of each page of a document.
+
+
+
+
+ Indicates information to be displayed at the top of each page of a document.
+
+
+
+
+ Indicates a list of property values (e.g., settings within INI files or preferences dialog).
+
+
+
+
+ Indicates Pascal source file data.
+
+
+
+
+ Indicates Hypertext Preprocessor data.
+
+
+
+
+ Indicates plain text file (no formatting other than, possibly, wrapping).
+
+
+
+
+ Indicates GNU Portable Object file.
+
+
+
+
+ Indicates dynamically generated user defined document. e.g. Oracle Report, Crystal Report, etc.
+
+
+
+
+ Indicates Windows .NET binary resources.
+
+
+
+
+ Indicates Windows .NET Resources.
+
+
+
+
+ Indicates Rich Text Format (RTF) data.
+
+
+
+
+ Indicates Standard Generalized Markup Language (SGML) data - document instance.
+
+
+
+
+ Indicates Standard Generalized Markup Language (SGML) data - Document Type Definition (DTD).
+
+
+
+
+ Indicates Scalable Vector Graphic (SVG) data.
+
+
+
+
+ Indicates VisualBasic Script source file.
+
+
+
+
+ Indicates warning message.
+
+
+
+
+ Indicates Windows (Win32) resources (i.e. resources extracted from an RC script, a message file, or a compiled file).
+
+
+
+
+ Indicates Extensible HyperText Markup Language (XHTML) data - document instance.
+
+
+
+
+ Indicates Extensible Markup Language (XML) data - document instance.
+
+
+
+
+ Indicates Extensible Markup Language (XML) data - Document Type Definition (DTD).
+
+
+
+
+ Indicates Extensible Stylesheet Language (XSL) data.
+
+
+
+
+ Indicates XUL elements.
+
+
+
+
+
+
+ Values for the attribute 'mtype'.
+
+
+
+
+ Indicates the marked text is an abbreviation.
+
+
+
+
+ ISO-12620 2.1.8: A term resulting from the omission of any part of the full term while designating the same concept.
+
+
+
+
+ ISO-12620 2.1.8.1: An abbreviated form of a simple term resulting from the omission of some of its letters (e.g. 'adj.' for 'adjective').
+
+
+
+
+ ISO-12620 2.1.8.4: An abbreviated form of a term made up of letters from the full form of a multiword term strung together into a sequence pronounced only syllabically (e.g. 'radar' for 'radio detecting and ranging').
+
+
+
+
+ ISO-12620: A proper-name term, such as the name of an agency or other proper entity.
+
+
+
+
+ ISO-12620 2.1.18.1: A recurrent word combination characterized by cohesion in that the components of the collocation must co-occur within an utterance or series of utterances, even though they do not necessarily have to maintain immediate proximity to one another.
+
+
+
+
+ ISO-12620 2.1.5: A synonym for an international scientific term that is used in general discourse in a given language.
+
+
+
+
+ Indicates the marked text is a date and/or time.
+
+
+
+
+ ISO-12620 2.1.15: An expression used to represent a concept based on a statement that two mathematical expressions are, for instance, equal as identified by the equal sign (=), or assigned to one another by a similar sign.
+
+
+
+
+ ISO-12620 2.1.7: The complete representation of a term for which there is an abbreviated form.
+
+
+
+
+ ISO-12620 2.1.14: Figures, symbols or the like used to express a concept briefly, such as a mathematical or chemical formula.
+
+
+
+
+ ISO-12620 2.1.1: The concept designation that has been chosen to head a terminological record.
+
+
+
+
+ ISO-12620 2.1.8.3: An abbreviated form of a term consisting of some of the initial letters of the words making up a multiword term or the term elements making up a compound term when these letters are pronounced individually (e.g. 'BSE' for 'bovine spongiform encephalopathy').
+
+
+
+
+ ISO-12620 2.1.4: A term that is part of an international scientific nomenclature as adopted by an appropriate scientific body.
+
+
+
+
+ ISO-12620 2.1.6: A term that has the same or nearly identical orthographic or phonemic form in many languages.
+
+
+
+
+ ISO-12620 2.1.16: An expression used to represent a concept based on mathematical or logical relations, such as statements of inequality, set relationships, Boolean operations, and the like.
+
+
+
+
+ ISO-12620 2.1.17: A unit to track object.
+
+
+
+
+ Indicates the marked text is a name.
+
+
+
+
+ ISO-12620 2.1.3: A term that represents the same or a very similar concept as another term in the same language, but for which interchangeability is limited to some contexts and inapplicable in others.
+
+
+
+
+ ISO-12620 2.1.17.2: A unique alphanumeric designation assigned to an object in a manufacturing system.
+
+
+
+
+ Indicates the marked text is a phrase.
+
+
+
+
+ ISO-12620 2.1.18: Any group of two or more words that form a unit, the meaning of which frequently cannot be deduced based on the combined sense of the words making up the phrase.
+
+
+
+
+ Indicates the marked text should not be translated.
+
+
+
+
+ ISO-12620 2.1.12: A form of a term resulting from an operation whereby non-Latin writing systems are converted to the Latin alphabet.
+
+
+
+
+ Indicates that the marked text represents a segment.
+
+
+
+
+ ISO-12620 2.1.18.2: A fixed, lexicalized phrase.
+
+
+
+
+ ISO-12620 2.1.8.2: A variant of a multiword term that includes fewer words than the full form of the term (e.g. 'Group of Twenty-four' for 'Intergovernmental Group of Twenty-four on International Monetary Affairs').
+
+
+
+
+ ISO-12620 2.1.17.1: Stock keeping unit, an inventory item identified by a unique alphanumeric designation assigned to an object in an inventory control system.
+
+
+
+
+ ISO-12620 2.1.19: A fixed chunk of recurring text.
+
+
+
+
+ ISO-12620 2.1.13: A designation of a concept by letters, numerals, pictograms or any combination thereof.
+
+
+
+
+ ISO-12620 2.1.2: Any term that represents the same or a very similar concept as the main entry term in a term entry.
+
+
+
+
+ ISO-12620 2.1.18.3: Phraseological unit in a language that expresses the same semantic content as another phrase in that same language.
+
+
+
+
+ Indicates the marked text is a term.
+
+
+
+
+ ISO-12620 2.1.11: A form of a term resulting from an operation whereby the characters of one writing system are represented by characters from another writing system, taking into account the pronunciation of the characters converted.
+
+
+
+
+ ISO-12620 2.1.10: A form of a term resulting from an operation whereby the characters of an alphabetic writing system are represented by characters from another alphabetic writing system.
+
+
+
+
+ ISO-12620 2.1.8.5: An abbreviated form of a term resulting from the omission of one or more term elements or syllables (e.g. 'flu' for 'influenza').
+
+
+
+
+ ISO-12620 2.1.9: One of the alternate forms of a term.
+
+
+
+
+
+
+ Values for the attribute 'restype'.
+
+
+
+
+ Indicates a Windows RC AUTO3STATE control.
+
+
+
+
+ Indicates a Windows RC AUTOCHECKBOX control.
+
+
+
+
+ Indicates a Windows RC AUTORADIOBUTTON control.
+
+
+
+
+ Indicates a Windows RC BEDIT control.
+
+
+
+
+ Indicates a bitmap, for example a BITMAP resource in Windows.
+
+
+
+
+ Indicates a button object, for example a BUTTON control Windows.
+
+
+
+
+ Indicates a caption, such as the caption of a dialog box.
+
+
+
+
+ Indicates the cell in a table, for example the content of the <td> element in HTML.
+
+
+
+
+ Indicates check box object, for example a CHECKBOX control in Windows.
+
+
+
+
+ Indicates a menu item with an associated checkbox.
+
+
+
+
+ Indicates a list box, but with a check-box for each item.
+
+
+
+
+ Indicates a color selection dialog.
+
+
+
+
+ Indicates a combination of edit box and listbox object, for example a COMBOBOX control in Windows.
+
+
+
+
+ Indicates an initialization entry of an extended combobox DLGINIT resource block. (code 0x1234).
+
+
+
+
+ Indicates an initialization entry of a combobox DLGINIT resource block (code 0x0403).
+
+
+
+
+ Indicates a UI base class element that cannot be represented by any other element.
+
+
+
+
+ Indicates a context menu.
+
+
+
+
+ Indicates a Windows RC CTEXT control.
+
+
+
+
+ Indicates a cursor, for example a CURSOR resource in Windows.
+
+
+
+
+ Indicates a date/time picker.
+
+
+
+
+ Indicates a Windows RC DEFPUSHBUTTON control.
+
+
+
+
+ Indicates a dialog box.
+
+
+
+
+ Indicates a Windows RC DLGINIT resource block.
+
+
+
+
+ Indicates an edit box object, for example an EDIT control in Windows.
+
+
+
+
+ Indicates a filename.
+
+
+
+
+ Indicates a file dialog.
+
+
+
+
+ Indicates a footnote.
+
+
+
+
+ Indicates a font name.
+
+
+
+
+ Indicates a footer.
+
+
+
+
+ Indicates a frame object.
+
+
+
+
+ Indicates a XUL grid element.
+
+
+
+
+ Indicates a groupbox object, for example a GROUPBOX control in Windows.
+
+
+
+
+ Indicates a header item.
+
+
+
+
+ Indicates a heading, such has the content of <h1>, <h2>, etc. in HTML.
+
+
+
+
+ Indicates a Windows RC HEDIT control.
+
+
+
+
+ Indicates a horizontal scrollbar.
+
+
+
+
+ Indicates an icon, for example an ICON resource in Windows.
+
+
+
+
+ Indicates a Windows RC IEDIT control.
+
+
+
+
+ Indicates keyword list, such as the content of the Keywords meta-data in HTML, or a K footnote in WinHelp RTF.
+
+
+
+
+ Indicates a label object.
+
+
+
+
+ Indicates a label that is also a HTML link (not necessarily a URL).
+
+
+
+
+ Indicates a list (a group of list-items, for example an <ol> or <ul> element in HTML).
+
+
+
+
+ Indicates a listbox object, for example an LISTBOX control in Windows.
+
+
+
+
+ Indicates an list item (an entry in a list).
+
+
+
+
+ Indicates a Windows RC LTEXT control.
+
+
+
+
+ Indicates a menu (a group of menu-items).
+
+
+
+
+ Indicates a toolbar containing one or more tope level menus.
+
+
+
+
+ Indicates a menu item (an entry in a menu).
+
+
+
+
+ Indicates a XUL menuseparator element.
+
+
+
+
+ Indicates a message, for example an entry in a MESSAGETABLE resource in Windows.
+
+
+
+
+ Indicates a calendar control.
+
+
+
+
+ Indicates an edit box beside a spin control.
+
+
+
+
+ Indicates a catch all for rectangular areas.
+
+
+
+
+ Indicates a standalone menu not necessarily associated with a menubar.
+
+
+
+
+ Indicates a pushbox object, for example a PUSHBOX control in Windows.
+
+
+
+
+ Indicates a Windows RC PUSHBUTTON control.
+
+
+
+
+ Indicates a radio button object.
+
+
+
+
+ Indicates a menuitem with associated radio button.
+
+
+
+
+ Indicates raw data resources for an application.
+
+
+
+
+ Indicates a row in a table.
+
+
+
+
+ Indicates a Windows RC RTEXT control.
+
+
+
+
+ Indicates a user navigable container used to show a portion of a document.
+
+
+
+
+ Indicates a generic divider object (e.g. menu group separator).
+
+
+
+
+ Windows accelerators, shortcuts in resource or property files.
+
+
+
+
+ Indicates a UI control to indicate process activity but not progress.
+
+
+
+
+ Indicates a splitter bar.
+
+
+
+
+ Indicates a Windows RC STATE3 control.
+
+
+
+
+ Indicates a window for providing feedback to the users, like 'read-only', etc.
+
+
+
+
+ Indicates a string, for example an entry in a STRINGTABLE resource in Windows.
+
+
+
+
+ Indicates a layers of controls with a tab to select layers.
+
+
+
+
+ Indicates a display and edits regular two-dimensional tables of cells.
+
+
+
+
+ Indicates a XUL textbox element.
+
+
+
+
+ Indicates a UI button that can be toggled to on or off state.
+
+
+
+
+ Indicates an array of controls, usually buttons.
+
+
+
+
+ Indicates a pop up tool tip text.
+
+
+
+
+ Indicates a bar with a pointer indicating a position within a certain range.
+
+
+
+
+ Indicates a control that displays a set of hierarchical data.
+
+
+
+
+ Indicates a URI (URN or URL).
+
+
+
+
+ Indicates a Windows RC USERBUTTON control.
+
+
+
+
+ Indicates a user-defined control like CONTROL control in Windows.
+
+
+
+
+ Indicates the text of a variable.
+
+
+
+
+ Indicates version information about a resource like VERSIONINFO in Windows.
+
+
+
+
+ Indicates a vertical scrollbar.
+
+
+
+
+ Indicates a graphical window.
+
+
+
+
+
+
+ Values for the attribute 'size-unit'.
+
+
+
+
+ Indicates a size in 8-bit bytes.
+
+
+
+
+ Indicates a size in Unicode characters.
+
+
+
+
+ Indicates a size in columns. Used for HTML text area.
+
+
+
+
+ Indicates a size in centimeters.
+
+
+
+
+ Indicates a size in dialog units, as defined in Windows resources.
+
+
+
+
+ Indicates a size in 'font-size' units (as defined in CSS).
+
+
+
+
+ Indicates a size in 'x-height' units (as defined in CSS).
+
+
+
+
+ Indicates a size in glyphs. A glyph is considered to be one or more combined Unicode characters that represent a single displayable text character. Sometimes referred to as a 'grapheme cluster'
+
+
+
+
+ Indicates a size in inches.
+
+
+
+
+ Indicates a size in millimeters.
+
+
+
+
+ Indicates a size in percentage.
+
+
+
+
+ Indicates a size in pixels.
+
+
+
+
+ Indicates a size in point.
+
+
+
+
+ Indicates a size in rows. Used for HTML text area.
+
+
+
+
+
+
+ Values for the attribute 'state'.
+
+
+
+
+ Indicates the terminating state.
+
+
+
+
+ Indicates only non-textual information needs adaptation.
+
+
+
+
+ Indicates both text and non-textual information needs adaptation.
+
+
+
+
+ Indicates only non-textual information needs review.
+
+
+
+
+ Indicates both text and non-textual information needs review.
+
+
+
+
+ Indicates that only the text of the item needs to be reviewed.
+
+
+
+
+ Indicates that the item needs to be translated.
+
+
+
+
+ Indicates that the item is new. For example, translation units that were not in a previous version of the document.
+
+
+
+
+ Indicates that changes are reviewed and approved.
+
+
+
+
+ Indicates that the item has been translated.
+
+
+
+
+
+
+ Values for the attribute 'state-qualifier'.
+
+
+
+
+ Indicates an exact match. An exact match occurs when a source text of a segment is exactly the same as the source text of a segment that was translated previously.
+
+
+
+
+ Indicates a fuzzy match. A fuzzy match occurs when a source text of a segment is very similar to the source text of a segment that was translated previously (e.g. when the difference is casing, a few changed words, white-space discripancy, etc.).
+
+
+
+
+ Indicates a match based on matching IDs (in addition to matching text).
+
+
+
+
+ Indicates a translation derived from a glossary.
+
+
+
+
+ Indicates a translation derived from existing translation.
+
+
+
+
+ Indicates a translation derived from machine translation.
+
+
+
+
+ Indicates a translation derived from a translation repository.
+
+
+
+
+ Indicates a translation derived from a translation memory.
+
+
+
+
+ Indicates the translation is suggested by machine translation.
+
+
+
+
+ Indicates that the item has been rejected because of incorrect grammar.
+
+
+
+
+ Indicates that the item has been rejected because it is incorrect.
+
+
+
+
+ Indicates that the item has been rejected because it is too long or too short.
+
+
+
+
+ Indicates that the item has been rejected because of incorrect spelling.
+
+
+
+
+ Indicates the translation is suggested by translation memory.
+
+
+
+
+
+
+ Values for the attribute 'unit'.
+
+
+
+
+ Refers to words.
+
+
+
+
+ Refers to pages.
+
+
+
+
+ Refers to <trans-unit> elements.
+
+
+
+
+ Refers to <bin-unit> elements.
+
+
+
+
+ Refers to glyphs.
+
+
+
+
+ Refers to <trans-unit> and/or <bin-unit> elements.
+
+
+
+
+ Refers to the occurrences of instances defined by the count-type value.
+
+
+
+
+ Refers to characters.
+
+
+
+
+ Refers to lines.
+
+
+
+
+ Refers to sentences.
+
+
+
+
+ Refers to paragraphs.
+
+
+
+
+ Refers to segments.
+
+
+
+
+ Refers to placeables (inline elements).
+
+
+
+
+
+
+ Values for the attribute 'priority'.
+
+
+
+
+ Highest priority.
+
+
+
+
+ High priority.
+
+
+
+
+ High priority, but not as important as 2.
+
+
+
+
+ High priority, but not as important as 3.
+
+
+
+
+ Medium priority, but more important than 6.
+
+
+
+
+ Medium priority, but less important than 5.
+
+
+
+
+ Low priority, but more important than 8.
+
+
+
+
+ Low priority, but more important than 9.
+
+
+
+
+ Low priority.
+
+
+
+
+ Lowest priority.
+
+
+
+
+
+
+
+
+ This value indicates that all properties can be reformatted. This value must be used alone.
+
+
+
+
+ This value indicates that no properties should be reformatted. This value must be used alone.
+
+
+
+
+
+
+
+
+
+
+
+
+ This value indicates that all information in the coord attribute can be modified.
+
+
+
+
+ This value indicates that the x information in the coord attribute can be modified.
+
+
+
+
+ This value indicates that the y information in the coord attribute can be modified.
+
+
+
+
+ This value indicates that the cx information in the coord attribute can be modified.
+
+
+
+
+ This value indicates that the cy information in the coord attribute can be modified.
+
+
+
+
+ This value indicates that all the information in the font attribute can be modified.
+
+
+
+
+ This value indicates that the name information in the font attribute can be modified.
+
+
+
+
+ This value indicates that the size information in the font attribute can be modified.
+
+
+
+
+ This value indicates that the weight information in the font attribute can be modified.
+
+
+
+
+ This value indicates that the information in the css-style attribute can be modified.
+
+
+
+
+ This value indicates that the information in the style attribute can be modified.
+
+
+
+
+ This value indicates that the information in the exstyle attribute can be modified.
+
+
+
+
+
+
+
+
+
+
+
+
+ Indicates that the context is informational in nature, specifying for example, how a term should be translated. Thus, should be displayed to anyone editing the XLIFF document.
+
+
+
+
+ Indicates that the context-group is used to specify where the term was found in the translatable source. Thus, it is not displayed.
+
+
+
+
+ Indicates that the context information should be used during translation memory lookups. Thus, it is not displayed.
+
+
+
+
+
+
+
+
+ Represents a translation proposal from a translation memory or other resource.
+
+
+
+
+ Represents a previous version of the target element.
+
+
+
+
+ Represents a rejected version of the target element.
+
+
+
+
+ Represents a translation to be used for reference purposes only, for example from a related product or a different language.
+
+
+
+
+ Represents a proposed translation that was used for the translation of the trans-unit, possibly modified.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Values for the attribute 'coord'.
+
+
+
+
+
+
+
+ Version values: 1.0 and 1.1 are allowed for backward compatibility.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Resources/schemas/xliff-core-2.0.xsd b/plugins/vdomah/jwtauth/vendor/symfony/translation/Resources/schemas/xliff-core-2.0.xsd
new file mode 100644
index 0000000..963232f
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Resources/schemas/xliff-core-2.0.xsd
@@ -0,0 +1,411 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Resources/schemas/xml.xsd b/plugins/vdomah/jwtauth/vendor/symfony/translation/Resources/schemas/xml.xsd
new file mode 100644
index 0000000..a46162a
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Resources/schemas/xml.xsd
@@ -0,0 +1,309 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
lang (as an attribute name)
+
+
+ denotes an attribute whose value
+ is a language code for the natural language of the content of
+ any element; its value is inherited. This name is reserved
+ by virtue of its definition in the XML specification.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
space (as an attribute name)
+
+ denotes an attribute whose
+ value is a keyword indicating what whitespace processing
+ discipline is intended for the content of the element; its
+ value is inherited. This name is reserved by virtue of its
+ definition in the XML specification.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
base (as an attribute name)
+
+ denotes an attribute whose value
+ provides a URI to be used as the base for interpreting any
+ relative URIs in the scope of the element on which it
+ appears; its value is inherited. This name is reserved
+ by virtue of its definition in the XML Base specification.
+
+
+ See http://www.w3.org/TR/xmlbase/
+ for information about this attribute.
+
+
+
+
+
+
+
+
+
+
+
+
+
id (as an attribute name)
+
+
+ denotes an attribute whose value
+ should be interpreted as if declared to be of type ID.
+ This name is reserved by virtue of its definition in the
+ xml:id specification.
+
+
+ See http://www.w3.org/TR/xml-id/
+ for information about this attribute.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Father (in any context at all)
+
+
+
+ denotes Jon Bosak, the chair of
+ the original XML Working Group. This name is reserved by
+ the following decision of the W3C XML Plenary and
+ XML Coordination groups:
+
+
+
+
+ In appreciation for his vision, leadership and
+ dedication the W3C XML Plenary on this 10th day of
+ February, 2000, reserves for Jon Bosak in perpetuity
+ the XML name "xml:Father".
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ This schema defines attributes and an attribute group suitable
+ for use by schemas wishing to allow xml:base,
+ xml:lang, xml:space or
+ xml:id attributes on elements they define.
+
+
+
+ To enable this, such a schema must import this schema for
+ the XML namespace, e.g. as follows:
+
+
+ <schema.. .>
+ .. .
+ <import namespace="http://www.w3.org/XML/1998/namespace"
+ schemaLocation="http://www.w3.org/2001/xml.xsd"/>
+
+
+ or
+
+
+
+ <import namespace="http://www.w3.org/XML/1998/namespace"
+ schemaLocation="http://www.w3.org/2009/01/xml.xsd"/>
+
+
+ Subsequently, qualified reference to any of the attributes or the
+ group defined below will have the desired effect, e.g.
+
+
+ <type.. .>
+ .. .
+ <attributeGroup ref="xml:specialAttrs"/>
+
+
+ will define a type which will schema-validate an instance element
+ with any of those attributes.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ In keeping with the XML Schema WG's standard versioning
+ policy, this schema document will persist at
+
+ http://www.w3.org/2009/01/xml.xsd .
+
+
+ At the date of issue it can also be found at
+
+ http://www.w3.org/2001/xml.xsd .
+
+
+
+ The schema document at that URI may however change in the future,
+ in order to remain compatible with the latest version of XML
+ Schema itself, or with the XML namespace itself. In other words,
+ if the XML Schema or XML namespaces change, the version of this
+ document at
+ http://www.w3.org/2001/xml.xsd
+
+ will change accordingly; the version at
+
+ http://www.w3.org/2009/01/xml.xsd
+
+ will not change.
+
+
+
+ Previous dated (and unchanging) versions of this schema
+ document are at:
+
+
+
+
+
+
+
+
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Catalogue/AbstractOperationTest.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Catalogue/AbstractOperationTest.php
new file mode 100644
index 0000000..f82b18f
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Catalogue/AbstractOperationTest.php
@@ -0,0 +1,74 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Tests\Catalogue;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\Translation\MessageCatalogue;
+use Symfony\Component\Translation\MessageCatalogueInterface;
+
+abstract class AbstractOperationTest extends TestCase
+{
+ public function testGetEmptyDomains()
+ {
+ $this->assertEquals(
+ [],
+ $this->createOperation(
+ new MessageCatalogue('en'),
+ new MessageCatalogue('en')
+ )->getDomains()
+ );
+ }
+
+ public function testGetMergedDomains()
+ {
+ $this->assertEquals(
+ ['a', 'b', 'c'],
+ $this->createOperation(
+ new MessageCatalogue('en', ['a' => [], 'b' => []]),
+ new MessageCatalogue('en', ['b' => [], 'c' => []])
+ )->getDomains()
+ );
+ }
+
+ public function testGetMessagesFromUnknownDomain()
+ {
+ $this->expectException('InvalidArgumentException');
+ $this->createOperation(
+ new MessageCatalogue('en'),
+ new MessageCatalogue('en')
+ )->getMessages('domain');
+ }
+
+ public function testGetEmptyMessages()
+ {
+ $this->assertEquals(
+ [],
+ $this->createOperation(
+ new MessageCatalogue('en', ['a' => []]),
+ new MessageCatalogue('en')
+ )->getMessages('a')
+ );
+ }
+
+ public function testGetEmptyResult()
+ {
+ $this->assertEquals(
+ new MessageCatalogue('en'),
+ $this->createOperation(
+ new MessageCatalogue('en'),
+ new MessageCatalogue('en')
+ )->getResult()
+ );
+ }
+
+ abstract protected function createOperation(MessageCatalogueInterface $source, MessageCatalogueInterface $target);
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Catalogue/MergeOperationTest.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Catalogue/MergeOperationTest.php
new file mode 100644
index 0000000..22af86e
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Catalogue/MergeOperationTest.php
@@ -0,0 +1,97 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Tests\Catalogue;
+
+use Symfony\Component\Translation\Catalogue\MergeOperation;
+use Symfony\Component\Translation\MessageCatalogue;
+use Symfony\Component\Translation\MessageCatalogueInterface;
+
+class MergeOperationTest extends AbstractOperationTest
+{
+ public function testGetMessagesFromSingleDomain()
+ {
+ $operation = $this->createOperation(
+ new MessageCatalogue('en', ['messages' => ['a' => 'old_a', 'b' => 'old_b']]),
+ new MessageCatalogue('en', ['messages' => ['a' => 'new_a', 'c' => 'new_c']])
+ );
+
+ $this->assertEquals(
+ ['a' => 'old_a', 'b' => 'old_b', 'c' => 'new_c'],
+ $operation->getMessages('messages')
+ );
+
+ $this->assertEquals(
+ ['c' => 'new_c'],
+ $operation->getNewMessages('messages')
+ );
+
+ $this->assertEquals(
+ [],
+ $operation->getObsoleteMessages('messages')
+ );
+ }
+
+ public function testGetResultFromSingleDomain()
+ {
+ $this->assertEquals(
+ new MessageCatalogue('en', [
+ 'messages' => ['a' => 'old_a', 'b' => 'old_b', 'c' => 'new_c'],
+ ]),
+ $this->createOperation(
+ new MessageCatalogue('en', ['messages' => ['a' => 'old_a', 'b' => 'old_b']]),
+ new MessageCatalogue('en', ['messages' => ['a' => 'new_a', 'c' => 'new_c']])
+ )->getResult()
+ );
+ }
+
+ public function testGetResultFromIntlDomain()
+ {
+ $this->assertEquals(
+ new MessageCatalogue('en', [
+ 'messages' => ['a' => 'old_a', 'b' => 'old_b'],
+ 'messages+intl-icu' => ['d' => 'old_d', 'c' => 'new_c'],
+ ]),
+ $this->createOperation(
+ new MessageCatalogue('en', ['messages' => ['a' => 'old_a', 'b' => 'old_b'], 'messages+intl-icu' => ['d' => 'old_d']]),
+ new MessageCatalogue('en', ['messages+intl-icu' => ['a' => 'new_a', 'c' => 'new_c']])
+ )->getResult()
+ );
+ }
+
+ public function testGetResultWithMetadata()
+ {
+ $leftCatalogue = new MessageCatalogue('en', ['messages' => ['a' => 'old_a', 'b' => 'old_b']]);
+ $leftCatalogue->setMetadata('a', 'foo', 'messages');
+ $leftCatalogue->setMetadata('b', 'bar', 'messages');
+ $rightCatalogue = new MessageCatalogue('en', ['messages' => ['b' => 'new_b', 'c' => 'new_c']]);
+ $rightCatalogue->setMetadata('b', 'baz', 'messages');
+ $rightCatalogue->setMetadata('c', 'qux', 'messages');
+
+ $mergedCatalogue = new MessageCatalogue('en', ['messages' => ['a' => 'old_a', 'b' => 'old_b', 'c' => 'new_c']]);
+ $mergedCatalogue->setMetadata('a', 'foo', 'messages');
+ $mergedCatalogue->setMetadata('b', 'bar', 'messages');
+ $mergedCatalogue->setMetadata('c', 'qux', 'messages');
+
+ $this->assertEquals(
+ $mergedCatalogue,
+ $this->createOperation(
+ $leftCatalogue,
+ $rightCatalogue
+ )->getResult()
+ );
+ }
+
+ protected function createOperation(MessageCatalogueInterface $source, MessageCatalogueInterface $target)
+ {
+ return new MergeOperation($source, $target);
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Catalogue/TargetOperationTest.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Catalogue/TargetOperationTest.php
new file mode 100644
index 0000000..d4608f6
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Catalogue/TargetOperationTest.php
@@ -0,0 +1,109 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Tests\Catalogue;
+
+use Symfony\Component\Translation\Catalogue\TargetOperation;
+use Symfony\Component\Translation\MessageCatalogue;
+use Symfony\Component\Translation\MessageCatalogueInterface;
+
+class TargetOperationTest extends AbstractOperationTest
+{
+ public function testGetMessagesFromSingleDomain()
+ {
+ $operation = $this->createOperation(
+ new MessageCatalogue('en', ['messages' => ['a' => 'old_a', 'b' => 'old_b']]),
+ new MessageCatalogue('en', ['messages' => ['a' => 'new_a', 'c' => 'new_c']])
+ );
+
+ $this->assertEquals(
+ ['a' => 'old_a', 'c' => 'new_c'],
+ $operation->getMessages('messages')
+ );
+
+ $this->assertEquals(
+ ['c' => 'new_c'],
+ $operation->getNewMessages('messages')
+ );
+
+ $this->assertEquals(
+ ['b' => 'old_b'],
+ $operation->getObsoleteMessages('messages')
+ );
+ }
+
+ public function testGetResultFromSingleDomain()
+ {
+ $this->assertEquals(
+ new MessageCatalogue('en', [
+ 'messages' => ['a' => 'old_a', 'c' => 'new_c'],
+ ]),
+ $this->createOperation(
+ new MessageCatalogue('en', ['messages' => ['a' => 'old_a', 'b' => 'old_b']]),
+ new MessageCatalogue('en', ['messages' => ['a' => 'new_a', 'c' => 'new_c']])
+ )->getResult()
+ );
+ }
+
+ public function testGetResultFromIntlDomain()
+ {
+ $this->assertEquals(
+ new MessageCatalogue('en', [
+ 'messages' => ['a' => 'old_a'],
+ 'messages+intl-icu' => ['c' => 'new_c'],
+ ]),
+ $this->createOperation(
+ new MessageCatalogue('en', ['messages' => ['a' => 'old_a'], 'messages+intl-icu' => ['b' => 'old_b']]),
+ new MessageCatalogue('en', ['messages' => ['a' => 'new_a'], 'messages+intl-icu' => ['c' => 'new_c']])
+ )->getResult()
+ );
+ }
+
+ public function testGetResultWithMixedDomains()
+ {
+ $this->assertEquals(
+ new MessageCatalogue('en', [
+ 'messages+intl-icu' => ['a' => 'old_a'],
+ ]),
+ $this->createOperation(
+ new MessageCatalogue('en', ['messages' => ['a' => 'old_a']]),
+ new MessageCatalogue('en', ['messages+intl-icu' => ['a' => 'new_a']])
+ )->getResult()
+ );
+ }
+
+ public function testGetResultWithMetadata()
+ {
+ $leftCatalogue = new MessageCatalogue('en', ['messages' => ['a' => 'old_a', 'b' => 'old_b']]);
+ $leftCatalogue->setMetadata('a', 'foo', 'messages');
+ $leftCatalogue->setMetadata('b', 'bar', 'messages');
+ $rightCatalogue = new MessageCatalogue('en', ['messages' => ['b' => 'new_b', 'c' => 'new_c']]);
+ $rightCatalogue->setMetadata('b', 'baz', 'messages');
+ $rightCatalogue->setMetadata('c', 'qux', 'messages');
+
+ $diffCatalogue = new MessageCatalogue('en', ['messages' => ['b' => 'old_b', 'c' => 'new_c']]);
+ $diffCatalogue->setMetadata('b', 'bar', 'messages');
+ $diffCatalogue->setMetadata('c', 'qux', 'messages');
+
+ $this->assertEquals(
+ $diffCatalogue,
+ $this->createOperation(
+ $leftCatalogue,
+ $rightCatalogue
+ )->getResult()
+ );
+ }
+
+ protected function createOperation(MessageCatalogueInterface $source, MessageCatalogueInterface $target)
+ {
+ return new TargetOperation($source, $target);
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Command/XliffLintCommandTest.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Command/XliffLintCommandTest.php
new file mode 100644
index 0000000..272ee15
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Command/XliffLintCommandTest.php
@@ -0,0 +1,199 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Tests\Command;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\Console\Application;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Tester\CommandTester;
+use Symfony\Component\Translation\Command\XliffLintCommand;
+
+/**
+ * Tests the XliffLintCommand.
+ *
+ * @author Javier Eguiluz
+ */
+class XliffLintCommandTest extends TestCase
+{
+ private $files;
+
+ public function testLintCorrectFile()
+ {
+ $tester = $this->createCommandTester();
+ $filename = $this->createFile();
+
+ $tester->execute(
+ ['filename' => $filename],
+ ['verbosity' => OutputInterface::VERBOSITY_VERBOSE, 'decorated' => false]
+ );
+
+ $this->assertEquals(0, $tester->getStatusCode(), 'Returns 0 in case of success');
+ $this->assertStringContainsString('OK', trim($tester->getDisplay()));
+ }
+
+ public function testLintCorrectFiles()
+ {
+ $tester = $this->createCommandTester();
+ $filename1 = $this->createFile();
+ $filename2 = $this->createFile();
+
+ $tester->execute(
+ ['filename' => [$filename1, $filename2]],
+ ['verbosity' => OutputInterface::VERBOSITY_VERBOSE, 'decorated' => false]
+ );
+
+ $this->assertEquals(0, $tester->getStatusCode(), 'Returns 0 in case of success');
+ $this->assertStringContainsString('OK', trim($tester->getDisplay()));
+ }
+
+ /**
+ * @dataProvider provideStrictFilenames
+ */
+ public function testStrictFilenames($requireStrictFileNames, $fileNamePattern, $targetLanguage, $mustFail)
+ {
+ $tester = $this->createCommandTester($requireStrictFileNames);
+ $filename = $this->createFile('note', $targetLanguage, $fileNamePattern);
+
+ $tester->execute(
+ ['filename' => $filename],
+ ['verbosity' => OutputInterface::VERBOSITY_VERBOSE, 'decorated' => false]
+ );
+
+ $this->assertEquals($mustFail ? 1 : 0, $tester->getStatusCode());
+ $this->assertStringContainsString($mustFail ? '[WARNING] 0 XLIFF files have valid syntax and 1 contain errors.' : '[OK] All 1 XLIFF files contain valid syntax.', $tester->getDisplay());
+ }
+
+ public function testLintIncorrectXmlSyntax()
+ {
+ $tester = $this->createCommandTester();
+ $filename = $this->createFile('note ');
+
+ $tester->execute(['filename' => $filename], ['decorated' => false]);
+
+ $this->assertEquals(1, $tester->getStatusCode(), 'Returns 1 in case of error');
+ $this->assertStringContainsString('Opening and ending tag mismatch: target line 6 and source', trim($tester->getDisplay()));
+ }
+
+ public function testLintIncorrectTargetLanguage()
+ {
+ $tester = $this->createCommandTester();
+ $filename = $this->createFile('note', 'es');
+
+ $tester->execute(['filename' => $filename], ['decorated' => false]);
+
+ $this->assertEquals(1, $tester->getStatusCode(), 'Returns 1 in case of error');
+ $this->assertStringContainsString('There is a mismatch between the language included in the file name ("messages.en.xlf") and the "es" value used in the "target-language" attribute of the file.', trim($tester->getDisplay()));
+ }
+
+ public function testLintTargetLanguageIsCaseInsensitive()
+ {
+ $tester = $this->createCommandTester();
+ $filename = $this->createFile('note', 'zh-cn', 'messages.zh_CN.xlf');
+
+ $tester->execute(['filename' => $filename], ['decorated' => false]);
+
+ $this->assertEquals(0, $tester->getStatusCode());
+ $this->assertStringContainsString('[OK] All 1 XLIFF files contain valid syntax.', trim($tester->getDisplay()));
+ }
+
+ public function testLintFileNotReadable()
+ {
+ $this->expectException('RuntimeException');
+ $tester = $this->createCommandTester();
+ $filename = $this->createFile();
+ unlink($filename);
+
+ $tester->execute(['filename' => $filename], ['decorated' => false]);
+ }
+
+ public function testGetHelp()
+ {
+ $command = new XliffLintCommand();
+ $expected = <<php %command.full_name% dirname
+ php %command.full_name% dirname --format=json
+
+EOF;
+
+ $this->assertStringContainsString($expected, $command->getHelp());
+ }
+
+ private function createFile($sourceContent = 'note', $targetLanguage = 'en', $fileNamePattern = 'messages.%locale%.xlf'): string
+ {
+ $xliffContent = <<
+
+
+
+
+ $sourceContent
+ NOTE
+
+
+
+
+XLIFF;
+
+ $filename = sprintf('%s/translation-xliff-lint-test/%s', sys_get_temp_dir(), str_replace('%locale%', 'en', $fileNamePattern));
+ file_put_contents($filename, $xliffContent);
+
+ $this->files[] = $filename;
+
+ return $filename;
+ }
+
+ private function createCommandTester($requireStrictFileNames = true, $application = null): CommandTester
+ {
+ if (!$application) {
+ $application = new Application();
+ $application->add(new XliffLintCommand(null, null, null, $requireStrictFileNames));
+ }
+
+ $command = $application->find('lint:xliff');
+
+ if ($application) {
+ $command->setApplication($application);
+ }
+
+ return new CommandTester($command);
+ }
+
+ protected function setUp(): void
+ {
+ $this->files = [];
+ @mkdir(sys_get_temp_dir().'/translation-xliff-lint-test');
+ }
+
+ protected function tearDown(): void
+ {
+ foreach ($this->files as $file) {
+ if (file_exists($file)) {
+ unlink($file);
+ }
+ }
+ rmdir(sys_get_temp_dir().'/translation-xliff-lint-test');
+ }
+
+ public function provideStrictFilenames()
+ {
+ yield [false, 'messages.%locale%.xlf', 'en', false];
+ yield [false, 'messages.%locale%.xlf', 'es', true];
+ yield [false, '%locale%.messages.xlf', 'en', false];
+ yield [false, '%locale%.messages.xlf', 'es', true];
+ yield [true, 'messages.%locale%.xlf', 'en', false];
+ yield [true, 'messages.%locale%.xlf', 'es', true];
+ yield [true, '%locale%.messages.xlf', 'en', true];
+ yield [true, '%locale%.messages.xlf', 'es', true];
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/DataCollector/TranslationDataCollectorTest.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/DataCollector/TranslationDataCollectorTest.php
new file mode 100644
index 0000000..1a600c8
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/DataCollector/TranslationDataCollectorTest.php
@@ -0,0 +1,150 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Tests\DataCollector;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\Translation\DataCollector\TranslationDataCollector;
+use Symfony\Component\Translation\DataCollectorTranslator;
+
+class TranslationDataCollectorTest extends TestCase
+{
+ protected function setUp(): void
+ {
+ if (!class_exists('Symfony\Component\HttpKernel\DataCollector\DataCollector')) {
+ $this->markTestSkipped('The "DataCollector" is not available');
+ }
+ }
+
+ public function testCollectEmptyMessages()
+ {
+ $translator = $this->getTranslator();
+ $translator->expects($this->any())->method('getCollectedMessages')->willReturn([]);
+
+ $dataCollector = new TranslationDataCollector($translator);
+ $dataCollector->lateCollect();
+
+ $this->assertEquals(0, $dataCollector->getCountMissings());
+ $this->assertEquals(0, $dataCollector->getCountFallbacks());
+ $this->assertEquals(0, $dataCollector->getCountDefines());
+ $this->assertEquals([], $dataCollector->getMessages()->getValue());
+ }
+
+ public function testCollect()
+ {
+ $collectedMessages = [
+ [
+ 'id' => 'foo',
+ 'translation' => 'foo (en)',
+ 'locale' => 'en',
+ 'domain' => 'messages',
+ 'state' => DataCollectorTranslator::MESSAGE_DEFINED,
+ 'parameters' => [],
+ 'transChoiceNumber' => null,
+ ],
+ [
+ 'id' => 'bar',
+ 'translation' => 'bar (fr)',
+ 'locale' => 'fr',
+ 'domain' => 'messages',
+ 'state' => DataCollectorTranslator::MESSAGE_EQUALS_FALLBACK,
+ 'parameters' => [],
+ 'transChoiceNumber' => null,
+ ],
+ [
+ 'id' => 'choice',
+ 'translation' => 'choice',
+ 'locale' => 'en',
+ 'domain' => 'messages',
+ 'state' => DataCollectorTranslator::MESSAGE_MISSING,
+ 'parameters' => ['%count%' => 3],
+ 'transChoiceNumber' => 3,
+ ],
+ [
+ 'id' => 'choice',
+ 'translation' => 'choice',
+ 'locale' => 'en',
+ 'domain' => 'messages',
+ 'state' => DataCollectorTranslator::MESSAGE_MISSING,
+ 'parameters' => ['%count%' => 3],
+ 'transChoiceNumber' => 3,
+ ],
+ [
+ 'id' => 'choice',
+ 'translation' => 'choice',
+ 'locale' => 'en',
+ 'domain' => 'messages',
+ 'state' => DataCollectorTranslator::MESSAGE_MISSING,
+ 'parameters' => ['%count%' => 4, '%foo%' => 'bar'],
+ 'transChoiceNumber' => 4,
+ ],
+ ];
+ $expectedMessages = [
+ [
+ 'id' => 'foo',
+ 'translation' => 'foo (en)',
+ 'locale' => 'en',
+ 'domain' => 'messages',
+ 'state' => DataCollectorTranslator::MESSAGE_DEFINED,
+ 'count' => 1,
+ 'parameters' => [],
+ 'transChoiceNumber' => null,
+ ],
+ [
+ 'id' => 'bar',
+ 'translation' => 'bar (fr)',
+ 'locale' => 'fr',
+ 'domain' => 'messages',
+ 'state' => DataCollectorTranslator::MESSAGE_EQUALS_FALLBACK,
+ 'count' => 1,
+ 'parameters' => [],
+ 'transChoiceNumber' => null,
+ ],
+ [
+ 'id' => 'choice',
+ 'translation' => 'choice',
+ 'locale' => 'en',
+ 'domain' => 'messages',
+ 'state' => DataCollectorTranslator::MESSAGE_MISSING,
+ 'count' => 3,
+ 'parameters' => [
+ ['%count%' => 3],
+ ['%count%' => 3],
+ ['%count%' => 4, '%foo%' => 'bar'],
+ ],
+ 'transChoiceNumber' => 3,
+ ],
+ ];
+
+ $translator = $this->getTranslator();
+ $translator->expects($this->any())->method('getCollectedMessages')->willReturn($collectedMessages);
+
+ $dataCollector = new TranslationDataCollector($translator);
+ $dataCollector->lateCollect();
+
+ $this->assertEquals(1, $dataCollector->getCountMissings());
+ $this->assertEquals(1, $dataCollector->getCountFallbacks());
+ $this->assertEquals(1, $dataCollector->getCountDefines());
+
+ $this->assertEquals($expectedMessages, array_values($dataCollector->getMessages()->getValue(true)));
+ }
+
+ private function getTranslator()
+ {
+ $translator = $this
+ ->getMockBuilder('Symfony\Component\Translation\DataCollectorTranslator')
+ ->disableOriginalConstructor()
+ ->getMock()
+ ;
+
+ return $translator;
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/DataCollectorTranslatorTest.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/DataCollectorTranslatorTest.php
new file mode 100644
index 0000000..d3de1e2
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/DataCollectorTranslatorTest.php
@@ -0,0 +1,122 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Tests;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\Translation\DataCollectorTranslator;
+use Symfony\Component\Translation\Loader\ArrayLoader;
+use Symfony\Component\Translation\Translator;
+
+class DataCollectorTranslatorTest extends TestCase
+{
+ public function testCollectMessages()
+ {
+ $collector = $this->createCollector();
+ $collector->setFallbackLocales(['fr', 'ru']);
+
+ $collector->trans('foo');
+ $collector->trans('bar');
+ $collector->trans('choice', ['%count%' => 0]);
+ $collector->trans('bar_ru');
+ $collector->trans('bar_ru', ['foo' => 'bar']);
+
+ $expectedMessages = [];
+ $expectedMessages[] = [
+ 'id' => 'foo',
+ 'translation' => 'foo (en)',
+ 'locale' => 'en',
+ 'fallbackLocale' => null,
+ 'domain' => 'messages',
+ 'state' => DataCollectorTranslator::MESSAGE_DEFINED,
+ 'parameters' => [],
+ 'transChoiceNumber' => null,
+ ];
+ $expectedMessages[] = [
+ 'id' => 'bar',
+ 'translation' => 'bar (fr)',
+ 'locale' => 'en',
+ 'fallbackLocale' => 'fr',
+ 'domain' => 'messages',
+ 'state' => DataCollectorTranslator::MESSAGE_EQUALS_FALLBACK,
+ 'parameters' => [],
+ 'transChoiceNumber' => null,
+ ];
+ $expectedMessages[] = [
+ 'id' => 'choice',
+ 'translation' => 'choice',
+ 'locale' => 'en',
+ 'fallbackLocale' => null,
+ 'domain' => 'messages',
+ 'state' => DataCollectorTranslator::MESSAGE_MISSING,
+ 'parameters' => ['%count%' => 0],
+ 'transChoiceNumber' => 0,
+ ];
+ $expectedMessages[] = [
+ 'id' => 'bar_ru',
+ 'translation' => 'bar (ru)',
+ 'locale' => 'en',
+ 'fallbackLocale' => 'ru',
+ 'domain' => 'messages',
+ 'state' => DataCollectorTranslator::MESSAGE_EQUALS_FALLBACK,
+ 'parameters' => [],
+ 'transChoiceNumber' => null,
+ ];
+ $expectedMessages[] = [
+ 'id' => 'bar_ru',
+ 'translation' => 'bar (ru)',
+ 'locale' => 'en',
+ 'fallbackLocale' => 'ru',
+ 'domain' => 'messages',
+ 'state' => DataCollectorTranslator::MESSAGE_EQUALS_FALLBACK,
+ 'parameters' => ['foo' => 'bar'],
+ 'transChoiceNumber' => null,
+ ];
+
+ $this->assertEquals($expectedMessages, $collector->getCollectedMessages());
+ }
+
+ /**
+ * @group legacy
+ */
+ public function testCollectMessagesTransChoice()
+ {
+ $collector = $this->createCollector();
+ $collector->setFallbackLocales(['fr', 'ru']);
+ $collector->transChoice('choice', 0);
+
+ $expectedMessages = [];
+
+ $expectedMessages[] = [
+ 'id' => 'choice',
+ 'translation' => 'choice',
+ 'locale' => 'en',
+ 'fallbackLocale' => null,
+ 'domain' => 'messages',
+ 'state' => DataCollectorTranslator::MESSAGE_MISSING,
+ 'parameters' => ['%count%' => 0],
+ 'transChoiceNumber' => 0,
+ ];
+
+ $this->assertEquals($expectedMessages, $collector->getCollectedMessages());
+ }
+
+ private function createCollector()
+ {
+ $translator = new Translator('en');
+ $translator->addLoader('array', new ArrayLoader());
+ $translator->addResource('array', ['foo' => 'foo (en)'], 'en');
+ $translator->addResource('array', ['bar' => 'bar (fr)'], 'fr');
+ $translator->addResource('array', ['bar_ru' => 'bar (ru)'], 'ru');
+
+ return new DataCollectorTranslator($translator);
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/DependencyInjection/TranslationDumperPassTest.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/DependencyInjection/TranslationDumperPassTest.php
new file mode 100644
index 0000000..94769e9
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/DependencyInjection/TranslationDumperPassTest.php
@@ -0,0 +1,48 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Tests\DependencyInjection;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Reference;
+use Symfony\Component\Translation\DependencyInjection\TranslationDumperPass;
+
+class TranslationDumperPassTest extends TestCase
+{
+ public function testProcess()
+ {
+ $container = new ContainerBuilder();
+ $writerDefinition = $container->register('translation.writer');
+ $container->register('foo.id')
+ ->addTag('translation.dumper', ['alias' => 'bar.alias']);
+
+ $translationDumperPass = new TranslationDumperPass();
+ $translationDumperPass->process($container);
+
+ $this->assertEquals([['addDumper', ['bar.alias', new Reference('foo.id')]]], $writerDefinition->getMethodCalls());
+ }
+
+ public function testProcessNoDefinitionFound()
+ {
+ $container = new ContainerBuilder();
+
+ $definitionsBefore = \count($container->getDefinitions());
+ $aliasesBefore = \count($container->getAliases());
+
+ $translationDumperPass = new TranslationDumperPass();
+ $translationDumperPass->process($container);
+
+ // the container is untouched (i.e. no new definitions or aliases)
+ $this->assertCount($definitionsBefore, $container->getDefinitions());
+ $this->assertCount($aliasesBefore, $container->getAliases());
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/DependencyInjection/TranslationExtractorPassTest.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/DependencyInjection/TranslationExtractorPassTest.php
new file mode 100644
index 0000000..113536b
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/DependencyInjection/TranslationExtractorPassTest.php
@@ -0,0 +1,61 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Tests\DependencyInjection;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Reference;
+use Symfony\Component\Translation\DependencyInjection\TranslationExtractorPass;
+
+class TranslationExtractorPassTest extends TestCase
+{
+ public function testProcess()
+ {
+ $container = new ContainerBuilder();
+ $extractorDefinition = $container->register('translation.extractor');
+ $container->register('foo.id')
+ ->addTag('translation.extractor', ['alias' => 'bar.alias']);
+
+ $translationDumperPass = new TranslationExtractorPass();
+ $translationDumperPass->process($container);
+
+ $this->assertEquals([['addExtractor', ['bar.alias', new Reference('foo.id')]]], $extractorDefinition->getMethodCalls());
+ }
+
+ public function testProcessNoDefinitionFound()
+ {
+ $container = new ContainerBuilder();
+
+ $definitionsBefore = \count($container->getDefinitions());
+ $aliasesBefore = \count($container->getAliases());
+
+ $translationDumperPass = new TranslationExtractorPass();
+ $translationDumperPass->process($container);
+
+ // the container is untouched (i.e. no new definitions or aliases)
+ $this->assertCount($definitionsBefore, $container->getDefinitions());
+ $this->assertCount($aliasesBefore, $container->getAliases());
+ }
+
+ public function testProcessMissingAlias()
+ {
+ $this->expectException('Symfony\Component\DependencyInjection\Exception\RuntimeException');
+ $this->expectExceptionMessage('The alias for the tag "translation.extractor" of service "foo.id" must be set.');
+ $container = new ContainerBuilder();
+ $container->register('translation.extractor');
+ $container->register('foo.id')
+ ->addTag('translation.extractor', []);
+
+ $translationDumperPass = new TranslationExtractorPass();
+ $translationDumperPass->process($container);
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/DependencyInjection/TranslationPassTest.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/DependencyInjection/TranslationPassTest.php
new file mode 100644
index 0000000..f62fc85
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/DependencyInjection/TranslationPassTest.php
@@ -0,0 +1,122 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Tests\DependencyInjection;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\DependencyInjection\Argument\ServiceClosureArgument;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Definition;
+use Symfony\Component\DependencyInjection\Reference;
+use Symfony\Component\Translation\DependencyInjection\TranslatorPass;
+
+class TranslationPassTest extends TestCase
+{
+ public function testValidCollector()
+ {
+ $loader = (new Definition())
+ ->addTag('translation.loader', ['alias' => 'xliff', 'legacy-alias' => 'xlf']);
+
+ $reader = new Definition();
+
+ $translator = (new Definition())
+ ->setArguments([null, null, null, null]);
+
+ $container = new ContainerBuilder();
+ $container->setDefinition('translator.default', $translator);
+ $container->setDefinition('translation.reader', $reader);
+ $container->setDefinition('translation.xliff_loader', $loader);
+
+ $pass = new TranslatorPass('translator.default', 'translation.reader');
+ $pass->process($container);
+
+ $expectedReader = (new Definition())
+ ->addMethodCall('addLoader', ['xliff', new Reference('translation.xliff_loader')])
+ ->addMethodCall('addLoader', ['xlf', new Reference('translation.xliff_loader')])
+ ;
+ $this->assertEquals($expectedReader, $reader);
+
+ $expectedLoader = (new Definition())
+ ->addTag('translation.loader', ['alias' => 'xliff', 'legacy-alias' => 'xlf'])
+ ;
+ $this->assertEquals($expectedLoader, $loader);
+
+ $this->assertSame(['translation.xliff_loader' => ['xliff', 'xlf']], $translator->getArgument(3));
+
+ $expected = ['translation.xliff_loader' => new ServiceClosureArgument(new Reference('translation.xliff_loader'))];
+ $this->assertEquals($expected, $container->getDefinition((string) $translator->getArgument(0))->getArgument(0));
+ }
+
+ public function testValidCommandsViewPathsArgument()
+ {
+ $container = new ContainerBuilder();
+ $container->register('translator.default')
+ ->setArguments([null, null, null, null])
+ ;
+ $debugCommand = $container->register('console.command.translation_debug')
+ ->setArguments([null, null, null, null, null, [], []])
+ ;
+ $updateCommand = $container->register('console.command.translation_update')
+ ->setArguments([null, null, null, null, null, null, [], []])
+ ;
+ $container->register('twig.template_iterator')
+ ->setArguments([null, null, ['other/templates' => null, 'tpl' => 'App']])
+ ;
+ $container->setParameter('twig.default_path', 'templates');
+
+ $pass = new TranslatorPass('translator.default');
+ $pass->process($container);
+
+ $expectedViewPaths = ['other/templates', 'tpl'];
+
+ $this->assertSame('templates', $debugCommand->getArgument(4));
+ $this->assertSame('templates', $updateCommand->getArgument(5));
+ $this->assertSame($expectedViewPaths, $debugCommand->getArgument(6));
+ $this->assertSame($expectedViewPaths, $updateCommand->getArgument(7));
+ }
+
+ public function testCommandsViewPathsArgumentsAreIgnoredWithOldServiceDefinitions()
+ {
+ $container = new ContainerBuilder();
+ $container->register('translator.default')
+ ->setArguments([null, null, null, null])
+ ;
+ $debugCommand = $container->register('console.command.translation_debug')
+ ->setArguments([
+ new Reference('translator'),
+ new Reference('translation.reader'),
+ new Reference('translation.extractor'),
+ '%translator.default_path%',
+ null,
+ ])
+ ;
+ $updateCommand = $container->register('console.command.translation_update')
+ ->setArguments([
+ new Reference('translation.writer'),
+ new Reference('translation.reader'),
+ new Reference('translation.extractor'),
+ '%kernel.default_locale%',
+ '%translator.default_path%',
+ null,
+ ])
+ ;
+ $container->register('twig.template_iterator')
+ ->setArguments([null, null, ['other/templates' => null, 'tpl' => 'App']])
+ ;
+ $container->setParameter('twig.default_path', 'templates');
+
+ $pass = new TranslatorPass('translator.default');
+ $pass->process($container);
+
+ $this->assertSame('templates', $debugCommand->getArgument(4));
+ $this->assertSame('templates', $updateCommand->getArgument(5));
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/DependencyInjection/TranslationPathsPassTest.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/DependencyInjection/TranslationPathsPassTest.php
new file mode 100644
index 0000000..42ab398
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/DependencyInjection/TranslationPathsPassTest.php
@@ -0,0 +1,89 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Tests\DependencyInjection;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\DependencyInjection\Argument\ServiceClosureArgument;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Definition;
+use Symfony\Component\DependencyInjection\Reference;
+use Symfony\Component\DependencyInjection\ServiceLocator;
+use Symfony\Component\Translation\DependencyInjection\TranslatorPathsPass;
+use Symfony\Component\Translation\Tests\DependencyInjection\fixtures\ControllerArguments;
+use Symfony\Component\Translation\Tests\DependencyInjection\fixtures\ServiceArguments;
+use Symfony\Component\Translation\Tests\DependencyInjection\fixtures\ServiceMethodCalls;
+use Symfony\Component\Translation\Tests\DependencyInjection\fixtures\ServiceProperties;
+use Symfony\Component\Translation\Tests\DependencyInjection\fixtures\ServiceSubscriber;
+
+class TranslationPathsPassTest extends TestCase
+{
+ public function testProcess()
+ {
+ $container = new ContainerBuilder();
+ $container->register('translator');
+ $debugCommand = $container->register('console.command.translation_debug')
+ ->setArguments([null, null, null, null, null, [], []])
+ ;
+ $updateCommand = $container->register('console.command.translation_update')
+ ->setArguments([null, null, null, null, null, null, [], []])
+ ;
+ $container->register(ControllerArguments::class, ControllerArguments::class)
+ ->setTags(['controller.service_arguments'])
+ ;
+ $container->register(ServiceArguments::class, ServiceArguments::class)
+ ->setArguments([new Reference('translator')])
+ ;
+ $container->register(ServiceProperties::class, ServiceProperties::class)
+ ->setProperties([new Reference('translator')])
+ ;
+ $container->register(ServiceMethodCalls::class, ServiceMethodCalls::class)
+ ->setMethodCalls([['setTranslator', [new Reference('translator')]]])
+ ;
+ $container->register('service_rc')
+ ->setArguments([new Definition(), new Reference(ServiceMethodCalls::class)])
+ ;
+ $serviceLocator1 = $container->register('.service_locator.foo', ServiceLocator::class)
+ ->setArguments([new ServiceClosureArgument(new Reference('translator'))])
+ ;
+ $serviceLocator2 = (new Definition(ServiceLocator::class))
+ ->setArguments([ServiceSubscriber::class, new Reference('service_container')])
+ ->setFactory([$serviceLocator1, 'withContext'])
+ ;
+ $container->register('service_subscriber', ServiceSubscriber::class)
+ ->setArguments([$serviceLocator2])
+ ;
+ $container->register('.service_locator.bar', ServiceLocator::class)
+ ->setArguments([[
+ ControllerArguments::class.'::index' => new ServiceClosureArgument(new Reference('.service_locator.foo')),
+ ControllerArguments::class.'::__invoke' => new ServiceClosureArgument(new Reference('.service_locator.foo')),
+ ControllerArguments::class => new ServiceClosureArgument(new Reference('.service_locator.foo')),
+ ]])
+ ;
+ $container->register('argument_resolver.service')
+ ->setArguments([new Reference('.service_locator.bar')])
+ ;
+
+ $pass = new TranslatorPathsPass('translator', 'console.command.translation_debug', 'console.command.translation_update', 'argument_resolver.service');
+ $pass->process($container);
+
+ $expectedPaths = [
+ $container->getReflectionClass(ServiceArguments::class)->getFileName(),
+ $container->getReflectionClass(ServiceProperties::class)->getFileName(),
+ $container->getReflectionClass(ServiceMethodCalls::class)->getFileName(),
+ $container->getReflectionClass(ControllerArguments::class)->getFileName(),
+ $container->getReflectionClass(ServiceSubscriber::class)->getFileName(),
+ ];
+
+ $this->assertSame($expectedPaths, $debugCommand->getArgument(6));
+ $this->assertSame($expectedPaths, $updateCommand->getArgument(7));
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/DependencyInjection/fixtures/ControllerArguments.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/DependencyInjection/fixtures/ControllerArguments.php
new file mode 100644
index 0000000..97a53fa
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/DependencyInjection/fixtures/ControllerArguments.php
@@ -0,0 +1,16 @@
+ TranslatorInterface::class];
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Dumper/CsvFileDumperTest.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Dumper/CsvFileDumperTest.php
new file mode 100644
index 0000000..0d1cf2c
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Dumper/CsvFileDumperTest.php
@@ -0,0 +1,30 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Tests\Dumper;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\Translation\Dumper\CsvFileDumper;
+use Symfony\Component\Translation\MessageCatalogue;
+
+class CsvFileDumperTest extends TestCase
+{
+ public function testFormatCatalogue()
+ {
+ $catalogue = new MessageCatalogue('en');
+ $catalogue->add(['foo' => 'bar', 'bar' => 'foo
+foo', 'foo;foo' => 'bar']);
+
+ $dumper = new CsvFileDumper();
+
+ $this->assertStringEqualsFile(__DIR__.'/../fixtures/valid.csv', $dumper->formatCatalogue($catalogue, 'messages'));
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Dumper/FileDumperTest.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Dumper/FileDumperTest.php
new file mode 100644
index 0000000..6e42b1e
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Dumper/FileDumperTest.php
@@ -0,0 +1,90 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Tests\Dumper;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\Translation\Dumper\FileDumper;
+use Symfony\Component\Translation\MessageCatalogue;
+
+class FileDumperTest extends TestCase
+{
+ public function testDump()
+ {
+ $tempDir = sys_get_temp_dir();
+
+ $catalogue = new MessageCatalogue('en');
+ $catalogue->add(['foo' => 'bar']);
+
+ $dumper = new ConcreteFileDumper();
+ $dumper->dump($catalogue, ['path' => $tempDir]);
+
+ $this->assertFileExists($tempDir.'/messages.en.concrete');
+
+ @unlink($tempDir.'/messages.en.concrete');
+ }
+
+ public function testDumpIntl()
+ {
+ $tempDir = sys_get_temp_dir();
+
+ $catalogue = new MessageCatalogue('en');
+ $catalogue->add(['foo' => 'bar'], 'd1');
+ $catalogue->add(['bar' => 'foo'], 'd1+intl-icu');
+ $catalogue->add(['bar' => 'foo'], 'd2+intl-icu');
+
+ $dumper = new ConcreteFileDumper();
+ @unlink($tempDir.'/d2.en.concrete');
+ $dumper->dump($catalogue, ['path' => $tempDir]);
+
+ $this->assertStringEqualsFile($tempDir.'/d1.en.concrete', 'foo=bar');
+ @unlink($tempDir.'/d1.en.concrete');
+
+ $this->assertStringEqualsFile($tempDir.'/d1+intl-icu.en.concrete', 'bar=foo');
+ @unlink($tempDir.'/d1+intl-icu.en.concrete');
+
+ $this->assertFileNotExists($tempDir.'/d2.en.concrete');
+ $this->assertStringEqualsFile($tempDir.'/d2+intl-icu.en.concrete', 'bar=foo');
+ @unlink($tempDir.'/d2+intl-icu.en.concrete');
+ }
+
+ public function testDumpCreatesNestedDirectoriesAndFile()
+ {
+ $tempDir = sys_get_temp_dir();
+ $translationsDir = $tempDir.'/test/translations';
+ $file = $translationsDir.'/messages.en.concrete';
+
+ $catalogue = new MessageCatalogue('en');
+ $catalogue->add(['foo' => 'bar']);
+
+ $dumper = new ConcreteFileDumper();
+ $dumper->setRelativePathTemplate('test/translations/%domain%.%locale%.%extension%');
+ $dumper->dump($catalogue, ['path' => $tempDir]);
+
+ $this->assertFileExists($file);
+
+ @unlink($file);
+ @rmdir($translationsDir);
+ }
+}
+
+class ConcreteFileDumper extends FileDumper
+{
+ public function formatCatalogue(MessageCatalogue $messages, $domain, array $options = []): string
+ {
+ return http_build_query($messages->all($domain), '', '&');
+ }
+
+ protected function getExtension(): string
+ {
+ return 'concrete';
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Dumper/IcuResFileDumperTest.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Dumper/IcuResFileDumperTest.php
new file mode 100644
index 0000000..dcb9c2c
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Dumper/IcuResFileDumperTest.php
@@ -0,0 +1,29 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Tests\Dumper;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\Translation\Dumper\IcuResFileDumper;
+use Symfony\Component\Translation\MessageCatalogue;
+
+class IcuResFileDumperTest extends TestCase
+{
+ public function testFormatCatalogue()
+ {
+ $catalogue = new MessageCatalogue('en');
+ $catalogue->add(['foo' => 'bar']);
+
+ $dumper = new IcuResFileDumper();
+
+ $this->assertStringEqualsFile(__DIR__.'/../fixtures/resourcebundle/res/en.res', $dumper->formatCatalogue($catalogue, 'messages'));
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Dumper/IniFileDumperTest.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Dumper/IniFileDumperTest.php
new file mode 100644
index 0000000..1ed168b
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Dumper/IniFileDumperTest.php
@@ -0,0 +1,29 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Tests\Dumper;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\Translation\Dumper\IniFileDumper;
+use Symfony\Component\Translation\MessageCatalogue;
+
+class IniFileDumperTest extends TestCase
+{
+ public function testFormatCatalogue()
+ {
+ $catalogue = new MessageCatalogue('en');
+ $catalogue->add(['foo' => 'bar']);
+
+ $dumper = new IniFileDumper();
+
+ $this->assertStringEqualsFile(__DIR__.'/../fixtures/resources.ini', $dumper->formatCatalogue($catalogue, 'messages'));
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Dumper/JsonFileDumperTest.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Dumper/JsonFileDumperTest.php
new file mode 100644
index 0000000..04e3d86
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Dumper/JsonFileDumperTest.php
@@ -0,0 +1,39 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Tests\Dumper;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\Translation\Dumper\JsonFileDumper;
+use Symfony\Component\Translation\MessageCatalogue;
+
+class JsonFileDumperTest extends TestCase
+{
+ public function testFormatCatalogue()
+ {
+ $catalogue = new MessageCatalogue('en');
+ $catalogue->add(['foo' => 'bar']);
+
+ $dumper = new JsonFileDumper();
+
+ $this->assertStringEqualsFile(__DIR__.'/../fixtures/resources.json', $dumper->formatCatalogue($catalogue, 'messages'));
+ }
+
+ public function testDumpWithCustomEncoding()
+ {
+ $catalogue = new MessageCatalogue('en');
+ $catalogue->add(['foo' => '"bar"']);
+
+ $dumper = new JsonFileDumper();
+
+ $this->assertStringEqualsFile(__DIR__.'/../fixtures/resources.dump.json', $dumper->formatCatalogue($catalogue, 'messages', ['json_encoding' => JSON_HEX_QUOT]));
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Dumper/MoFileDumperTest.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Dumper/MoFileDumperTest.php
new file mode 100644
index 0000000..fbbd75d
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Dumper/MoFileDumperTest.php
@@ -0,0 +1,29 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Tests\Dumper;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\Translation\Dumper\MoFileDumper;
+use Symfony\Component\Translation\MessageCatalogue;
+
+class MoFileDumperTest extends TestCase
+{
+ public function testFormatCatalogue()
+ {
+ $catalogue = new MessageCatalogue('en');
+ $catalogue->add(['foo' => 'bar']);
+
+ $dumper = new MoFileDumper();
+
+ $this->assertStringEqualsFile(__DIR__.'/../fixtures/resources.mo', $dumper->formatCatalogue($catalogue, 'messages'));
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Dumper/PhpFileDumperTest.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Dumper/PhpFileDumperTest.php
new file mode 100644
index 0000000..00e535d
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Dumper/PhpFileDumperTest.php
@@ -0,0 +1,29 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Tests\Dumper;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\Translation\Dumper\PhpFileDumper;
+use Symfony\Component\Translation\MessageCatalogue;
+
+class PhpFileDumperTest extends TestCase
+{
+ public function testFormatCatalogue()
+ {
+ $catalogue = new MessageCatalogue('en');
+ $catalogue->add(['foo' => 'bar']);
+
+ $dumper = new PhpFileDumper();
+
+ $this->assertStringEqualsFile(__DIR__.'/../fixtures/resources.php', $dumper->formatCatalogue($catalogue, 'messages'));
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Dumper/PoFileDumperTest.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Dumper/PoFileDumperTest.php
new file mode 100644
index 0000000..81f35f2
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Dumper/PoFileDumperTest.php
@@ -0,0 +1,61 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Tests\Dumper;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\Translation\Dumper\PoFileDumper;
+use Symfony\Component\Translation\MessageCatalogue;
+
+class PoFileDumperTest extends TestCase
+{
+ public function testFormatCatalogue()
+ {
+ $catalogue = new MessageCatalogue('en');
+ $catalogue->add(['foo' => 'bar', 'bar' => 'foo', 'foo_bar' => 'foobar', 'bar_foo' => 'barfoo']);
+ $catalogue->setMetadata('foo_bar', [
+ 'comments' => [
+ 'Comment 1',
+ 'Comment 2',
+ ],
+ 'flags' => [
+ 'fuzzy',
+ 'another',
+ ],
+ 'sources' => [
+ 'src/file_1',
+ 'src/file_2:50',
+ ],
+ ]);
+ $catalogue->setMetadata('bar_foo', [
+ 'comments' => 'Comment',
+ 'flags' => 'fuzzy',
+ 'sources' => 'src/file_1',
+ ]);
+
+ $dumper = new PoFileDumper();
+
+ $this->assertStringEqualsFile(__DIR__.'/../fixtures/resources.po', $dumper->formatCatalogue($catalogue, 'messages'));
+ }
+
+ public function testDumpPlurals()
+ {
+ $catalogue = new MessageCatalogue('en');
+ $catalogue->add([
+ 'foo|foos' => 'bar|bars',
+ '{0} no foos|one foo|%count% foos' => '{0} no bars|one bar|%count% bars',
+ ]);
+
+ $dumper = new PoFileDumper();
+
+ $this->assertStringEqualsFile(__DIR__.'/../fixtures/plurals.po', $dumper->formatCatalogue($catalogue, 'messages'));
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Dumper/QtFileDumperTest.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Dumper/QtFileDumperTest.php
new file mode 100644
index 0000000..6c4b559
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Dumper/QtFileDumperTest.php
@@ -0,0 +1,48 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Tests\Dumper;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\Translation\Dumper\QtFileDumper;
+use Symfony\Component\Translation\MessageCatalogue;
+
+class QtFileDumperTest extends TestCase
+{
+ public function testFormatCatalogue()
+ {
+ $catalogue = new MessageCatalogue('en');
+ $catalogue->add(['foo' => 'bar', 'foo_bar' => 'foobar', 'bar_foo' => 'barfoo'], 'resources');
+ $catalogue->setMetadata('foo_bar', [
+ 'comments' => [
+ 'Comment 1',
+ 'Comment 2',
+ ],
+ 'flags' => [
+ 'fuzzy',
+ 'another',
+ ],
+ 'sources' => [
+ 'src/file_1',
+ 'src/file_2:50',
+ ],
+ ], 'resources');
+ $catalogue->setMetadata('bar_foo', [
+ 'comments' => 'Comment',
+ 'flags' => 'fuzzy',
+ 'sources' => 'src/file_1',
+ ], 'resources');
+
+ $dumper = new QtFileDumper();
+
+ $this->assertStringEqualsFile(__DIR__.'/../fixtures/resources.ts', $dumper->formatCatalogue($catalogue, 'resources'));
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Dumper/XliffFileDumperTest.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Dumper/XliffFileDumperTest.php
new file mode 100644
index 0000000..6377132
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Dumper/XliffFileDumperTest.php
@@ -0,0 +1,130 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Tests\Dumper;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\Translation\Dumper\XliffFileDumper;
+use Symfony\Component\Translation\MessageCatalogue;
+
+class XliffFileDumperTest extends TestCase
+{
+ public function testFormatCatalogue()
+ {
+ $catalogue = new MessageCatalogue('en_US');
+ $catalogue->add([
+ 'foo' => 'bar',
+ 'key' => '',
+ 'key.with.cdata' => ' & ',
+ ]);
+ $catalogue->setMetadata('foo', ['notes' => [['priority' => 1, 'from' => 'bar', 'content' => 'baz']]]);
+ $catalogue->setMetadata('key', ['notes' => [['content' => 'baz'], ['content' => 'qux']]]);
+
+ $dumper = new XliffFileDumper();
+
+ $this->assertStringEqualsFile(
+ __DIR__.'/../fixtures/resources-clean.xlf',
+ $dumper->formatCatalogue($catalogue, 'messages', ['default_locale' => 'fr_FR'])
+ );
+ }
+
+ public function testFormatCatalogueXliff2()
+ {
+ $catalogue = new MessageCatalogue('en_US');
+ $catalogue->add([
+ 'foo' => 'bar',
+ 'key' => '',
+ 'key.with.cdata' => ' & ',
+ ]);
+ $catalogue->setMetadata('key', ['target-attributes' => ['order' => 1]]);
+
+ $dumper = new XliffFileDumper();
+
+ $this->assertStringEqualsFile(
+ __DIR__.'/../fixtures/resources-2.0-clean.xlf',
+ $dumper->formatCatalogue($catalogue, 'messages', ['default_locale' => 'fr_FR', 'xliff_version' => '2.0'])
+ );
+ }
+
+ public function testFormatIcuCatalogueXliff2()
+ {
+ $catalogue = new MessageCatalogue('en_US');
+ $catalogue->add([
+ 'foo' => 'bar',
+ ], 'messages'.MessageCatalogue::INTL_DOMAIN_SUFFIX);
+
+ $dumper = new XliffFileDumper();
+
+ $this->assertStringEqualsFile(
+ __DIR__.'/../fixtures/resources-2.0+intl-icu.xlf',
+ $dumper->formatCatalogue($catalogue, 'messages'.MessageCatalogue::INTL_DOMAIN_SUFFIX, ['default_locale' => 'fr_FR', 'xliff_version' => '2.0'])
+ );
+ }
+
+ public function testFormatCatalogueWithCustomToolInfo()
+ {
+ $options = [
+ 'default_locale' => 'en_US',
+ 'tool_info' => ['tool-id' => 'foo', 'tool-name' => 'foo', 'tool-version' => '0.0', 'tool-company' => 'Foo'],
+ ];
+
+ $catalogue = new MessageCatalogue('en_US');
+ $catalogue->add(['foo' => 'bar']);
+
+ $dumper = new XliffFileDumper();
+
+ $this->assertStringEqualsFile(
+ __DIR__.'/../fixtures/resources-tool-info.xlf',
+ $dumper->formatCatalogue($catalogue, 'messages', $options)
+ );
+ }
+
+ public function testFormatCatalogueWithTargetAttributesMetadata()
+ {
+ $catalogue = new MessageCatalogue('en_US');
+ $catalogue->add([
+ 'foo' => 'bar',
+ ]);
+ $catalogue->setMetadata('foo', ['target-attributes' => ['state' => 'needs-translation']]);
+
+ $dumper = new XliffFileDumper();
+
+ $this->assertStringEqualsFile(
+ __DIR__.'/../fixtures/resources-target-attributes.xlf',
+ $dumper->formatCatalogue($catalogue, 'messages', ['default_locale' => 'fr_FR'])
+ );
+ }
+
+ public function testFormatCatalogueWithNotesMetadata()
+ {
+ $catalogue = new MessageCatalogue('en_US');
+ $catalogue->add([
+ 'foo' => 'bar',
+ 'baz' => 'biz',
+ ]);
+ $catalogue->setMetadata('foo', ['notes' => [
+ ['category' => 'state', 'content' => 'new'],
+ ['category' => 'approved', 'content' => 'true'],
+ ['category' => 'section', 'content' => 'user login', 'priority' => '1'],
+ ]]);
+ $catalogue->setMetadata('baz', ['notes' => [
+ ['id' => 'x', 'content' => 'x_content'],
+ ['appliesTo' => 'target', 'category' => 'quality', 'content' => 'Fuzzy'],
+ ]]);
+
+ $dumper = new XliffFileDumper();
+
+ $this->assertStringEqualsFile(
+ __DIR__.'/../fixtures/resources-notes-meta.xlf',
+ $dumper->formatCatalogue($catalogue, 'messages', ['default_locale' => 'fr_FR', 'xliff_version' => '2.0'])
+ );
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Dumper/YamlFileDumperTest.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Dumper/YamlFileDumperTest.php
new file mode 100644
index 0000000..e46da5a
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Dumper/YamlFileDumperTest.php
@@ -0,0 +1,45 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Tests\Dumper;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\Translation\Dumper\YamlFileDumper;
+use Symfony\Component\Translation\MessageCatalogue;
+
+class YamlFileDumperTest extends TestCase
+{
+ public function testTreeFormatCatalogue()
+ {
+ $catalogue = new MessageCatalogue('en');
+ $catalogue->add([
+ 'foo.bar1' => 'value1',
+ 'foo.bar2' => 'value2',
+ ]);
+
+ $dumper = new YamlFileDumper();
+
+ $this->assertStringEqualsFile(__DIR__.'/../fixtures/messages.yml', $dumper->formatCatalogue($catalogue, 'messages', ['as_tree' => true, 'inline' => 999]));
+ }
+
+ public function testLinearFormatCatalogue()
+ {
+ $catalogue = new MessageCatalogue('en');
+ $catalogue->add([
+ 'foo.bar1' => 'value1',
+ 'foo.bar2' => 'value2',
+ ]);
+
+ $dumper = new YamlFileDumper();
+
+ $this->assertStringEqualsFile(__DIR__.'/../fixtures/messages_linear.yml', $dumper->formatCatalogue($catalogue, 'messages'));
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Extractor/PhpExtractorTest.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Extractor/PhpExtractorTest.php
new file mode 100644
index 0000000..a6d7c50
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Extractor/PhpExtractorTest.php
@@ -0,0 +1,101 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Tests\Extractor;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\Translation\Extractor\PhpExtractor;
+use Symfony\Component\Translation\MessageCatalogue;
+
+class PhpExtractorTest extends TestCase
+{
+ /**
+ * @dataProvider resourcesProvider
+ *
+ * @param array|string $resource
+ */
+ public function testExtraction($resource)
+ {
+ // Arrange
+ $extractor = new PhpExtractor();
+ $extractor->setPrefix('prefix');
+ $catalogue = new MessageCatalogue('en');
+
+ // Act
+ $extractor->extract($resource, $catalogue);
+
+ $expectedHeredoc = << [
+ 'single-quoted key' => 'prefixsingle-quoted key',
+ 'double-quoted key' => 'prefixdouble-quoted key',
+ 'heredoc key' => 'prefixheredoc key',
+ 'nowdoc key' => 'prefixnowdoc key',
+ "double-quoted key with whitespace and escaped \$\n\" sequences" => "prefixdouble-quoted key with whitespace and escaped \$\n\" sequences",
+ 'single-quoted key with whitespace and nonescaped \$\n\' sequences' => 'prefixsingle-quoted key with whitespace and nonescaped \$\n\' sequences',
+ 'single-quoted key with "quote mark at the end"' => 'prefixsingle-quoted key with "quote mark at the end"',
+ $expectedHeredoc => 'prefix'.$expectedHeredoc,
+ $expectedNowdoc => 'prefix'.$expectedNowdoc,
+ '{0} There is no apples|{1} There is one apple|]1,Inf[ There are %count% apples' => 'prefix{0} There is no apples|{1} There is one apple|]1,Inf[ There are %count% apples',
+ 'concatenated message with heredoc and nowdoc' => 'prefixconcatenated message with heredoc and nowdoc',
+ 'default domain' => 'prefixdefault domain',
+ ],
+ 'not_messages' => [
+ 'other-domain-test-no-params-short-array' => 'prefixother-domain-test-no-params-short-array',
+ 'other-domain-test-no-params-long-array' => 'prefixother-domain-test-no-params-long-array',
+ 'other-domain-test-params-short-array' => 'prefixother-domain-test-params-short-array',
+ 'other-domain-test-params-long-array' => 'prefixother-domain-test-params-long-array',
+ 'other-domain-test-trans-choice-short-array-%count%' => 'prefixother-domain-test-trans-choice-short-array-%count%',
+ 'other-domain-test-trans-choice-long-array-%count%' => 'prefixother-domain-test-trans-choice-long-array-%count%',
+ 'typecast' => 'prefixtypecast',
+ 'msg1' => 'prefixmsg1',
+ 'msg2' => 'prefixmsg2',
+ ],
+ ];
+ $actualCatalogue = $catalogue->all();
+
+ $this->assertEquals($expectedCatalogue, $actualCatalogue);
+
+ $filename = str_replace(\DIRECTORY_SEPARATOR, '/', __DIR__).'/../fixtures/extractor/translation.html.php';
+ $this->assertEquals(['sources' => [$filename.':2']], $catalogue->getMetadata('single-quoted key'));
+ $this->assertEquals(['sources' => [$filename.':43']], $catalogue->getMetadata('other-domain-test-no-params-short-array', 'not_messages'));
+ }
+
+ public function resourcesProvider()
+ {
+ $directory = __DIR__.'/../fixtures/extractor/';
+ $splFiles = [];
+ foreach (new \DirectoryIterator($directory) as $fileInfo) {
+ if ($fileInfo->isDot()) {
+ continue;
+ }
+ if ('translation.html.php' === $fileInfo->getBasename()) {
+ $phpFile = $fileInfo->getPathname();
+ }
+ $splFiles[] = $fileInfo->getFileInfo();
+ }
+
+ return [
+ [$directory],
+ [$phpFile],
+ [glob($directory.'*')],
+ [$splFiles],
+ [new \ArrayObject(glob($directory.'*'))],
+ [new \ArrayObject($splFiles)],
+ ];
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Formatter/IntlFormatterTest.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Formatter/IntlFormatterTest.php
new file mode 100644
index 0000000..37d982c
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Formatter/IntlFormatterTest.php
@@ -0,0 +1,101 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Tests\Formatter;
+
+use Symfony\Component\Translation\Exception\InvalidArgumentException;
+use Symfony\Component\Translation\Formatter\IntlFormatter;
+use Symfony\Component\Translation\Formatter\IntlFormatterInterface;
+
+/**
+ * @requires extension intl
+ */
+class IntlFormatterTest extends \PHPUnit\Framework\TestCase
+{
+ /**
+ * @dataProvider provideDataForFormat
+ */
+ public function testFormat($expected, $message, $arguments)
+ {
+ $this->assertEquals($expected, trim((new IntlFormatter())->formatIntl($message, 'en', $arguments)));
+ }
+
+ public function testInvalidFormat()
+ {
+ $this->expectException(InvalidArgumentException::class);
+ (new IntlFormatter())->formatIntl('{foo', 'en', [2]);
+ }
+
+ public function testFormatWithNamedArguments()
+ {
+ if (version_compare(INTL_ICU_VERSION, '4.8', '<')) {
+ $this->markTestSkipped('Format with named arguments can only be run with ICU 4.8 or higher and PHP >= 5.5');
+ }
+
+ $chooseMessage = <<<'_MSG_'
+{gender_of_host, select,
+ female {{num_guests, plural, offset:1
+ =0 {{host} does not give a party.}
+ =1 {{host} invites {guest} to her party.}
+ =2 {{host} invites {guest} and one other person to her party.}
+ other {{host} invites {guest} as one of the # people invited to her party.}}}
+ male {{num_guests, plural, offset:1
+ =0 {{host} does not give a party.}
+ =1 {{host} invites {guest} to his party.}
+ =2 {{host} invites {guest} and one other person to his party.}
+ other {{host} invites {guest} as one of the # people invited to his party.}}}
+ other {{num_guests, plural, offset:1
+ =0 {{host} does not give a party.}
+ =1 {{host} invites {guest} to their party.}
+ =2 {{host} invites {guest} and one other person to their party.}
+ other {{host} invites {guest} as one of the # people invited to their party.}}}}
+_MSG_;
+
+ $message = (new IntlFormatter())->formatIntl($chooseMessage, 'en', [
+ 'gender_of_host' => 'male',
+ 'num_guests' => 10,
+ 'host' => 'Fabien',
+ 'guest' => 'Guilherme',
+ ]);
+
+ $this->assertEquals('Fabien invites Guilherme as one of the 9 people invited to his party.', $message);
+ }
+
+ public function provideDataForFormat()
+ {
+ return [
+ [
+ 'There is one apple',
+ 'There is one apple',
+ [],
+ ],
+ [
+ '4,560 monkeys on 123 trees make 37.073 monkeys per tree',
+ '{0,number,integer} monkeys on {1,number,integer} trees make {2,number} monkeys per tree',
+ [4560, 123, 4560 / 123],
+ ],
+ [
+ '',
+ '',
+ [],
+ ],
+ ];
+ }
+
+ public function testPercentsAndBracketsAreTrimmed()
+ {
+ $formatter = new IntlFormatter();
+ $this->assertInstanceof(IntlFormatterInterface::class, $formatter);
+ $this->assertSame('Hello Fab', $formatter->formatIntl('Hello {name}', 'en', ['name' => 'Fab']));
+ $this->assertSame('Hello Fab', $formatter->formatIntl('Hello {name}', 'en', ['%name%' => 'Fab']));
+ $this->assertSame('Hello Fab', $formatter->formatIntl('Hello {name}', 'en', ['{{ name }}' => 'Fab']));
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Formatter/MessageFormatterTest.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Formatter/MessageFormatterTest.php
new file mode 100644
index 0000000..232bcf9
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Formatter/MessageFormatterTest.php
@@ -0,0 +1,83 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Tests\Formatter;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\Translation\Formatter\MessageFormatter;
+
+class MessageFormatterTest extends TestCase
+{
+ /**
+ * @dataProvider getTransMessages
+ */
+ public function testFormat($expected, $message, $parameters = [])
+ {
+ $this->assertEquals($expected, $this->getMessageFormatter()->format($message, 'en', $parameters));
+ }
+
+ /**
+ * @dataProvider getTransChoiceMessages
+ * @group legacy
+ */
+ public function testFormatPlural($expected, $message, $number, $parameters)
+ {
+ $this->assertEquals($expected, $this->getMessageFormatter()->choiceFormat($message, $number, 'fr', $parameters));
+ }
+
+ public function getTransMessages()
+ {
+ return [
+ [
+ 'There is one apple',
+ 'There is one apple',
+ ],
+ [
+ 'There are 5 apples',
+ 'There are %count% apples',
+ ['%count%' => 5],
+ ],
+ [
+ 'There are 5 apples',
+ 'There are {{count}} apples',
+ ['{{count}}' => 5],
+ ],
+ ];
+ }
+
+ public function getTransChoiceMessages()
+ {
+ return [
+ ['Il y a 0 pomme', '[0,1] Il y a %count% pomme|]1,Inf] Il y a %count% pommes', 0, ['%count%' => 0]],
+ ['Il y a 1 pomme', '[0,1] Il y a %count% pomme|]1,Inf] Il y a %count% pommes', 1, ['%count%' => 1]],
+ ['Il y a 10 pommes', '[0,1] Il y a %count% pomme|]1,Inf] Il y a %count% pommes', 10, ['%count%' => 10]],
+
+ ['Il y a 0 pomme', 'Il y a %count% pomme|Il y a %count% pommes', 0, ['%count%' => 0]],
+ ['Il y a 1 pomme', 'Il y a %count% pomme|Il y a %count% pommes', 1, ['%count%' => 1]],
+ ['Il y a 10 pommes', 'Il y a %count% pomme|Il y a %count% pommes', 10, ['%count%' => 10]],
+
+ ['Il y a 0 pomme', 'one: Il y a %count% pomme|more: Il y a %count% pommes', 0, ['%count%' => 0]],
+ ['Il y a 1 pomme', 'one: Il y a %count% pomme|more: Il y a %count% pommes', 1, ['%count%' => 1]],
+ ['Il y a 10 pommes', 'one: Il y a %count% pomme|more: Il y a %count% pommes', 10, ['%count%' => 10]],
+
+ ['Il n\'y a aucune pomme', '{0} Il n\'y a aucune pomme|one: Il y a %count% pomme|more: Il y a %count% pommes', 0, ['%count%' => 0]],
+ ['Il y a 1 pomme', '{0} Il n\'y a aucune pomme|one: Il y a %count% pomme|more: Il y a %count% pommes', 1, ['%count%' => 1]],
+ ['Il y a 10 pommes', '{0} Il n\'y a aucune pomme|one: Il y a %count% pomme|more: Il y a %count% pommes', 10, ['%count%' => 10]],
+
+ ['Il y a 0 pomme', '[0,1] Il y a %count% pomme|]1,Inf] Il y a %count% pommes', 0, ['%count%' => 0]],
+ ];
+ }
+
+ private function getMessageFormatter()
+ {
+ return new MessageFormatter();
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/IdentityTranslatorTest.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/IdentityTranslatorTest.php
new file mode 100644
index 0000000..a630a7a
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/IdentityTranslatorTest.php
@@ -0,0 +1,39 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Tests;
+
+use Symfony\Component\Translation\IdentityTranslator;
+use Symfony\Contracts\Translation\Test\TranslatorTest;
+
+class IdentityTranslatorTest extends TranslatorTest
+{
+ private $defaultLocale;
+
+ protected function setUp(): void
+ {
+ parent::setUp();
+
+ $this->defaultLocale = \Locale::getDefault();
+ }
+
+ protected function tearDown(): void
+ {
+ parent::tearDown();
+
+ \Locale::setDefault($this->defaultLocale);
+ }
+
+ public function getTranslator()
+ {
+ return new IdentityTranslator();
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/IntervalTest.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/IntervalTest.php
new file mode 100644
index 0000000..ea3e4d8
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/IntervalTest.php
@@ -0,0 +1,50 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Tests;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\Translation\Interval;
+
+/**
+ * @group legacy
+ */
+class IntervalTest extends TestCase
+{
+ /**
+ * @dataProvider getTests
+ */
+ public function testTest($expected, $number, $interval)
+ {
+ $this->assertEquals($expected, Interval::test($number, $interval));
+ }
+
+ public function testTestException()
+ {
+ $this->expectException('Symfony\Component\Translation\Exception\InvalidArgumentException');
+ Interval::test(1, 'foobar');
+ }
+
+ public function getTests()
+ {
+ return [
+ [true, 3, '{1,2, 3 ,4}'],
+ [false, 10, '{1,2, 3 ,4}'],
+ [false, 3, '[1,2]'],
+ [true, 1, '[1,2]'],
+ [true, 2, '[1,2]'],
+ [false, 1, ']1,2['],
+ [false, 2, ']1,2['],
+ [true, log(0), '[-Inf,2['],
+ [true, -log(0), '[-2,+Inf]'],
+ ];
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Loader/CsvFileLoaderTest.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Loader/CsvFileLoaderTest.php
new file mode 100644
index 0000000..9537e1f
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Loader/CsvFileLoaderTest.php
@@ -0,0 +1,57 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Tests\Loader;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\Config\Resource\FileResource;
+use Symfony\Component\Translation\Loader\CsvFileLoader;
+
+class CsvFileLoaderTest extends TestCase
+{
+ public function testLoad()
+ {
+ $loader = new CsvFileLoader();
+ $resource = __DIR__.'/../fixtures/resources.csv';
+ $catalogue = $loader->load($resource, 'en', 'domain1');
+
+ $this->assertEquals(['foo' => 'bar'], $catalogue->all('domain1'));
+ $this->assertEquals('en', $catalogue->getLocale());
+ $this->assertEquals([new FileResource($resource)], $catalogue->getResources());
+ }
+
+ public function testLoadDoesNothingIfEmpty()
+ {
+ $loader = new CsvFileLoader();
+ $resource = __DIR__.'/../fixtures/empty.csv';
+ $catalogue = $loader->load($resource, 'en', 'domain1');
+
+ $this->assertEquals([], $catalogue->all('domain1'));
+ $this->assertEquals('en', $catalogue->getLocale());
+ $this->assertEquals([new FileResource($resource)], $catalogue->getResources());
+ }
+
+ public function testLoadNonExistingResource()
+ {
+ $this->expectException('Symfony\Component\Translation\Exception\NotFoundResourceException');
+ $loader = new CsvFileLoader();
+ $resource = __DIR__.'/../fixtures/not-exists.csv';
+ $loader->load($resource, 'en', 'domain1');
+ }
+
+ public function testLoadNonLocalResource()
+ {
+ $this->expectException('Symfony\Component\Translation\Exception\InvalidResourceException');
+ $loader = new CsvFileLoader();
+ $resource = 'http://example.com/resources.csv';
+ $loader->load($resource, 'en', 'domain1');
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Loader/IcuDatFileLoaderTest.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Loader/IcuDatFileLoaderTest.php
new file mode 100644
index 0000000..77db041
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Loader/IcuDatFileLoaderTest.php
@@ -0,0 +1,60 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Tests\Loader;
+
+use Symfony\Component\Config\Resource\FileResource;
+use Symfony\Component\Translation\Loader\IcuDatFileLoader;
+
+/**
+ * @requires extension intl
+ */
+class IcuDatFileLoaderTest extends LocalizedTestCase
+{
+ public function testLoadInvalidResource()
+ {
+ $this->expectException('Symfony\Component\Translation\Exception\InvalidResourceException');
+ $loader = new IcuDatFileLoader();
+ $loader->load(__DIR__.'/../fixtures/resourcebundle/corrupted/resources', 'es', 'domain2');
+ }
+
+ public function testDatEnglishLoad()
+ {
+ // bundled resource is build using pkgdata command which at least in ICU 4.2 comes in extremely! buggy form
+ // you must specify an temporary build directory which is not the same as current directory and
+ // MUST reside on the same partition. pkgdata -p resources -T /srv -d.packagelist.txt
+ $loader = new IcuDatFileLoader();
+ $resource = __DIR__.'/../fixtures/resourcebundle/dat/resources';
+ $catalogue = $loader->load($resource, 'en', 'domain1');
+
+ $this->assertEquals(['symfony' => 'Symfony 2 is great'], $catalogue->all('domain1'));
+ $this->assertEquals('en', $catalogue->getLocale());
+ $this->assertEquals([new FileResource($resource.'.dat')], $catalogue->getResources());
+ }
+
+ public function testDatFrenchLoad()
+ {
+ $loader = new IcuDatFileLoader();
+ $resource = __DIR__.'/../fixtures/resourcebundle/dat/resources';
+ $catalogue = $loader->load($resource, 'fr', 'domain1');
+
+ $this->assertEquals(['symfony' => 'Symfony 2 est génial'], $catalogue->all('domain1'));
+ $this->assertEquals('fr', $catalogue->getLocale());
+ $this->assertEquals([new FileResource($resource.'.dat')], $catalogue->getResources());
+ }
+
+ public function testLoadNonExistingResource()
+ {
+ $this->expectException('Symfony\Component\Translation\Exception\NotFoundResourceException');
+ $loader = new IcuDatFileLoader();
+ $loader->load(__DIR__.'/../fixtures/non-existing.txt', 'en', 'domain1');
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Loader/IcuResFileLoaderTest.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Loader/IcuResFileLoaderTest.php
new file mode 100644
index 0000000..99b2f90
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Loader/IcuResFileLoaderTest.php
@@ -0,0 +1,47 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Tests\Loader;
+
+use Symfony\Component\Config\Resource\DirectoryResource;
+use Symfony\Component\Translation\Loader\IcuResFileLoader;
+
+/**
+ * @requires extension intl
+ */
+class IcuResFileLoaderTest extends LocalizedTestCase
+{
+ public function testLoad()
+ {
+ // resource is build using genrb command
+ $loader = new IcuResFileLoader();
+ $resource = __DIR__.'/../fixtures/resourcebundle/res';
+ $catalogue = $loader->load($resource, 'en', 'domain1');
+
+ $this->assertEquals(['foo' => 'bar'], $catalogue->all('domain1'));
+ $this->assertEquals('en', $catalogue->getLocale());
+ $this->assertEquals([new DirectoryResource($resource)], $catalogue->getResources());
+ }
+
+ public function testLoadNonExistingResource()
+ {
+ $this->expectException('Symfony\Component\Translation\Exception\NotFoundResourceException');
+ $loader = new IcuResFileLoader();
+ $loader->load(__DIR__.'/../fixtures/non-existing.txt', 'en', 'domain1');
+ }
+
+ public function testLoadInvalidResource()
+ {
+ $this->expectException('Symfony\Component\Translation\Exception\InvalidResourceException');
+ $loader = new IcuResFileLoader();
+ $loader->load(__DIR__.'/../fixtures/resourcebundle/corrupted', 'en', 'domain1');
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Loader/IniFileLoaderTest.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Loader/IniFileLoaderTest.php
new file mode 100644
index 0000000..fd66e20
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Loader/IniFileLoaderTest.php
@@ -0,0 +1,49 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Tests\Loader;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\Config\Resource\FileResource;
+use Symfony\Component\Translation\Loader\IniFileLoader;
+
+class IniFileLoaderTest extends TestCase
+{
+ public function testLoad()
+ {
+ $loader = new IniFileLoader();
+ $resource = __DIR__.'/../fixtures/resources.ini';
+ $catalogue = $loader->load($resource, 'en', 'domain1');
+
+ $this->assertEquals(['foo' => 'bar'], $catalogue->all('domain1'));
+ $this->assertEquals('en', $catalogue->getLocale());
+ $this->assertEquals([new FileResource($resource)], $catalogue->getResources());
+ }
+
+ public function testLoadDoesNothingIfEmpty()
+ {
+ $loader = new IniFileLoader();
+ $resource = __DIR__.'/../fixtures/empty.ini';
+ $catalogue = $loader->load($resource, 'en', 'domain1');
+
+ $this->assertEquals([], $catalogue->all('domain1'));
+ $this->assertEquals('en', $catalogue->getLocale());
+ $this->assertEquals([new FileResource($resource)], $catalogue->getResources());
+ }
+
+ public function testLoadNonExistingResource()
+ {
+ $this->expectException('Symfony\Component\Translation\Exception\NotFoundResourceException');
+ $loader = new IniFileLoader();
+ $resource = __DIR__.'/../fixtures/non-existing.ini';
+ $loader->load($resource, 'en', 'domain1');
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Loader/JsonFileLoaderTest.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Loader/JsonFileLoaderTest.php
new file mode 100644
index 0000000..c5a9ca6
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Loader/JsonFileLoaderTest.php
@@ -0,0 +1,58 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Tests\Loader;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\Config\Resource\FileResource;
+use Symfony\Component\Translation\Loader\JsonFileLoader;
+
+class JsonFileLoaderTest extends TestCase
+{
+ public function testLoad()
+ {
+ $loader = new JsonFileLoader();
+ $resource = __DIR__.'/../fixtures/resources.json';
+ $catalogue = $loader->load($resource, 'en', 'domain1');
+
+ $this->assertEquals(['foo' => 'bar'], $catalogue->all('domain1'));
+ $this->assertEquals('en', $catalogue->getLocale());
+ $this->assertEquals([new FileResource($resource)], $catalogue->getResources());
+ }
+
+ public function testLoadDoesNothingIfEmpty()
+ {
+ $loader = new JsonFileLoader();
+ $resource = __DIR__.'/../fixtures/empty.json';
+ $catalogue = $loader->load($resource, 'en', 'domain1');
+
+ $this->assertEquals([], $catalogue->all('domain1'));
+ $this->assertEquals('en', $catalogue->getLocale());
+ $this->assertEquals([new FileResource($resource)], $catalogue->getResources());
+ }
+
+ public function testLoadNonExistingResource()
+ {
+ $this->expectException('Symfony\Component\Translation\Exception\NotFoundResourceException');
+ $loader = new JsonFileLoader();
+ $resource = __DIR__.'/../fixtures/non-existing.json';
+ $loader->load($resource, 'en', 'domain1');
+ }
+
+ public function testParseException()
+ {
+ $this->expectException('Symfony\Component\Translation\Exception\InvalidResourceException');
+ $this->expectExceptionMessage('Error parsing JSON: Syntax error, malformed JSON');
+ $loader = new JsonFileLoader();
+ $resource = __DIR__.'/../fixtures/malformed.json';
+ $loader->load($resource, 'en', 'domain1');
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Loader/LocalizedTestCase.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Loader/LocalizedTestCase.php
new file mode 100644
index 0000000..b4a4a12
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Loader/LocalizedTestCase.php
@@ -0,0 +1,24 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Tests\Loader;
+
+use PHPUnit\Framework\TestCase;
+
+abstract class LocalizedTestCase extends TestCase
+{
+ protected function setUp(): void
+ {
+ if (!\extension_loaded('intl')) {
+ $this->markTestSkipped('Extension intl is required.');
+ }
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Loader/MoFileLoaderTest.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Loader/MoFileLoaderTest.php
new file mode 100644
index 0000000..3fe3a99
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Loader/MoFileLoaderTest.php
@@ -0,0 +1,71 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Tests\Loader;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\Config\Resource\FileResource;
+use Symfony\Component\Translation\Loader\MoFileLoader;
+
+class MoFileLoaderTest extends TestCase
+{
+ public function testLoad()
+ {
+ $loader = new MoFileLoader();
+ $resource = __DIR__.'/../fixtures/resources.mo';
+ $catalogue = $loader->load($resource, 'en', 'domain1');
+
+ $this->assertEquals(['foo' => 'bar'], $catalogue->all('domain1'));
+ $this->assertEquals('en', $catalogue->getLocale());
+ $this->assertEquals([new FileResource($resource)], $catalogue->getResources());
+ }
+
+ public function testLoadPlurals()
+ {
+ $loader = new MoFileLoader();
+ $resource = __DIR__.'/../fixtures/plurals.mo';
+ $catalogue = $loader->load($resource, 'en', 'domain1');
+
+ $this->assertEquals([
+ 'foo|foos' => 'bar|bars',
+ '{0} no foos|one foo|%count% foos' => '{0} no bars|one bar|%count% bars',
+ ], $catalogue->all('domain1'));
+ $this->assertEquals('en', $catalogue->getLocale());
+ $this->assertEquals([new FileResource($resource)], $catalogue->getResources());
+ }
+
+ public function testLoadNonExistingResource()
+ {
+ $this->expectException('Symfony\Component\Translation\Exception\NotFoundResourceException');
+ $loader = new MoFileLoader();
+ $resource = __DIR__.'/../fixtures/non-existing.mo';
+ $loader->load($resource, 'en', 'domain1');
+ }
+
+ public function testLoadInvalidResource()
+ {
+ $this->expectException('Symfony\Component\Translation\Exception\InvalidResourceException');
+ $loader = new MoFileLoader();
+ $resource = __DIR__.'/../fixtures/empty.mo';
+ $loader->load($resource, 'en', 'domain1');
+ }
+
+ public function testLoadEmptyTranslation()
+ {
+ $loader = new MoFileLoader();
+ $resource = __DIR__.'/../fixtures/empty-translation.mo';
+ $catalogue = $loader->load($resource, 'en', 'message');
+
+ $this->assertEquals([], $catalogue->all('message'));
+ $this->assertEquals('en', $catalogue->getLocale());
+ $this->assertEquals([new FileResource($resource)], $catalogue->getResources());
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Loader/PhpFileLoaderTest.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Loader/PhpFileLoaderTest.php
new file mode 100644
index 0000000..d4da645
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Loader/PhpFileLoaderTest.php
@@ -0,0 +1,46 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Tests\Loader;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\Config\Resource\FileResource;
+use Symfony\Component\Translation\Loader\PhpFileLoader;
+
+class PhpFileLoaderTest extends TestCase
+{
+ public function testLoad()
+ {
+ $loader = new PhpFileLoader();
+ $resource = __DIR__.'/../fixtures/resources.php';
+ $catalogue = $loader->load($resource, 'en', 'domain1');
+
+ $this->assertEquals(['foo' => 'bar'], $catalogue->all('domain1'));
+ $this->assertEquals('en', $catalogue->getLocale());
+ $this->assertEquals([new FileResource($resource)], $catalogue->getResources());
+ }
+
+ public function testLoadNonExistingResource()
+ {
+ $this->expectException('Symfony\Component\Translation\Exception\NotFoundResourceException');
+ $loader = new PhpFileLoader();
+ $resource = __DIR__.'/../fixtures/non-existing.php';
+ $loader->load($resource, 'en', 'domain1');
+ }
+
+ public function testLoadThrowsAnExceptionIfFileNotLocal()
+ {
+ $this->expectException('Symfony\Component\Translation\Exception\InvalidResourceException');
+ $loader = new PhpFileLoader();
+ $resource = 'http://example.com/resources.php';
+ $loader->load($resource, 'en', 'domain1');
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Loader/PoFileLoaderTest.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Loader/PoFileLoaderTest.php
new file mode 100644
index 0000000..72c4c66
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Loader/PoFileLoaderTest.php
@@ -0,0 +1,120 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Tests\Loader;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\Config\Resource\FileResource;
+use Symfony\Component\Translation\Loader\PoFileLoader;
+
+class PoFileLoaderTest extends TestCase
+{
+ public function testLoad()
+ {
+ $loader = new PoFileLoader();
+ $resource = __DIR__.'/../fixtures/resources.po';
+ $catalogue = $loader->load($resource, 'en', 'domain1');
+
+ $this->assertEquals(['foo' => 'bar', 'bar' => 'foo'], $catalogue->all('domain1'));
+ $this->assertEquals('en', $catalogue->getLocale());
+ $this->assertEquals([new FileResource($resource)], $catalogue->getResources());
+ }
+
+ public function testLoadPlurals()
+ {
+ $loader = new PoFileLoader();
+ $resource = __DIR__.'/../fixtures/plurals.po';
+ $catalogue = $loader->load($resource, 'en', 'domain1');
+
+ $this->assertEquals([
+ 'foo|foos' => 'bar|bars',
+ '{0} no foos|one foo|%count% foos' => '{0} no bars|one bar|%count% bars',
+ ], $catalogue->all('domain1'));
+ $this->assertEquals('en', $catalogue->getLocale());
+ $this->assertEquals([new FileResource($resource)], $catalogue->getResources());
+ }
+
+ public function testLoadDoesNothingIfEmpty()
+ {
+ $loader = new PoFileLoader();
+ $resource = __DIR__.'/../fixtures/empty.po';
+ $catalogue = $loader->load($resource, 'en', 'domain1');
+
+ $this->assertEquals([], $catalogue->all('domain1'));
+ $this->assertEquals('en', $catalogue->getLocale());
+ $this->assertEquals([new FileResource($resource)], $catalogue->getResources());
+ }
+
+ public function testLoadNonExistingResource()
+ {
+ $this->expectException('Symfony\Component\Translation\Exception\NotFoundResourceException');
+ $loader = new PoFileLoader();
+ $resource = __DIR__.'/../fixtures/non-existing.po';
+ $loader->load($resource, 'en', 'domain1');
+ }
+
+ public function testLoadEmptyTranslation()
+ {
+ $loader = new PoFileLoader();
+ $resource = __DIR__.'/../fixtures/empty-translation.po';
+ $catalogue = $loader->load($resource, 'en', 'domain1');
+
+ $this->assertEquals(['foo' => ''], $catalogue->all('domain1'));
+ $this->assertEquals('en', $catalogue->getLocale());
+ $this->assertEquals([new FileResource($resource)], $catalogue->getResources());
+ }
+
+ public function testEscapedId()
+ {
+ $loader = new PoFileLoader();
+ $resource = __DIR__.'/../fixtures/escaped-id.po';
+ $catalogue = $loader->load($resource, 'en', 'domain1');
+
+ $messages = $catalogue->all('domain1');
+ $this->assertArrayHasKey('escaped "foo"', $messages);
+ $this->assertEquals('escaped "bar"', $messages['escaped "foo"']);
+ }
+
+ public function testEscapedIdPlurals()
+ {
+ $loader = new PoFileLoader();
+ $resource = __DIR__.'/../fixtures/escaped-id-plurals.po';
+ $catalogue = $loader->load($resource, 'en', 'domain1');
+
+ $messages = $catalogue->all('domain1');
+ $this->assertArrayHasKey('escaped "foo"|escaped "foos"', $messages);
+ $this->assertEquals('escaped "bar"|escaped "bars"', $messages['escaped "foo"|escaped "foos"']);
+ }
+
+ public function testSkipFuzzyTranslations()
+ {
+ $loader = new PoFileLoader();
+ $resource = __DIR__.'/../fixtures/fuzzy-translations.po';
+ $catalogue = $loader->load($resource, 'en', 'domain1');
+
+ $messages = $catalogue->all('domain1');
+ $this->assertArrayHasKey('foo1', $messages);
+ $this->assertArrayNotHasKey('foo2', $messages);
+ $this->assertArrayHasKey('foo3', $messages);
+ }
+
+ public function testMissingPlurals()
+ {
+ $loader = new PoFileLoader();
+ $resource = __DIR__.'/../fixtures/missing-plurals.po';
+ $catalogue = $loader->load($resource, 'en', 'domain1');
+
+ $this->assertEquals([
+ 'foo|foos' => '-|bar|-|bars',
+ ], $catalogue->all('domain1'));
+ $this->assertEquals('en', $catalogue->getLocale());
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Loader/QtFileLoaderTest.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Loader/QtFileLoaderTest.php
new file mode 100644
index 0000000..95981c7
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Loader/QtFileLoaderTest.php
@@ -0,0 +1,69 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Tests\Loader;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\Config\Resource\FileResource;
+use Symfony\Component\Translation\Loader\QtFileLoader;
+
+class QtFileLoaderTest extends TestCase
+{
+ public function testLoad()
+ {
+ $loader = new QtFileLoader();
+ $resource = __DIR__.'/../fixtures/resources.ts';
+ $catalogue = $loader->load($resource, 'en', 'resources');
+
+ $this->assertEquals([
+ 'foo' => 'bar',
+ 'foo_bar' => 'foobar',
+ 'bar_foo' => 'barfoo',
+ ], $catalogue->all('resources'));
+ $this->assertEquals('en', $catalogue->getLocale());
+ $this->assertEquals([new FileResource($resource)], $catalogue->getResources());
+ }
+
+ public function testLoadNonExistingResource()
+ {
+ $this->expectException('Symfony\Component\Translation\Exception\NotFoundResourceException');
+ $loader = new QtFileLoader();
+ $resource = __DIR__.'/../fixtures/non-existing.ts';
+ $loader->load($resource, 'en', 'domain1');
+ }
+
+ public function testLoadNonLocalResource()
+ {
+ $this->expectException('Symfony\Component\Translation\Exception\InvalidResourceException');
+ $loader = new QtFileLoader();
+ $resource = 'http://domain1.com/resources.ts';
+ $loader->load($resource, 'en', 'domain1');
+ }
+
+ public function testLoadInvalidResource()
+ {
+ $this->expectException('Symfony\Component\Translation\Exception\InvalidResourceException');
+ $loader = new QtFileLoader();
+ $resource = __DIR__.'/../fixtures/invalid-xml-resources.xlf';
+ $loader->load($resource, 'en', 'domain1');
+ }
+
+ public function testLoadEmptyResource()
+ {
+ $loader = new QtFileLoader();
+ $resource = __DIR__.'/../fixtures/empty.xlf';
+
+ $this->expectException('Symfony\Component\Translation\Exception\InvalidResourceException');
+ $this->expectExceptionMessage(sprintf('Unable to load "%s".', $resource));
+
+ $loader->load($resource, 'en', 'domain1');
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Loader/XliffFileLoaderTest.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Loader/XliffFileLoaderTest.php
new file mode 100644
index 0000000..79e51f1
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Loader/XliffFileLoaderTest.php
@@ -0,0 +1,317 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Tests\Loader;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\Config\Resource\FileResource;
+use Symfony\Component\Translation\Loader\XliffFileLoader;
+
+class XliffFileLoaderTest extends TestCase
+{
+ public function testLoad()
+ {
+ $loader = new XliffFileLoader();
+ $resource = __DIR__.'/../fixtures/resources.xlf';
+ $catalogue = $loader->load($resource, 'en', 'domain1');
+
+ $this->assertEquals('en', $catalogue->getLocale());
+ $this->assertEquals([new FileResource($resource)], $catalogue->getResources());
+ $this->assertSame([], libxml_get_errors());
+ $this->assertContainsOnly('string', $catalogue->all('domain1'));
+ }
+
+ public function testLoadWithInternalErrorsEnabled()
+ {
+ $internalErrors = libxml_use_internal_errors(true);
+
+ $this->assertSame([], libxml_get_errors());
+
+ $loader = new XliffFileLoader();
+ $resource = __DIR__.'/../fixtures/resources.xlf';
+ $catalogue = $loader->load($resource, 'en', 'domain1');
+
+ $this->assertEquals('en', $catalogue->getLocale());
+ $this->assertEquals([new FileResource($resource)], $catalogue->getResources());
+ $this->assertSame([], libxml_get_errors());
+
+ libxml_clear_errors();
+ libxml_use_internal_errors($internalErrors);
+ }
+
+ public function testLoadWithExternalEntitiesDisabled()
+ {
+ $disableEntities = libxml_disable_entity_loader(true);
+
+ $loader = new XliffFileLoader();
+ $resource = __DIR__.'/../fixtures/resources.xlf';
+ $catalogue = $loader->load($resource, 'en', 'domain1');
+
+ libxml_disable_entity_loader($disableEntities);
+
+ $this->assertEquals('en', $catalogue->getLocale());
+ $this->assertEquals([new FileResource($resource)], $catalogue->getResources());
+ }
+
+ public function testLoadWithResname()
+ {
+ $loader = new XliffFileLoader();
+ $catalogue = $loader->load(__DIR__.'/../fixtures/resname.xlf', 'en', 'domain1');
+
+ $this->assertEquals(['foo' => 'bar', 'bar' => 'baz', 'baz' => 'foo', 'qux' => 'qux source'], $catalogue->all('domain1'));
+ }
+
+ public function testIncompleteResource()
+ {
+ $loader = new XliffFileLoader();
+ $catalogue = $loader->load(__DIR__.'/../fixtures/resources.xlf', 'en', 'domain1');
+
+ $this->assertEquals(['foo' => 'bar', 'extra' => 'extra', 'key' => '', 'test' => 'with'], $catalogue->all('domain1'));
+ }
+
+ public function testEncoding()
+ {
+ $loader = new XliffFileLoader();
+ $catalogue = $loader->load(__DIR__.'/../fixtures/encoding.xlf', 'en', 'domain1');
+
+ $this->assertEquals(utf8_decode('föö'), $catalogue->get('bar', 'domain1'));
+ $this->assertEquals(utf8_decode('bär'), $catalogue->get('foo', 'domain1'));
+ $this->assertEquals(
+ [
+ 'source' => 'foo',
+ 'notes' => [['content' => utf8_decode('bäz')]],
+ 'id' => '1',
+ 'file' => [
+ 'original' => 'file.ext',
+ ],
+ ],
+ $catalogue->getMetadata('foo', 'domain1')
+ );
+ }
+
+ public function testTargetAttributesAreStoredCorrectly()
+ {
+ $loader = new XliffFileLoader();
+ $catalogue = $loader->load(__DIR__.'/../fixtures/with-attributes.xlf', 'en', 'domain1');
+
+ $metadata = $catalogue->getMetadata('foo', 'domain1');
+ $this->assertEquals('translated', $metadata['target-attributes']['state']);
+ }
+
+ public function testLoadInvalidResource()
+ {
+ $this->expectException('Symfony\Component\Translation\Exception\InvalidResourceException');
+ $loader = new XliffFileLoader();
+ $loader->load(__DIR__.'/../fixtures/resources.php', 'en', 'domain1');
+ }
+
+ public function testLoadResourceDoesNotValidate()
+ {
+ $this->expectException('Symfony\Component\Translation\Exception\InvalidResourceException');
+ $loader = new XliffFileLoader();
+ $loader->load(__DIR__.'/../fixtures/non-valid.xlf', 'en', 'domain1');
+ }
+
+ public function testLoadNonExistingResource()
+ {
+ $this->expectException('Symfony\Component\Translation\Exception\NotFoundResourceException');
+ $loader = new XliffFileLoader();
+ $resource = __DIR__.'/../fixtures/non-existing.xlf';
+ $loader->load($resource, 'en', 'domain1');
+ }
+
+ public function testLoadThrowsAnExceptionIfFileNotLocal()
+ {
+ $this->expectException('Symfony\Component\Translation\Exception\InvalidResourceException');
+ $loader = new XliffFileLoader();
+ $resource = 'http://example.com/resources.xlf';
+ $loader->load($resource, 'en', 'domain1');
+ }
+
+ public function testDocTypeIsNotAllowed()
+ {
+ $this->expectException('Symfony\Component\Translation\Exception\InvalidResourceException');
+ $this->expectExceptionMessage('Document types are not allowed.');
+ $loader = new XliffFileLoader();
+ $loader->load(__DIR__.'/../fixtures/withdoctype.xlf', 'en', 'domain1');
+ }
+
+ public function testParseEmptyFile()
+ {
+ $loader = new XliffFileLoader();
+ $resource = __DIR__.'/../fixtures/empty.xlf';
+
+ $this->expectException('Symfony\Component\Translation\Exception\InvalidResourceException');
+ $this->expectExceptionMessage(sprintf('Unable to load "%s":', $resource));
+
+ $loader->load($resource, 'en', 'domain1');
+ }
+
+ public function testLoadNotes()
+ {
+ $loader = new XliffFileLoader();
+ $catalogue = $loader->load(__DIR__.'/../fixtures/withnote.xlf', 'en', 'domain1');
+
+ $this->assertEquals(
+ [
+ 'source' => 'foo',
+ 'notes' => [['priority' => 1, 'content' => 'foo']],
+ 'id' => '1',
+ 'file' => [
+ 'original' => 'file.ext',
+ ],
+ ],
+ $catalogue->getMetadata('foo', 'domain1')
+ );
+ // message without target
+ $this->assertEquals(
+ [
+ 'source' => 'extrasource',
+ 'notes' => [['content' => 'bar', 'from' => 'foo']],
+ 'id' => '2',
+ 'file' => [
+ 'original' => 'file.ext',
+ ],
+ ],
+ $catalogue->getMetadata('extra', 'domain1')
+ );
+ // message with empty target
+ $this->assertEquals(
+ [
+ 'source' => 'key',
+ 'notes' => [
+ ['content' => 'baz'],
+ ['priority' => 2, 'from' => 'bar', 'content' => 'qux'],
+ ],
+ 'id' => '123',
+ 'file' => [
+ 'original' => 'file.ext',
+ ],
+ ],
+ $catalogue->getMetadata('key', 'domain1')
+ );
+ }
+
+ public function testLoadVersion2()
+ {
+ $loader = new XliffFileLoader();
+ $resource = __DIR__.'/../fixtures/resources-2.0.xlf';
+ $catalogue = $loader->load($resource, 'en', 'domain1');
+
+ $this->assertEquals('en', $catalogue->getLocale());
+ $this->assertEquals([new FileResource($resource)], $catalogue->getResources());
+ $this->assertSame([], libxml_get_errors());
+
+ $domains = $catalogue->all();
+ $this->assertCount(3, $domains['domain1']);
+ $this->assertContainsOnly('string', $catalogue->all('domain1'));
+
+ // target attributes
+ $this->assertEquals(['target-attributes' => ['order' => 1]], $catalogue->getMetadata('bar', 'domain1'));
+ }
+
+ public function testLoadVersion2WithNoteMeta()
+ {
+ $loader = new XliffFileLoader();
+ $resource = __DIR__.'/../fixtures/resources-notes-meta.xlf';
+ $catalogue = $loader->load($resource, 'en', 'domain1');
+
+ $this->assertEquals('en', $catalogue->getLocale());
+ $this->assertEquals([new FileResource($resource)], $catalogue->getResources());
+ $this->assertSame([], libxml_get_errors());
+
+ // test for "foo" metadata
+ $this->assertTrue($catalogue->defines('foo', 'domain1'));
+ $metadata = $catalogue->getMetadata('foo', 'domain1');
+ $this->assertNotEmpty($metadata);
+ $this->assertCount(3, $metadata['notes']);
+
+ $this->assertEquals('state', $metadata['notes'][0]['category']);
+ $this->assertEquals('new', $metadata['notes'][0]['content']);
+
+ $this->assertEquals('approved', $metadata['notes'][1]['category']);
+ $this->assertEquals('true', $metadata['notes'][1]['content']);
+
+ $this->assertEquals('section', $metadata['notes'][2]['category']);
+ $this->assertEquals('1', $metadata['notes'][2]['priority']);
+ $this->assertEquals('user login', $metadata['notes'][2]['content']);
+
+ // test for "baz" metadata
+ $this->assertTrue($catalogue->defines('baz', 'domain1'));
+ $metadata = $catalogue->getMetadata('baz', 'domain1');
+ $this->assertNotEmpty($metadata);
+ $this->assertCount(2, $metadata['notes']);
+
+ $this->assertEquals('x', $metadata['notes'][0]['id']);
+ $this->assertEquals('x_content', $metadata['notes'][0]['content']);
+
+ $this->assertEquals('target', $metadata['notes'][1]['appliesTo']);
+ $this->assertEquals('quality', $metadata['notes'][1]['category']);
+ $this->assertEquals('Fuzzy', $metadata['notes'][1]['content']);
+ }
+
+ public function testLoadVersion2WithMultiSegmentUnit()
+ {
+ $loader = new XliffFileLoader();
+ $resource = __DIR__.'/../fixtures/resources-2.0-multi-segment-unit.xlf';
+ $catalog = $loader->load($resource, 'en', 'domain1');
+
+ $this->assertSame('en', $catalog->getLocale());
+ $this->assertEquals([new FileResource($resource)], $catalog->getResources());
+ $this->assertFalse(libxml_get_last_error());
+
+ // test for "foo" metadata
+ $this->assertTrue($catalog->defines('foo', 'domain1'));
+ $metadata = $catalog->getMetadata('foo', 'domain1');
+ $this->assertNotEmpty($metadata);
+ $this->assertCount(1, $metadata['notes']);
+
+ $this->assertSame('processed', $metadata['notes'][0]['category']);
+ $this->assertSame('true', $metadata['notes'][0]['content']);
+
+ // test for "bar" metadata
+ $this->assertTrue($catalog->defines('bar', 'domain1'));
+ $metadata = $catalog->getMetadata('bar', 'domain1');
+ $this->assertNotEmpty($metadata);
+ $this->assertCount(1, $metadata['notes']);
+
+ $this->assertSame('processed', $metadata['notes'][0]['category']);
+ $this->assertSame('true', $metadata['notes'][0]['content']);
+ }
+
+ public function testLoadWithMultipleFileNodes()
+ {
+ $loader = new XliffFileLoader();
+ $catalogue = $loader->load(__DIR__.'/../fixtures/resources-multi-files.xlf', 'en', 'domain1');
+
+ $this->assertEquals(
+ [
+ 'source' => 'foo',
+ 'id' => '1',
+ 'file' => [
+ 'original' => 'file.ext',
+ ],
+ ],
+ $catalogue->getMetadata('foo', 'domain1')
+ );
+ $this->assertEquals(
+ [
+ 'source' => 'test',
+ 'notes' => [['content' => 'note']],
+ 'id' => '4',
+ 'file' => [
+ 'original' => 'otherfile.ext',
+ ],
+ ],
+ $catalogue->getMetadata('test', 'domain1')
+ );
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Loader/YamlFileLoaderTest.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Loader/YamlFileLoaderTest.php
new file mode 100644
index 0000000..b46fff7
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Loader/YamlFileLoaderTest.php
@@ -0,0 +1,65 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Tests\Loader;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\Config\Resource\FileResource;
+use Symfony\Component\Translation\Loader\YamlFileLoader;
+
+class YamlFileLoaderTest extends TestCase
+{
+ public function testLoad()
+ {
+ $loader = new YamlFileLoader();
+ $resource = __DIR__.'/../fixtures/resources.yml';
+ $catalogue = $loader->load($resource, 'en', 'domain1');
+
+ $this->assertEquals(['foo' => 'bar'], $catalogue->all('domain1'));
+ $this->assertEquals('en', $catalogue->getLocale());
+ $this->assertEquals([new FileResource($resource)], $catalogue->getResources());
+ }
+
+ public function testLoadDoesNothingIfEmpty()
+ {
+ $loader = new YamlFileLoader();
+ $resource = __DIR__.'/../fixtures/empty.yml';
+ $catalogue = $loader->load($resource, 'en', 'domain1');
+
+ $this->assertEquals([], $catalogue->all('domain1'));
+ $this->assertEquals('en', $catalogue->getLocale());
+ $this->assertEquals([new FileResource($resource)], $catalogue->getResources());
+ }
+
+ public function testLoadNonExistingResource()
+ {
+ $this->expectException('Symfony\Component\Translation\Exception\NotFoundResourceException');
+ $loader = new YamlFileLoader();
+ $resource = __DIR__.'/../fixtures/non-existing.yml';
+ $loader->load($resource, 'en', 'domain1');
+ }
+
+ public function testLoadThrowsAnExceptionIfFileNotLocal()
+ {
+ $this->expectException('Symfony\Component\Translation\Exception\InvalidResourceException');
+ $loader = new YamlFileLoader();
+ $resource = 'http://example.com/resources.yml';
+ $loader->load($resource, 'en', 'domain1');
+ }
+
+ public function testLoadThrowsAnExceptionIfNotAnArray()
+ {
+ $this->expectException('Symfony\Component\Translation\Exception\InvalidResourceException');
+ $loader = new YamlFileLoader();
+ $resource = __DIR__.'/../fixtures/non-valid.yml';
+ $loader->load($resource, 'en', 'domain1');
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/LoggingTranslatorTest.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/LoggingTranslatorTest.php
new file mode 100644
index 0000000..450e060
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/LoggingTranslatorTest.php
@@ -0,0 +1,68 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Tests;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\Translation\Loader\ArrayLoader;
+use Symfony\Component\Translation\LoggingTranslator;
+use Symfony\Component\Translation\Translator;
+
+class LoggingTranslatorTest extends TestCase
+{
+ public function testTransWithNoTranslationIsLogged()
+ {
+ $logger = $this->getMockBuilder('Psr\Log\LoggerInterface')->getMock();
+ $logger->expects($this->exactly(1))
+ ->method('warning')
+ ->with('Translation not found.')
+ ;
+
+ $translator = new Translator('ar');
+ $loggableTranslator = new LoggingTranslator($translator, $logger);
+ $loggableTranslator->trans('bar');
+ }
+
+ /**
+ * @group legacy
+ */
+ public function testTransChoiceFallbackIsLogged()
+ {
+ $logger = $this->getMockBuilder('Psr\Log\LoggerInterface')->getMock();
+ $logger->expects($this->once())
+ ->method('debug')
+ ->with('Translation use fallback catalogue.')
+ ;
+
+ $translator = new Translator('ar');
+ $translator->setFallbackLocales(['en']);
+ $translator->addLoader('array', new ArrayLoader());
+ $translator->addResource('array', ['some_message2' => 'one thing|%count% things'], 'en');
+ $loggableTranslator = new LoggingTranslator($translator, $logger);
+ $loggableTranslator->transChoice('some_message2', 10, ['%count%' => 10]);
+ }
+
+ /**
+ * @group legacy
+ */
+ public function testTransChoiceWithNoTranslationIsLogged()
+ {
+ $logger = $this->getMockBuilder('Psr\Log\LoggerInterface')->getMock();
+ $logger->expects($this->exactly(1))
+ ->method('warning')
+ ->with('Translation not found.')
+ ;
+
+ $translator = new Translator('ar');
+ $loggableTranslator = new LoggingTranslator($translator, $logger);
+ $loggableTranslator->transChoice('some_message2', 10, ['%count%' => 10]);
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/MessageCatalogueTest.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/MessageCatalogueTest.php
new file mode 100644
index 0000000..b4e3149
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/MessageCatalogueTest.php
@@ -0,0 +1,272 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Tests;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\Translation\MessageCatalogue;
+
+class MessageCatalogueTest extends TestCase
+{
+ public function testGetLocale()
+ {
+ $catalogue = new MessageCatalogue('en');
+
+ $this->assertEquals('en', $catalogue->getLocale());
+ }
+
+ /**
+ * @group legacy
+ * @expectedDeprecation Passing "null" to the first argument of the "Symfony\Component\Translation\MessageCatalogue::__construct" method has been deprecated since Symfony 4.4 and will throw an error in 5.0.
+ */
+ public function testGetNullLocale()
+ {
+ $catalogue = new MessageCatalogue(null);
+
+ $this->assertNull($catalogue->getLocale());
+ }
+
+ public function testGetDomains()
+ {
+ $catalogue = new MessageCatalogue('en', ['domain1' => [], 'domain2' => [], 'domain2+intl-icu' => [], 'domain3+intl-icu' => []]);
+
+ $this->assertEquals(['domain1', 'domain2', 'domain3'], $catalogue->getDomains());
+ }
+
+ public function testAll()
+ {
+ $catalogue = new MessageCatalogue('en', $messages = ['domain1' => ['foo' => 'foo'], 'domain2' => ['bar' => 'bar']]);
+
+ $this->assertEquals(['foo' => 'foo'], $catalogue->all('domain1'));
+ $this->assertEquals([], $catalogue->all('domain88'));
+ $this->assertEquals($messages, $catalogue->all());
+
+ $messages = ['domain1+intl-icu' => ['foo' => 'bar']] + $messages + [
+ 'domain2+intl-icu' => ['bar' => 'foo'],
+ 'domain3+intl-icu' => ['biz' => 'biz'],
+ ];
+ $catalogue = new MessageCatalogue('en', $messages);
+
+ $this->assertEquals(['foo' => 'bar'], $catalogue->all('domain1'));
+ $this->assertEquals(['bar' => 'foo'], $catalogue->all('domain2'));
+ $this->assertEquals(['biz' => 'biz'], $catalogue->all('domain3'));
+
+ $messages = [
+ 'domain1' => ['foo' => 'bar'],
+ 'domain2' => ['bar' => 'foo'],
+ 'domain3' => ['biz' => 'biz'],
+ ];
+ $this->assertEquals($messages, $catalogue->all());
+ }
+
+ public function testAllIntICU()
+ {
+ $messages = [
+ 'domain1+intl-icu' => ['foo' => 'bar'],
+ 'domain2+intl-icu' => ['bar' => 'foo'],
+ 'domain2' => ['biz' => 'biz'],
+ ];
+ $catalogue = new MessageCatalogue('en', $messages);
+
+ // separated domains
+ $this->assertSame(['foo' => 'bar'], $catalogue->all('domain1+intl-icu'));
+ $this->assertSame(['bar' => 'foo'], $catalogue->all('domain2+intl-icu'));
+
+ // merged, intl-icu ignored
+ $this->assertSame(['bar' => 'foo', 'biz' => 'biz'], $catalogue->all('domain2'));
+
+ // intl-icu ignored
+ $messagesExpected = [
+ 'domain1' => ['foo' => 'bar'],
+ 'domain2' => ['bar' => 'foo', 'biz' => 'biz'],
+ ];
+ $this->assertSame($messagesExpected, $catalogue->all());
+ }
+
+ public function testHas()
+ {
+ $catalogue = new MessageCatalogue('en', ['domain1' => ['foo' => 'foo'], 'domain2+intl-icu' => ['bar' => 'bar']]);
+
+ $this->assertTrue($catalogue->has('foo', 'domain1'));
+ $this->assertTrue($catalogue->has('bar', 'domain2'));
+ $this->assertFalse($catalogue->has('bar', 'domain1'));
+ $this->assertFalse($catalogue->has('foo', 'domain88'));
+ }
+
+ public function testGetSet()
+ {
+ $catalogue = new MessageCatalogue('en', ['domain1' => ['foo' => 'foo'], 'domain2' => ['bar' => 'bar'], 'domain2+intl-icu' => ['bar' => 'foo']]);
+ $catalogue->set('foo1', 'foo1', 'domain1');
+
+ $this->assertEquals('foo', $catalogue->get('foo', 'domain1'));
+ $this->assertEquals('foo1', $catalogue->get('foo1', 'domain1'));
+ $this->assertEquals('foo', $catalogue->get('bar', 'domain2'));
+ }
+
+ public function testAdd()
+ {
+ $catalogue = new MessageCatalogue('en', ['domain1' => ['foo' => 'foo'], 'domain2' => ['bar' => 'bar']]);
+ $catalogue->add(['foo1' => 'foo1'], 'domain1');
+
+ $this->assertEquals('foo', $catalogue->get('foo', 'domain1'));
+ $this->assertEquals('foo1', $catalogue->get('foo1', 'domain1'));
+
+ $catalogue->add(['foo' => 'bar'], 'domain1');
+ $this->assertEquals('bar', $catalogue->get('foo', 'domain1'));
+ $this->assertEquals('foo1', $catalogue->get('foo1', 'domain1'));
+
+ $catalogue->add(['foo' => 'bar'], 'domain88');
+ $this->assertEquals('bar', $catalogue->get('foo', 'domain88'));
+ }
+
+ public function testReplace()
+ {
+ $catalogue = new MessageCatalogue('en', ['domain1' => ['foo' => 'foo'], 'domain1+intl-icu' => ['bar' => 'bar']]);
+ $catalogue->replace($messages = ['foo1' => 'foo1'], 'domain1');
+
+ $this->assertEquals($messages, $catalogue->all('domain1'));
+ }
+
+ public function testAddCatalogue()
+ {
+ $r = $this->getMockBuilder('Symfony\Component\Config\Resource\ResourceInterface')->getMock();
+ $r->expects($this->any())->method('__toString')->willReturn('r');
+
+ $r1 = $this->getMockBuilder('Symfony\Component\Config\Resource\ResourceInterface')->getMock();
+ $r1->expects($this->any())->method('__toString')->willReturn('r1');
+
+ $catalogue = new MessageCatalogue('en', ['domain1' => ['foo' => 'foo']]);
+ $catalogue->addResource($r);
+
+ $catalogue1 = new MessageCatalogue('en', ['domain1' => ['foo1' => 'foo1'], 'domain2+intl-icu' => ['bar' => 'bar']]);
+ $catalogue1->addResource($r1);
+
+ $catalogue->addCatalogue($catalogue1);
+
+ $this->assertEquals('foo', $catalogue->get('foo', 'domain1'));
+ $this->assertEquals('foo1', $catalogue->get('foo1', 'domain1'));
+ $this->assertEquals('bar', $catalogue->get('bar', 'domain2'));
+ $this->assertEquals('bar', $catalogue->get('bar', 'domain2+intl-icu'));
+
+ $this->assertEquals([$r, $r1], $catalogue->getResources());
+ }
+
+ public function testAddFallbackCatalogue()
+ {
+ $r = $this->getMockBuilder('Symfony\Component\Config\Resource\ResourceInterface')->getMock();
+ $r->expects($this->any())->method('__toString')->willReturn('r');
+
+ $r1 = $this->getMockBuilder('Symfony\Component\Config\Resource\ResourceInterface')->getMock();
+ $r1->expects($this->any())->method('__toString')->willReturn('r1');
+
+ $r2 = $this->getMockBuilder('Symfony\Component\Config\Resource\ResourceInterface')->getMock();
+ $r2->expects($this->any())->method('__toString')->willReturn('r2');
+
+ $catalogue = new MessageCatalogue('fr_FR', ['domain1' => ['foo' => 'foo'], 'domain2' => ['bar' => 'bar']]);
+ $catalogue->addResource($r);
+
+ $catalogue1 = new MessageCatalogue('fr', ['domain1' => ['foo' => 'bar', 'foo1' => 'foo1']]);
+ $catalogue1->addResource($r1);
+
+ $catalogue2 = new MessageCatalogue('en');
+ $catalogue2->addResource($r2);
+
+ $catalogue->addFallbackCatalogue($catalogue1);
+ $catalogue1->addFallbackCatalogue($catalogue2);
+
+ $this->assertEquals('foo', $catalogue->get('foo', 'domain1'));
+ $this->assertEquals('foo1', $catalogue->get('foo1', 'domain1'));
+
+ $this->assertEquals([$r, $r1, $r2], $catalogue->getResources());
+ }
+
+ public function testAddFallbackCatalogueWithParentCircularReference()
+ {
+ $this->expectException('Symfony\Component\Translation\Exception\LogicException');
+ $main = new MessageCatalogue('en_US');
+ $fallback = new MessageCatalogue('fr_FR');
+
+ $fallback->addFallbackCatalogue($main);
+ $main->addFallbackCatalogue($fallback);
+ }
+
+ public function testAddFallbackCatalogueWithFallbackCircularReference()
+ {
+ $this->expectException('Symfony\Component\Translation\Exception\LogicException');
+ $fr = new MessageCatalogue('fr');
+ $en = new MessageCatalogue('en');
+ $es = new MessageCatalogue('es');
+
+ $fr->addFallbackCatalogue($en);
+ $es->addFallbackCatalogue($en);
+ $en->addFallbackCatalogue($fr);
+ }
+
+ public function testAddCatalogueWhenLocaleIsNotTheSameAsTheCurrentOne()
+ {
+ $this->expectException('Symfony\Component\Translation\Exception\LogicException');
+ $catalogue = new MessageCatalogue('en');
+ $catalogue->addCatalogue(new MessageCatalogue('fr', []));
+ }
+
+ public function testGetAddResource()
+ {
+ $catalogue = new MessageCatalogue('en');
+ $r = $this->getMockBuilder('Symfony\Component\Config\Resource\ResourceInterface')->getMock();
+ $r->expects($this->any())->method('__toString')->willReturn('r');
+ $catalogue->addResource($r);
+ $catalogue->addResource($r);
+ $r1 = $this->getMockBuilder('Symfony\Component\Config\Resource\ResourceInterface')->getMock();
+ $r1->expects($this->any())->method('__toString')->willReturn('r1');
+ $catalogue->addResource($r1);
+
+ $this->assertEquals([$r, $r1], $catalogue->getResources());
+ }
+
+ public function testMetadataDelete()
+ {
+ $catalogue = new MessageCatalogue('en');
+ $this->assertEquals([], $catalogue->getMetadata('', ''), 'Metadata is empty');
+ $catalogue->deleteMetadata('key', 'messages');
+ $catalogue->deleteMetadata('', 'messages');
+ $catalogue->deleteMetadata();
+ }
+
+ public function testMetadataSetGetDelete()
+ {
+ $catalogue = new MessageCatalogue('en');
+ $catalogue->setMetadata('key', 'value');
+ $this->assertEquals('value', $catalogue->getMetadata('key', 'messages'), "Metadata 'key' = 'value'");
+
+ $catalogue->setMetadata('key2', []);
+ $this->assertEquals([], $catalogue->getMetadata('key2', 'messages'), 'Metadata key2 is array');
+
+ $catalogue->deleteMetadata('key2', 'messages');
+ $this->assertNull($catalogue->getMetadata('key2', 'messages'), 'Metadata key2 should is deleted.');
+
+ $catalogue->deleteMetadata('key2', 'domain');
+ $this->assertNull($catalogue->getMetadata('key2', 'domain'), 'Metadata key2 should is deleted.');
+ }
+
+ public function testMetadataMerge()
+ {
+ $cat1 = new MessageCatalogue('en');
+ $cat1->setMetadata('a', 'b');
+ $this->assertEquals(['messages' => ['a' => 'b']], $cat1->getMetadata('', ''), 'Cat1 contains messages metadata.');
+
+ $cat2 = new MessageCatalogue('en');
+ $cat2->setMetadata('b', 'c', 'domain');
+ $this->assertEquals(['domain' => ['b' => 'c']], $cat2->getMetadata('', ''), 'Cat2 contains domain metadata.');
+
+ $cat1->addCatalogue($cat2);
+ $this->assertEquals(['messages' => ['a' => 'b'], 'domain' => ['b' => 'c']], $cat1->getMetadata('', ''), 'Cat1 contains merged metadata.');
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/MessageSelectorTest.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/MessageSelectorTest.php
new file mode 100644
index 0000000..20609dd
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/MessageSelectorTest.php
@@ -0,0 +1,140 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Tests;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\Translation\MessageSelector;
+
+/**
+ * @group legacy
+ */
+class MessageSelectorTest extends TestCase
+{
+ /**
+ * @dataProvider getChooseTests
+ */
+ public function testChoose($expected, $id, $number)
+ {
+ $selector = new MessageSelector();
+
+ $this->assertEquals($expected, $selector->choose($id, $number, 'en'));
+ }
+
+ public function testReturnMessageIfExactlyOneStandardRuleIsGiven()
+ {
+ $selector = new MessageSelector();
+
+ $this->assertEquals('There are two apples', $selector->choose('There are two apples', 2, 'en'));
+ }
+
+ /**
+ * @dataProvider getNonMatchingMessages
+ */
+ public function testThrowExceptionIfMatchingMessageCannotBeFound($id, $number)
+ {
+ $this->expectException('Symfony\Component\Translation\Exception\InvalidArgumentException');
+ $selector = new MessageSelector();
+
+ $selector->choose($id, $number, 'en');
+ }
+
+ public function getNonMatchingMessages()
+ {
+ return [
+ ['{0} There are no apples|{1} There is one apple', 2],
+ ['{1} There is one apple|]1,Inf] There are %count% apples', 0],
+ ['{1} There is one apple|]2,Inf] There are %count% apples', 2],
+ ['{0} There are no apples|There is one apple', 2],
+ ];
+ }
+
+ public function getChooseTests()
+ {
+ return [
+ ['There are no apples', '{0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 0],
+ ['There are no apples', '{0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 0],
+ ['There are no apples', '{0}There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 0],
+
+ ['There is one apple', '{0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 1],
+
+ ['There are %count% apples', '{0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 10],
+ ['There are %count% apples', '{0} There are no apples|{1} There is one apple|]1,Inf]There are %count% apples', 10],
+ ['There are %count% apples', '{0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 10],
+
+ ['There are %count% apples', 'There is one apple|There are %count% apples', 0],
+ ['There is one apple', 'There is one apple|There are %count% apples', 1],
+ ['There are %count% apples', 'There is one apple|There are %count% apples', 10],
+
+ ['There are %count% apples', 'one: There is one apple|more: There are %count% apples', 0],
+ ['There is one apple', 'one: There is one apple|more: There are %count% apples', 1],
+ ['There are %count% apples', 'one: There is one apple|more: There are %count% apples', 10],
+
+ ['There are no apples', '{0} There are no apples|one: There is one apple|more: There are %count% apples', 0],
+ ['There is one apple', '{0} There are no apples|one: There is one apple|more: There are %count% apples', 1],
+ ['There are %count% apples', '{0} There are no apples|one: There is one apple|more: There are %count% apples', 10],
+
+ ['', '{0}|{1} There is one apple|]1,Inf] There are %count% apples', 0],
+ ['', '{0} There are no apples|{1}|]1,Inf] There are %count% apples', 1],
+
+ // Indexed only tests which are Gettext PoFile* compatible strings.
+ ['There are %count% apples', 'There is one apple|There are %count% apples', 0],
+ ['There is one apple', 'There is one apple|There are %count% apples', 1],
+ ['There are %count% apples', 'There is one apple|There are %count% apples', 2],
+
+ // Tests for float numbers
+ ['There is almost one apple', '{0} There are no apples|]0,1[ There is almost one apple|{1} There is one apple|[1,Inf] There is more than one apple', 0.7],
+ ['There is one apple', '{0} There are no apples|]0,1[There are %count% apples|{1} There is one apple|[1,Inf] There is more than one apple', 1],
+ ['There is more than one apple', '{0} There are no apples|]0,1[There are %count% apples|{1} There is one apple|[1,Inf] There is more than one apple', 1.7],
+ ['There are no apples', '{0} There are no apples|]0,1[There are %count% apples|{1} There is one apple|[1,Inf] There is more than one apple', 0],
+ ['There are no apples', '{0} There are no apples|]0,1[There are %count% apples|{1} There is one apple|[1,Inf] There is more than one apple', 0.0],
+ ['There are no apples', '{0.0} There are no apples|]0,1[There are %count% apples|{1} There is one apple|[1,Inf] There is more than one apple', 0],
+
+ // Test texts with new-lines
+ // with double-quotes and \n in id & double-quotes and actual newlines in text
+ ["This is a text with a\n new-line in it. Selector = 0.", '{0}This is a text with a
+ new-line in it. Selector = 0.|{1}This is a text with a
+ new-line in it. Selector = 1.|[1,Inf]This is a text with a
+ new-line in it. Selector > 1.', 0],
+ // with double-quotes and \n in id and single-quotes and actual newlines in text
+ ["This is a text with a\n new-line in it. Selector = 1.", '{0}This is a text with a
+ new-line in it. Selector = 0.|{1}This is a text with a
+ new-line in it. Selector = 1.|[1,Inf]This is a text with a
+ new-line in it. Selector > 1.', 1],
+ ["This is a text with a\n new-line in it. Selector > 1.", '{0}This is a text with a
+ new-line in it. Selector = 0.|{1}This is a text with a
+ new-line in it. Selector = 1.|[1,Inf]This is a text with a
+ new-line in it. Selector > 1.', 5],
+ // with double-quotes and id split accros lines
+ ['This is a text with a
+ new-line in it. Selector = 1.', '{0}This is a text with a
+ new-line in it. Selector = 0.|{1}This is a text with a
+ new-line in it. Selector = 1.|[1,Inf]This is a text with a
+ new-line in it. Selector > 1.', 1],
+ // with single-quotes and id split accros lines
+ ['This is a text with a
+ new-line in it. Selector > 1.', '{0}This is a text with a
+ new-line in it. Selector = 0.|{1}This is a text with a
+ new-line in it. Selector = 1.|[1,Inf]This is a text with a
+ new-line in it. Selector > 1.', 5],
+ // with single-quotes and \n in text
+ ['This is a text with a\nnew-line in it. Selector = 0.', '{0}This is a text with a\nnew-line in it. Selector = 0.|{1}This is a text with a\nnew-line in it. Selector = 1.|[1,Inf]This is a text with a\nnew-line in it. Selector > 1.', 0],
+ // with double-quotes and id split accros lines
+ ["This is a text with a\nnew-line in it. Selector = 1.", "{0}This is a text with a\nnew-line in it. Selector = 0.|{1}This is a text with a\nnew-line in it. Selector = 1.|[1,Inf]This is a text with a\nnew-line in it. Selector > 1.", 1],
+ // esacape pipe
+ ['This is a text with | in it. Selector = 0.', '{0}This is a text with || in it. Selector = 0.|{1}This is a text with || in it. Selector = 1.', 0],
+ // Empty plural set (2 plural forms) from a .PO file
+ ['', '|', 1],
+ // Empty plural set (3 plural forms) from a .PO file
+ ['', '||', 1],
+ ];
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/PluralizationRulesTest.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/PluralizationRulesTest.php
new file mode 100644
index 0000000..4b8bdff
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/PluralizationRulesTest.php
@@ -0,0 +1,122 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Tests;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\Translation\PluralizationRules;
+
+/**
+ * Test should cover all languages mentioned on http://translate.sourceforge.net/wiki/l10n/pluralforms
+ * and Plural forms mentioned on http://www.gnu.org/software/gettext/manual/gettext.html#Plural-forms.
+ *
+ * See also https://developer.mozilla.org/en/Localization_and_Plurals which mentions 15 rules having a maximum of 6 forms.
+ * The mozilla code is also interesting to check for.
+ *
+ * As mentioned by chx http://drupal.org/node/1273968 we can cover all by testing number from 0 to 199
+ *
+ * The goal to cover all languages is to far fetched so this test case is smaller.
+ *
+ * @author Clemens Tolboom clemens@build2be.nl
+ *
+ * @group legacy
+ */
+class PluralizationRulesTest extends TestCase
+{
+ /**
+ * We test failed langcode here.
+ *
+ * TODO: The languages mentioned in the data provide need to get fixed somehow within PluralizationRules.
+ *
+ * @dataProvider failingLangcodes
+ */
+ public function testFailedLangcodes($nplural, $langCodes)
+ {
+ $matrix = $this->generateTestData($langCodes);
+ $this->validateMatrix($nplural, $matrix, false);
+ }
+
+ /**
+ * @dataProvider successLangcodes
+ */
+ public function testLangcodes($nplural, $langCodes)
+ {
+ $matrix = $this->generateTestData($langCodes);
+ $this->validateMatrix($nplural, $matrix);
+ }
+
+ /**
+ * This array should contain all currently known langcodes.
+ *
+ * As it is impossible to have this ever complete we should try as hard as possible to have it almost complete.
+ */
+ public function successLangcodes(): array
+ {
+ return [
+ ['1', ['ay', 'bo', 'cgg', 'dz', 'id', 'ja', 'jbo', 'ka', 'kk', 'km', 'ko', 'ky']],
+ ['2', ['nl', 'fr', 'en', 'de', 'de_GE', 'hy', 'hy_AM']],
+ ['3', ['be', 'bs', 'cs', 'hr']],
+ ['4', ['cy', 'mt', 'sl']],
+ ['6', ['ar']],
+ ];
+ }
+
+ /**
+ * This array should be at least empty within the near future.
+ *
+ * This both depends on a complete list trying to add above as understanding
+ * the plural rules of the current failing languages.
+ *
+ * @return array with nplural together with langcodes
+ */
+ public function failingLangcodes(): array
+ {
+ return [
+ ['1', ['fa']],
+ ['2', ['jbo']],
+ ['3', ['cbs']],
+ ['4', ['gd', 'kw']],
+ ['5', ['ga']],
+ ];
+ }
+
+ /**
+ * We validate only on the plural coverage. Thus the real rules is not tested.
+ *
+ * @param string $nplural Plural expected
+ * @param array $matrix Containing langcodes and their plural index values
+ * @param bool $expectSuccess
+ */
+ protected function validateMatrix($nplural, $matrix, $expectSuccess = true)
+ {
+ foreach ($matrix as $langCode => $data) {
+ $indexes = array_flip($data);
+ if ($expectSuccess) {
+ $this->assertEquals($nplural, \count($indexes), "Langcode '$langCode' has '$nplural' plural forms.");
+ } else {
+ $this->assertNotEquals((int) $nplural, \count($indexes), "Langcode '$langCode' has '$nplural' plural forms.");
+ }
+ }
+ }
+
+ protected function generateTestData($langCodes)
+ {
+ $matrix = [];
+ foreach ($langCodes as $langCode) {
+ for ($count = 0; $count < 200; ++$count) {
+ $plural = PluralizationRules::get($count, $langCode);
+ $matrix[$langCode][$count] = $plural;
+ }
+ }
+
+ return $matrix;
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/TranslatorCacheTest.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/TranslatorCacheTest.php
new file mode 100644
index 0000000..8efa318
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/TranslatorCacheTest.php
@@ -0,0 +1,332 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Tests;
+
+use PHPUnit\Framework\MockObject\MockObject;
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\Config\Resource\SelfCheckingResourceInterface;
+use Symfony\Component\Translation\Loader\ArrayLoader;
+use Symfony\Component\Translation\Loader\LoaderInterface;
+use Symfony\Component\Translation\MessageCatalogue;
+use Symfony\Component\Translation\Translator;
+
+class TranslatorCacheTest extends TestCase
+{
+ protected $tmpDir;
+
+ protected function setUp(): void
+ {
+ $this->tmpDir = sys_get_temp_dir().'/sf_translation';
+ $this->deleteTmpDir();
+ }
+
+ protected function tearDown(): void
+ {
+ $this->deleteTmpDir();
+ }
+
+ protected function deleteTmpDir()
+ {
+ if (!file_exists($dir = $this->tmpDir)) {
+ return;
+ }
+
+ $iterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($this->tmpDir), \RecursiveIteratorIterator::CHILD_FIRST);
+ foreach ($iterator as $path) {
+ if (preg_match('#[/\\\\]\.\.?$#', $path->__toString())) {
+ continue;
+ }
+ if ($path->isDir()) {
+ rmdir($path->__toString());
+ } else {
+ unlink($path->__toString());
+ }
+ }
+ rmdir($this->tmpDir);
+ }
+
+ /**
+ * @dataProvider runForDebugAndProduction
+ */
+ public function testThatACacheIsUsed($debug)
+ {
+ $locale = 'any_locale';
+ $format = 'some_format';
+ $msgid = 'test';
+
+ // Prime the cache
+ $translator = new Translator($locale, null, $this->tmpDir, $debug);
+ $translator->addLoader($format, new ArrayLoader());
+ $translator->addResource($format, [$msgid => 'OK'], $locale);
+ $translator->addResource($format, [$msgid.'+intl' => 'OK'], $locale, 'messages+intl-icu');
+ $translator->trans($msgid);
+ $translator->trans($msgid.'+intl', [], 'messages+intl-icu');
+
+ // Try again and see we get a valid result whilst no loader can be used
+ $translator = new Translator($locale, null, $this->tmpDir, $debug);
+ $translator->addLoader($format, $this->createFailingLoader());
+ $translator->addResource($format, [$msgid => 'OK'], $locale);
+ $translator->addResource($format, [$msgid.'+intl' => 'OK'], $locale, 'messages+intl-icu');
+ $this->assertEquals('OK', $translator->trans($msgid), '-> caching does not work in '.($debug ? 'debug' : 'production'));
+ $this->assertEquals('OK', $translator->trans($msgid.'+intl', [], 'messages+intl-icu'));
+ }
+
+ public function testCatalogueIsReloadedWhenResourcesAreNoLongerFresh()
+ {
+ /*
+ * The testThatACacheIsUsed() test showed that we don't need the loader as long as the cache
+ * is fresh.
+ *
+ * Now we add a Resource that is never fresh and make sure that the
+ * cache is discarded (the loader is called twice).
+ *
+ * We need to run this for debug=true only because in production the cache
+ * will never be revalidated.
+ */
+
+ $locale = 'any_locale';
+ $format = 'some_format';
+ $msgid = 'test';
+
+ $catalogue = new MessageCatalogue($locale, []);
+ $catalogue->addResource(new StaleResource()); // better use a helper class than a mock, because it gets serialized in the cache and re-loaded
+
+ /** @var LoaderInterface|MockObject $loader */
+ $loader = $this->getMockBuilder('Symfony\Component\Translation\Loader\LoaderInterface')->getMock();
+ $loader
+ ->expects($this->exactly(2))
+ ->method('load')
+ ->willReturn($catalogue)
+ ;
+
+ // 1st pass
+ $translator = new Translator($locale, null, $this->tmpDir, true);
+ $translator->addLoader($format, $loader);
+ $translator->addResource($format, null, $locale);
+ $translator->trans($msgid);
+
+ // 2nd pass
+ $translator = new Translator($locale, null, $this->tmpDir, true);
+ $translator->addLoader($format, $loader);
+ $translator->addResource($format, null, $locale);
+ $translator->trans($msgid);
+ }
+
+ /**
+ * @dataProvider runForDebugAndProduction
+ */
+ public function testDifferentTranslatorsForSameLocaleDoNotOverwriteEachOthersCache($debug)
+ {
+ /*
+ * Similar to the previous test. After we used the second translator, make
+ * sure there's still a usable cache for the first one.
+ */
+
+ $locale = 'any_locale';
+ $format = 'some_format';
+ $msgid = 'test';
+
+ // Create a Translator and prime its cache
+ $translator = new Translator($locale, null, $this->tmpDir, $debug);
+ $translator->addLoader($format, new ArrayLoader());
+ $translator->addResource($format, [$msgid => 'OK'], $locale);
+ $translator->trans($msgid);
+
+ // Create another Translator with a different catalogue for the same locale
+ $translator = new Translator($locale, null, $this->tmpDir, $debug);
+ $translator->addLoader($format, new ArrayLoader());
+ $translator->addResource($format, [$msgid => 'FAIL'], $locale);
+ $translator->trans($msgid);
+
+ // Now the first translator must still have a usable cache.
+ $translator = new Translator($locale, null, $this->tmpDir, $debug);
+ $translator->addLoader($format, $this->createFailingLoader());
+ $translator->addResource($format, [$msgid => 'OK'], $locale);
+ $this->assertEquals('OK', $translator->trans($msgid), '-> the cache was overwritten by another translator instance in '.($debug ? 'debug' : 'production'));
+ }
+
+ public function testGeneratedCacheFilesAreOnlyBelongRequestedLocales()
+ {
+ $translator = new Translator('a', null, $this->tmpDir);
+ $translator->setFallbackLocales(['b']);
+ $translator->trans('bar');
+
+ $cachedFiles = glob($this->tmpDir.'/*.php');
+
+ $this->assertCount(1, $cachedFiles);
+ }
+
+ public function testDifferentCacheFilesAreUsedForDifferentSetsOfFallbackLocales()
+ {
+ /*
+ * Because the cache file contains a catalogue including all of its fallback
+ * catalogues, we must take the set of fallback locales into consideration when
+ * loading a catalogue from the cache.
+ */
+ $translator = new Translator('a', null, $this->tmpDir);
+ $translator->setFallbackLocales(['b']);
+
+ $translator->addLoader('array', new ArrayLoader());
+ $translator->addResource('array', ['foo' => 'foo (a)'], 'a');
+ $translator->addResource('array', ['bar' => 'bar (b)'], 'b');
+
+ $this->assertEquals('bar (b)', $translator->trans('bar'));
+
+ // Remove fallback locale
+ $translator->setFallbackLocales([]);
+ $this->assertEquals('bar', $translator->trans('bar'));
+
+ // Use a fresh translator with no fallback locales, result should be the same
+ $translator = new Translator('a', null, $this->tmpDir);
+
+ $translator->addLoader('array', new ArrayLoader());
+ $translator->addResource('array', ['foo' => 'foo (a)'], 'a');
+ $translator->addResource('array', ['bar' => 'bar (b)'], 'b');
+
+ $this->assertEquals('bar', $translator->trans('bar'));
+ }
+
+ public function testPrimaryAndFallbackCataloguesContainTheSameMessagesRegardlessOfCaching()
+ {
+ /*
+ * As a safeguard against potential BC breaks, make sure that primary and fallback
+ * catalogues (reachable via getFallbackCatalogue()) always contain the full set of
+ * messages provided by the loader. This must also be the case when these catalogues
+ * are (internally) read from a cache.
+ *
+ * Optimizations inside the translator must not change this behavior.
+ */
+
+ /*
+ * Create a translator that loads two catalogues for two different locales.
+ * The catalogues contain distinct sets of messages.
+ */
+ $translator = new Translator('a', null, $this->tmpDir);
+ $translator->setFallbackLocales(['b']);
+
+ $translator->addLoader('array', new ArrayLoader());
+ $translator->addResource('array', ['foo' => 'foo (a)'], 'a');
+ $translator->addResource('array', ['foo' => 'foo (b)'], 'b');
+ $translator->addResource('array', ['bar' => 'bar (b)'], 'b');
+ $translator->addResource('array', ['baz' => 'baz (b)'], 'b', 'messages+intl-icu');
+
+ $catalogue = $translator->getCatalogue('a');
+ $this->assertFalse($catalogue->defines('bar')); // Sure, the "a" catalogue does not contain that message.
+
+ $fallback = $catalogue->getFallbackCatalogue();
+ $this->assertTrue($fallback->defines('foo')); // "foo" is present in "a" and "b"
+
+ /*
+ * Now, repeat the same test.
+ * Behind the scenes, the cache is used. But that should not matter, right?
+ */
+ $translator = new Translator('a', null, $this->tmpDir);
+ $translator->setFallbackLocales(['b']);
+
+ $translator->addLoader('array', new ArrayLoader());
+ $translator->addResource('array', ['foo' => 'foo (a)'], 'a');
+ $translator->addResource('array', ['foo' => 'foo (b)'], 'b');
+ $translator->addResource('array', ['bar' => 'bar (b)'], 'b');
+ $translator->addResource('array', ['baz' => 'baz (b)'], 'b', 'messages+intl-icu');
+
+ $catalogue = $translator->getCatalogue('a');
+ $this->assertFalse($catalogue->defines('bar'));
+
+ $fallback = $catalogue->getFallbackCatalogue();
+ $this->assertTrue($fallback->defines('foo'));
+ $this->assertTrue($fallback->defines('baz', 'messages+intl-icu'));
+ }
+
+ public function testRefreshCacheWhenResourcesAreNoLongerFresh()
+ {
+ $resource = $this->getMockBuilder('Symfony\Component\Config\Resource\SelfCheckingResourceInterface')->getMock();
+ $loader = $this->getMockBuilder('Symfony\Component\Translation\Loader\LoaderInterface')->getMock();
+ $resource->method('isFresh')->willReturn(false);
+ $loader
+ ->expects($this->exactly(2))
+ ->method('load')
+ ->willReturn($this->getCatalogue('fr', [], [$resource]));
+
+ // prime the cache
+ $translator = new Translator('fr', null, $this->tmpDir, true);
+ $translator->addLoader('loader', $loader);
+ $translator->addResource('loader', 'foo', 'fr');
+ $translator->trans('foo');
+
+ // prime the cache second time
+ $translator = new Translator('fr', null, $this->tmpDir, true);
+ $translator->addLoader('loader', $loader);
+ $translator->addResource('loader', 'foo', 'fr');
+ $translator->trans('foo');
+ }
+
+ public function testCachedCatalogueIsReDumpedWhenCacheVaryChange()
+ {
+ $translator = new Translator('a', null, $this->tmpDir, false, []);
+ $translator->addLoader('array', new ArrayLoader());
+ $translator->addResource('array', ['foo' => 'bar'], 'a', 'messages');
+
+ // Cached catalogue is dumped
+ $this->assertSame('bar', $translator->trans('foo', [], 'messages', 'a'));
+
+ $translator = new Translator('a', null, $this->tmpDir, false, ['vary']);
+ $translator->addLoader('array', new ArrayLoader());
+ $translator->addResource('array', ['foo' => 'ccc'], 'a', 'messages');
+
+ $this->assertSame('ccc', $translator->trans('foo', [], 'messages', 'a'));
+ }
+
+ protected function getCatalogue($locale, $messages, $resources = [])
+ {
+ $catalogue = new MessageCatalogue($locale);
+ foreach ($messages as $key => $translation) {
+ $catalogue->set($key, $translation);
+ }
+ foreach ($resources as $resource) {
+ $catalogue->addResource($resource);
+ }
+
+ return $catalogue;
+ }
+
+ public function runForDebugAndProduction()
+ {
+ return [[true], [false]];
+ }
+
+ private function createFailingLoader(): LoaderInterface
+ {
+ $loader = $this->getMockBuilder('Symfony\Component\Translation\Loader\LoaderInterface')->getMock();
+ $loader
+ ->expects($this->never())
+ ->method('load');
+
+ return $loader;
+ }
+}
+
+class StaleResource implements SelfCheckingResourceInterface
+{
+ public function isFresh($timestamp): bool
+ {
+ return false;
+ }
+
+ public function getResource()
+ {
+ }
+
+ public function __toString(): string
+ {
+ return '';
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/TranslatorTest.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/TranslatorTest.php
new file mode 100644
index 0000000..764f31b
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/TranslatorTest.php
@@ -0,0 +1,706 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Tests;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\Translation\Loader\ArrayLoader;
+use Symfony\Component\Translation\MessageCatalogue;
+use Symfony\Component\Translation\Translator;
+
+class TranslatorTest extends TestCase
+{
+ /**
+ * @dataProvider getInvalidLocalesTests
+ */
+ public function testConstructorInvalidLocale($locale)
+ {
+ $this->expectException('Symfony\Component\Translation\Exception\InvalidArgumentException');
+ new Translator($locale);
+ }
+
+ /**
+ * @dataProvider getValidLocalesTests
+ */
+ public function testConstructorValidLocale($locale)
+ {
+ $translator = new Translator($locale);
+
+ $this->assertSame($locale, $translator->getLocale());
+ }
+
+ /**
+ * @group legacy
+ */
+ public function testConstructorWithoutLocale()
+ {
+ $translator = new Translator(null);
+
+ $this->assertNull($translator->getLocale());
+ }
+
+ public function testSetGetLocale()
+ {
+ $translator = new Translator('en');
+
+ $this->assertEquals('en', $translator->getLocale());
+
+ $translator->setLocale('fr');
+ $this->assertEquals('fr', $translator->getLocale());
+ }
+
+ /**
+ * @dataProvider getInvalidLocalesTests
+ */
+ public function testSetInvalidLocale($locale)
+ {
+ $this->expectException('Symfony\Component\Translation\Exception\InvalidArgumentException');
+ $translator = new Translator('fr');
+ $translator->setLocale($locale);
+ }
+
+ /**
+ * @dataProvider getValidLocalesTests
+ */
+ public function testSetValidLocale($locale)
+ {
+ $translator = new Translator($locale);
+ $translator->setLocale($locale);
+
+ $this->assertEquals($locale, $translator->getLocale());
+ }
+
+ /**
+ * @group legacy
+ */
+ public function testSetNullLocale()
+ {
+ $translator = new Translator('en');
+ $translator->setLocale(null);
+
+ $this->assertNull($translator->getLocale());
+ }
+
+ public function testGetCatalogue()
+ {
+ $translator = new Translator('en');
+
+ $this->assertEquals(new MessageCatalogue('en'), $translator->getCatalogue());
+
+ $translator->setLocale('fr');
+ $this->assertEquals(new MessageCatalogue('fr'), $translator->getCatalogue('fr'));
+ }
+
+ public function testGetCatalogueReturnsConsolidatedCatalogue()
+ {
+ /*
+ * This will be useful once we refactor so that different domains will be loaded lazily (on-demand).
+ * In that case, getCatalogue() will probably have to load all missing domains in order to return
+ * one complete catalogue.
+ */
+
+ $locale = 'whatever';
+ $translator = new Translator($locale);
+ $translator->addLoader('loader-a', new ArrayLoader());
+ $translator->addLoader('loader-b', new ArrayLoader());
+ $translator->addResource('loader-a', ['foo' => 'foofoo'], $locale, 'domain-a');
+ $translator->addResource('loader-b', ['bar' => 'foobar'], $locale, 'domain-b');
+
+ /*
+ * Test that we get a single catalogue comprising messages
+ * from different loaders and different domains
+ */
+ $catalogue = $translator->getCatalogue($locale);
+ $this->assertTrue($catalogue->defines('foo', 'domain-a'));
+ $this->assertTrue($catalogue->defines('bar', 'domain-b'));
+ }
+
+ public function testSetFallbackLocales()
+ {
+ $translator = new Translator('en');
+ $translator->addLoader('array', new ArrayLoader());
+ $translator->addResource('array', ['foo' => 'foofoo'], 'en');
+ $translator->addResource('array', ['bar' => 'foobar'], 'fr');
+
+ // force catalogue loading
+ $translator->trans('bar');
+
+ $translator->setFallbackLocales(['fr']);
+ $this->assertEquals('foobar', $translator->trans('bar'));
+ }
+
+ public function testSetFallbackLocalesMultiple()
+ {
+ $translator = new Translator('en');
+ $translator->addLoader('array', new ArrayLoader());
+ $translator->addResource('array', ['foo' => 'foo (en)'], 'en');
+ $translator->addResource('array', ['bar' => 'bar (fr)'], 'fr');
+
+ // force catalogue loading
+ $translator->trans('bar');
+
+ $translator->setFallbackLocales(['fr_FR', 'fr']);
+ $this->assertEquals('bar (fr)', $translator->trans('bar'));
+ }
+
+ /**
+ * @dataProvider getInvalidLocalesTests
+ */
+ public function testSetFallbackInvalidLocales($locale)
+ {
+ $this->expectException('Symfony\Component\Translation\Exception\InvalidArgumentException');
+ $translator = new Translator('fr');
+ $translator->setFallbackLocales(['fr', $locale]);
+ }
+
+ /**
+ * @dataProvider getValidLocalesTests
+ */
+ public function testSetFallbackValidLocales($locale)
+ {
+ $translator = new Translator($locale);
+ $translator->setFallbackLocales(['fr', $locale]);
+ // no assertion. this method just asserts that no exception is thrown
+ $this->addToAssertionCount(1);
+ }
+
+ /**
+ * @group legacy
+ */
+ public function testSetNullFallbackLocale()
+ {
+ $translator = new Translator('en');
+ $translator->setFallbackLocales(['fr', null]);
+ // no assertion. this method just asserts that no exception is thrown
+ $this->addToAssertionCount(1);
+ }
+
+ public function testTransWithFallbackLocale()
+ {
+ $translator = new Translator('fr_FR');
+ $translator->setFallbackLocales(['en']);
+
+ $translator->addLoader('array', new ArrayLoader());
+ $translator->addResource('array', ['bar' => 'foobar'], 'en');
+
+ $this->assertEquals('foobar', $translator->trans('bar'));
+ }
+
+ /**
+ * @dataProvider getInvalidLocalesTests
+ */
+ public function testAddResourceInvalidLocales($locale)
+ {
+ $this->expectException('Symfony\Component\Translation\Exception\InvalidArgumentException');
+ $translator = new Translator('fr');
+ $translator->addResource('array', ['foo' => 'foofoo'], $locale);
+ }
+
+ /**
+ * @dataProvider getValidLocalesTests
+ */
+ public function testAddResourceValidLocales($locale)
+ {
+ $translator = new Translator('fr');
+ $translator->addResource('array', ['foo' => 'foofoo'], $locale);
+ // no assertion. this method just asserts that no exception is thrown
+ $this->addToAssertionCount(1);
+ }
+
+ /**
+ * @group legacy
+ * @expectedDeprecation Passing "null" to the third argument of the "Symfony\Component\Translation\Translator::addResource" method has been deprecated since Symfony 4.4 and will throw an error in 5.0.
+ */
+ public function testAddResourceNull()
+ {
+ $translator = new Translator('fr');
+ $translator->addResource('array', ['foo' => 'foofoo'], null);
+ }
+
+ public function testAddResourceAfterTrans()
+ {
+ $translator = new Translator('fr');
+ $translator->addLoader('array', new ArrayLoader());
+
+ $translator->setFallbackLocales(['en']);
+
+ $translator->addResource('array', ['foo' => 'foofoo'], 'en');
+ $this->assertEquals('foofoo', $translator->trans('foo'));
+
+ $translator->addResource('array', ['bar' => 'foobar'], 'en');
+ $this->assertEquals('foobar', $translator->trans('bar'));
+ }
+
+ /**
+ * @dataProvider getTransFileTests
+ */
+ public function testTransWithoutFallbackLocaleFile($format, $loader)
+ {
+ $this->expectException('Symfony\Component\Translation\Exception\NotFoundResourceException');
+ $loaderClass = 'Symfony\\Component\\Translation\\Loader\\'.$loader;
+ $translator = new Translator('en');
+ $translator->addLoader($format, new $loaderClass());
+ $translator->addResource($format, __DIR__.'/fixtures/non-existing', 'en');
+ $translator->addResource($format, __DIR__.'/fixtures/resources.'.$format, 'en');
+
+ // force catalogue loading
+ $translator->trans('foo');
+ }
+
+ /**
+ * @dataProvider getTransFileTests
+ */
+ public function testTransWithFallbackLocaleFile($format, $loader)
+ {
+ $loaderClass = 'Symfony\\Component\\Translation\\Loader\\'.$loader;
+ $translator = new Translator('en_GB');
+ $translator->addLoader($format, new $loaderClass());
+ $translator->addResource($format, __DIR__.'/fixtures/non-existing', 'en_GB');
+ $translator->addResource($format, __DIR__.'/fixtures/resources.'.$format, 'en', 'resources');
+
+ $this->assertEquals('bar', $translator->trans('foo', [], 'resources'));
+ }
+
+ public function testTransWithIcuFallbackLocale()
+ {
+ $translator = new Translator('en_GB');
+ $translator->addLoader('array', new ArrayLoader());
+ $translator->addResource('array', ['foo' => 'foofoo'], 'en_GB');
+ $translator->addResource('array', ['bar' => 'foobar'], 'en_001');
+ $translator->addResource('array', ['baz' => 'foobaz'], 'en');
+ $this->assertSame('foofoo', $translator->trans('foo'));
+ $this->assertSame('foobar', $translator->trans('bar'));
+ $this->assertSame('foobaz', $translator->trans('baz'));
+ }
+
+ public function testTransWithIcuVariantFallbackLocale()
+ {
+ $translator = new Translator('en_GB_scouse');
+ $translator->addLoader('array', new ArrayLoader());
+ $translator->addResource('array', ['foo' => 'foofoo'], 'en_GB_scouse');
+ $translator->addResource('array', ['bar' => 'foobar'], 'en_GB');
+ $translator->addResource('array', ['baz' => 'foobaz'], 'en_001');
+ $translator->addResource('array', ['qux' => 'fooqux'], 'en');
+ $this->assertSame('foofoo', $translator->trans('foo'));
+ $this->assertSame('foobar', $translator->trans('bar'));
+ $this->assertSame('foobaz', $translator->trans('baz'));
+ $this->assertSame('fooqux', $translator->trans('qux'));
+ }
+
+ public function testTransWithIcuRootFallbackLocale()
+ {
+ $translator = new Translator('az_Cyrl');
+ $translator->addLoader('array', new ArrayLoader());
+ $translator->addResource('array', ['foo' => 'foofoo'], 'az_Cyrl');
+ $translator->addResource('array', ['bar' => 'foobar'], 'az');
+ $this->assertSame('foofoo', $translator->trans('foo'));
+ $this->assertSame('bar', $translator->trans('bar'));
+ }
+
+ /**
+ * @dataProvider getFallbackLocales
+ */
+ public function testTransWithFallbackLocaleBis($expectedLocale, $locale)
+ {
+ $translator = new Translator($locale);
+ $translator->addLoader('array', new ArrayLoader());
+ $translator->addResource('array', ['foo' => 'foofoo'], $locale);
+ $translator->addResource('array', ['bar' => 'foobar'], $expectedLocale);
+ $this->assertEquals('foobar', $translator->trans('bar'));
+ }
+
+ public function getFallbackLocales()
+ {
+ $locales = [
+ ['en', 'en_US'],
+ ['en', 'en-US'],
+ ['sl_Latn_IT', 'sl_Latn_IT_nedis'],
+ ['sl_Latn', 'sl_Latn_IT'],
+ ];
+
+ if (\function_exists('locale_parse')) {
+ $locales[] = ['sl_Latn_IT', 'sl-Latn-IT-nedis'];
+ $locales[] = ['sl_Latn', 'sl-Latn-IT'];
+ } else {
+ $locales[] = ['sl-Latn-IT', 'sl-Latn-IT-nedis'];
+ $locales[] = ['sl-Latn', 'sl-Latn-IT'];
+ }
+
+ return $locales;
+ }
+
+ public function testTransWithFallbackLocaleTer()
+ {
+ $translator = new Translator('fr_FR');
+ $translator->addLoader('array', new ArrayLoader());
+ $translator->addResource('array', ['foo' => 'foo (en_US)'], 'en_US');
+ $translator->addResource('array', ['bar' => 'bar (en)'], 'en');
+
+ $translator->setFallbackLocales(['en_US', 'en']);
+
+ $this->assertEquals('foo (en_US)', $translator->trans('foo'));
+ $this->assertEquals('bar (en)', $translator->trans('bar'));
+ }
+
+ public function testTransNonExistentWithFallback()
+ {
+ $translator = new Translator('fr');
+ $translator->setFallbackLocales(['en']);
+ $translator->addLoader('array', new ArrayLoader());
+ $this->assertEquals('non-existent', $translator->trans('non-existent'));
+ }
+
+ public function testWhenAResourceHasNoRegisteredLoader()
+ {
+ $this->expectException('Symfony\Component\Translation\Exception\RuntimeException');
+ $translator = new Translator('en');
+ $translator->addResource('array', ['foo' => 'foofoo'], 'en');
+
+ $translator->trans('foo');
+ }
+
+ public function testNestedFallbackCatalogueWhenUsingMultipleLocales()
+ {
+ $translator = new Translator('fr');
+ $translator->setFallbackLocales(['ru', 'en']);
+
+ $translator->getCatalogue('fr');
+
+ $this->assertNotNull($translator->getCatalogue('ru')->getFallbackCatalogue());
+ }
+
+ public function testFallbackCatalogueResources()
+ {
+ $translator = new Translator('en_GB');
+ $translator->addLoader('yml', new \Symfony\Component\Translation\Loader\YamlFileLoader());
+ $translator->addResource('yml', __DIR__.'/fixtures/empty.yml', 'en_GB');
+ $translator->addResource('yml', __DIR__.'/fixtures/resources.yml', 'en');
+
+ // force catalogue loading
+ $this->assertEquals('bar', $translator->trans('foo', []));
+
+ $resources = $translator->getCatalogue('en')->getResources();
+ $this->assertCount(1, $resources);
+ $this->assertContains(__DIR__.\DIRECTORY_SEPARATOR.'fixtures'.\DIRECTORY_SEPARATOR.'resources.yml', $resources);
+
+ $resources = $translator->getCatalogue('en_GB')->getResources();
+ $this->assertCount(2, $resources);
+ $this->assertContains(__DIR__.\DIRECTORY_SEPARATOR.'fixtures'.\DIRECTORY_SEPARATOR.'empty.yml', $resources);
+ $this->assertContains(__DIR__.\DIRECTORY_SEPARATOR.'fixtures'.\DIRECTORY_SEPARATOR.'resources.yml', $resources);
+ }
+
+ /**
+ * @dataProvider getTransTests
+ */
+ public function testTrans($expected, $id, $translation, $parameters, $locale, $domain)
+ {
+ $translator = new Translator('en');
+ $translator->addLoader('array', new ArrayLoader());
+ $translator->addResource('array', [(string) $id => $translation], $locale, $domain);
+
+ $this->assertEquals($expected, $translator->trans($id, $parameters, $domain, $locale));
+ }
+
+ /**
+ * @dataProvider getInvalidLocalesTests
+ */
+ public function testTransInvalidLocale($locale)
+ {
+ $this->expectException('Symfony\Component\Translation\Exception\InvalidArgumentException');
+ $translator = new Translator('en');
+ $translator->addLoader('array', new ArrayLoader());
+ $translator->addResource('array', ['foo' => 'foofoo'], 'en');
+
+ $translator->trans('foo', [], '', $locale);
+ }
+
+ /**
+ * @dataProvider getValidLocalesTests
+ */
+ public function testTransValidLocale($locale)
+ {
+ $translator = new Translator($locale);
+ $translator->addLoader('array', new ArrayLoader());
+ $translator->addResource('array', ['test' => 'OK'], $locale);
+
+ $this->assertEquals('OK', $translator->trans('test'));
+ $this->assertEquals('OK', $translator->trans('test', [], null, $locale));
+ }
+
+ /**
+ * @group legacy
+ * @expectedDeprecation Passing "null" to the third argument of the "Symfony\Component\Translation\Translator::addResource" method has been deprecated since Symfony 4.4 and will throw an error in 5.0.
+ */
+ public function testTransNullLocale()
+ {
+ $translator = new Translator(null);
+ $translator->addLoader('array', new ArrayLoader());
+ $translator->addResource('array', ['test' => 'OK'], null);
+ }
+
+ /**
+ * @dataProvider getFlattenedTransTests
+ */
+ public function testFlattenedTrans($expected, $messages, $id)
+ {
+ $translator = new Translator('en');
+ $translator->addLoader('array', new ArrayLoader());
+ $translator->addResource('array', $messages, 'fr', '');
+
+ $this->assertEquals($expected, $translator->trans($id, [], '', 'fr'));
+ }
+
+ /**
+ * @dataProvider getTransChoiceTests
+ * @group legacy
+ */
+ public function testTransChoice($expected, $id, $translation, $number, $parameters, $locale, $domain)
+ {
+ $translator = new Translator('en');
+ $translator->addLoader('array', new ArrayLoader());
+ $translator->addResource('array', [(string) $id => $translation], $locale, $domain);
+
+ $this->assertEquals($expected, $translator->transChoice($id, $number, $parameters, $domain, $locale));
+ }
+
+ /**
+ * @dataProvider getInvalidLocalesTests
+ * @group legacy
+ */
+ public function testTransChoiceInvalidLocale($locale)
+ {
+ $this->expectException('Symfony\Component\Translation\Exception\InvalidArgumentException');
+ $translator = new Translator('en');
+ $translator->addLoader('array', new ArrayLoader());
+ $translator->addResource('array', ['foo' => 'foofoo'], 'en');
+
+ $translator->transChoice('foo', 1, [], '', $locale);
+ }
+
+ /**
+ * @dataProvider getValidLocalesTests
+ * @group legacy
+ */
+ public function testTransChoiceValidLocale($locale)
+ {
+ $translator = new Translator('en');
+ $translator->addLoader('array', new ArrayLoader());
+ $translator->addResource('array', ['foo' => 'foofoo'], 'en');
+
+ $translator->transChoice('foo', 1, [], '', $locale);
+ // no assertion. this method just asserts that no exception is thrown
+ $this->addToAssertionCount(1);
+ }
+
+ /**
+ * @group legacy
+ */
+ public function testTransChoiceNullLocale()
+ {
+ $translator = new Translator('en');
+ $translator->addLoader('array', new ArrayLoader());
+ $translator->addResource('array', ['foo' => 'foofoo'], 'en');
+
+ $translator->transChoice('foo', 1, [], '', null);
+ // no assertion. this method just asserts that no exception is thrown
+ $this->addToAssertionCount(1);
+ }
+
+ public function testTransNullId()
+ {
+ $translator = new Translator('en');
+ $translator->addLoader('array', new ArrayLoader());
+ $translator->addResource('array', ['foo' => 'foofoo'], 'en');
+
+ $this->assertSame('', $translator->trans(null));
+
+ (\Closure::bind(function () use ($translator) {
+ $this->assertSame([], $translator->catalogues);
+ }, $this, Translator::class))();
+ }
+
+ public function getTransFileTests()
+ {
+ return [
+ ['csv', 'CsvFileLoader'],
+ ['ini', 'IniFileLoader'],
+ ['mo', 'MoFileLoader'],
+ ['po', 'PoFileLoader'],
+ ['php', 'PhpFileLoader'],
+ ['ts', 'QtFileLoader'],
+ ['xlf', 'XliffFileLoader'],
+ ['yml', 'YamlFileLoader'],
+ ['json', 'JsonFileLoader'],
+ ];
+ }
+
+ public function getTransTests()
+ {
+ return [
+ ['Symfony est super !', 'Symfony is great!', 'Symfony est super !', [], 'fr', ''],
+ ['Symfony est awesome !', 'Symfony is %what%!', 'Symfony est %what% !', ['%what%' => 'awesome'], 'fr', ''],
+ ['Symfony est super !', new StringClass('Symfony is great!'), 'Symfony est super !', [], 'fr', ''],
+ ['', null, '', [], 'fr', ''],
+ ];
+ }
+
+ public function getFlattenedTransTests()
+ {
+ $messages = [
+ 'symfony' => [
+ 'is' => [
+ 'great' => 'Symfony est super!',
+ ],
+ ],
+ 'foo' => [
+ 'bar' => [
+ 'baz' => 'Foo Bar Baz',
+ ],
+ 'baz' => 'Foo Baz',
+ ],
+ ];
+
+ return [
+ ['Symfony est super!', $messages, 'symfony.is.great'],
+ ['Foo Bar Baz', $messages, 'foo.bar.baz'],
+ ['Foo Baz', $messages, 'foo.baz'],
+ ];
+ }
+
+ public function getTransChoiceTests()
+ {
+ return [
+ ['Il y a 0 pomme', '{0} There are no appless|{1} There is one apple|]1,Inf] There is %count% apples', '[0,1] Il y a %count% pomme|]1,Inf] Il y a %count% pommes', 0, [], 'fr', ''],
+ ['Il y a 1 pomme', '{0} There are no appless|{1} There is one apple|]1,Inf] There is %count% apples', '[0,1] Il y a %count% pomme|]1,Inf] Il y a %count% pommes', 1, [], 'fr', ''],
+ ['Il y a 10 pommes', '{0} There are no appless|{1} There is one apple|]1,Inf] There is %count% apples', '[0,1] Il y a %count% pomme|]1,Inf] Il y a %count% pommes', 10, [], 'fr', ''],
+
+ ['Il y a 0 pomme', 'There is one apple|There is %count% apples', 'Il y a %count% pomme|Il y a %count% pommes', 0, [], 'fr', ''],
+ ['Il y a 1 pomme', 'There is one apple|There is %count% apples', 'Il y a %count% pomme|Il y a %count% pommes', 1, [], 'fr', ''],
+ ['Il y a 10 pommes', 'There is one apple|There is %count% apples', 'Il y a %count% pomme|Il y a %count% pommes', 10, [], 'fr', ''],
+
+ ['Il y a 0 pomme', 'one: There is one apple|more: There is %count% apples', 'one: Il y a %count% pomme|more: Il y a %count% pommes', 0, [], 'fr', ''],
+ ['Il y a 1 pomme', 'one: There is one apple|more: There is %count% apples', 'one: Il y a %count% pomme|more: Il y a %count% pommes', 1, [], 'fr', ''],
+ ['Il y a 10 pommes', 'one: There is one apple|more: There is %count% apples', 'one: Il y a %count% pomme|more: Il y a %count% pommes', 10, [], 'fr', ''],
+
+ ['Il n\'y a aucune pomme', '{0} There are no apples|one: There is one apple|more: There is %count% apples', '{0} Il n\'y a aucune pomme|one: Il y a %count% pomme|more: Il y a %count% pommes', 0, [], 'fr', ''],
+ ['Il y a 1 pomme', '{0} There are no apples|one: There is one apple|more: There is %count% apples', '{0} Il n\'y a aucune pomme|one: Il y a %count% pomme|more: Il y a %count% pommes', 1, [], 'fr', ''],
+ ['Il y a 10 pommes', '{0} There are no apples|one: There is one apple|more: There is %count% apples', '{0} Il n\'y a aucune pomme|one: Il y a %count% pomme|more: Il y a %count% pommes', 10, [], 'fr', ''],
+
+ ['Il y a 0 pomme', new StringClass('{0} There are no appless|{1} There is one apple|]1,Inf] There is %count% apples'), '[0,1] Il y a %count% pomme|]1,Inf] Il y a %count% pommes', 0, [], 'fr', ''],
+
+ // Override %count% with a custom value
+ ['Il y a quelques pommes', 'one: There is one apple|more: There are %count% apples', 'one: Il y a %count% pomme|more: Il y a quelques pommes', 2, ['%count%' => 'quelques'], 'fr', ''],
+ ];
+ }
+
+ public function getInvalidLocalesTests()
+ {
+ return [
+ ['fr FR'],
+ ['français'],
+ ['fr+en'],
+ ['utf#8'],
+ ['fr&en'],
+ ['fr~FR'],
+ [' fr'],
+ ['fr '],
+ ['fr*'],
+ ['fr/FR'],
+ ['fr\\FR'],
+ ];
+ }
+
+ public function getValidLocalesTests()
+ {
+ return [
+ [''],
+ ['fr'],
+ ['francais'],
+ ['FR'],
+ ['frFR'],
+ ['fr-FR'],
+ ['fr_FR'],
+ ['fr.FR'],
+ ['fr-FR.UTF8'],
+ ['sr@latin'],
+ ];
+ }
+
+ /**
+ * @requires extension intl
+ */
+ public function testIntlFormattedDomain()
+ {
+ $translator = new Translator('en');
+ $translator->addLoader('array', new ArrayLoader());
+
+ $translator->addResource('array', ['some_message' => 'Hello %name%'], 'en');
+ $this->assertSame('Hello Bob', $translator->trans('some_message', ['%name%' => 'Bob']));
+
+ $translator->addResource('array', ['some_message' => 'Hi {name}'], 'en', 'messages+intl-icu');
+ $this->assertSame('Hi Bob', $translator->trans('some_message', ['%name%' => 'Bob']));
+ }
+
+ /**
+ * @group legacy
+ */
+ public function testTransChoiceFallback()
+ {
+ $translator = new Translator('ru');
+ $translator->setFallbackLocales(['en']);
+ $translator->addLoader('array', new ArrayLoader());
+ $translator->addResource('array', ['some_message2' => 'one thing|%count% things'], 'en');
+
+ $this->assertEquals('10 things', $translator->transChoice('some_message2', 10, ['%count%' => 10]));
+ }
+
+ /**
+ * @group legacy
+ */
+ public function testTransChoiceFallbackBis()
+ {
+ $translator = new Translator('ru');
+ $translator->setFallbackLocales(['en_US', 'en']);
+ $translator->addLoader('array', new ArrayLoader());
+ $translator->addResource('array', ['some_message2' => 'one thing|%count% things'], 'en_US');
+
+ $this->assertEquals('10 things', $translator->transChoice('some_message2', 10, ['%count%' => 10]));
+ }
+
+ /**
+ * @group legacy
+ */
+ public function testTransChoiceFallbackWithNoTranslation()
+ {
+ $translator = new Translator('ru');
+ $translator->setFallbackLocales(['en']);
+ $translator->addLoader('array', new ArrayLoader());
+
+ // consistent behavior with Translator::trans(), which returns the string
+ // unchanged if it can't be found
+ $this->assertEquals('some_message2', $translator->transChoice('some_message2', 10, ['%count%' => 10]));
+ }
+}
+
+class StringClass
+{
+ protected $str;
+
+ public function __construct($str)
+ {
+ $this->str = $str;
+ }
+
+ public function __toString(): string
+ {
+ return $this->str;
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Util/ArrayConverterTest.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Util/ArrayConverterTest.php
new file mode 100644
index 0000000..b033541
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Util/ArrayConverterTest.php
@@ -0,0 +1,74 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Tests\Util;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\Translation\Util\ArrayConverter;
+
+class ArrayConverterTest extends TestCase
+{
+ /**
+ * @dataProvider messagesData
+ */
+ public function testDump($input, $expectedOutput)
+ {
+ $this->assertEquals($expectedOutput, ArrayConverter::expandToTree($input));
+ }
+
+ public function messagesData()
+ {
+ return [
+ [
+ // input
+ [
+ 'foo1' => 'bar',
+ 'foo.bar' => 'value',
+ ],
+ // expected output
+ [
+ 'foo1' => 'bar',
+ 'foo' => ['bar' => 'value'],
+ ],
+ ],
+ [
+ // input
+ [
+ 'foo.bar' => 'value1',
+ 'foo.bar.test' => 'value2',
+ ],
+ // expected output
+ [
+ 'foo' => [
+ 'bar' => 'value1',
+ 'bar.test' => 'value2',
+ ],
+ ],
+ ],
+ [
+ // input
+ [
+ 'foo.level2.level3.level4' => 'value1',
+ 'foo.level2' => 'value2',
+ 'foo.bar' => 'value3',
+ ],
+ // expected output
+ [
+ 'foo' => [
+ 'level2' => 'value2',
+ 'level2.level3.level4' => 'value1',
+ 'bar' => 'value3',
+ ],
+ ],
+ ],
+ ];
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Writer/TranslationWriterTest.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Writer/TranslationWriterTest.php
new file mode 100644
index 0000000..d3b6754
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/Writer/TranslationWriterTest.php
@@ -0,0 +1,69 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Tests\Writer;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\Translation\Dumper\DumperInterface;
+use Symfony\Component\Translation\MessageCatalogue;
+use Symfony\Component\Translation\Writer\TranslationWriter;
+
+class TranslationWriterTest extends TestCase
+{
+ public function testWrite()
+ {
+ $dumper = $this->getMockBuilder('Symfony\Component\Translation\Dumper\DumperInterface')->getMock();
+ $dumper
+ ->expects($this->once())
+ ->method('dump');
+
+ $writer = new TranslationWriter();
+ $writer->addDumper('test', $dumper);
+ $writer->write(new MessageCatalogue('en'), 'test');
+ }
+
+ /**
+ * @group legacy
+ */
+ public function testDisableBackup()
+ {
+ $nonBackupDumper = new NonBackupDumper();
+ $backupDumper = new BackupDumper();
+
+ $writer = new TranslationWriter();
+ $writer->addDumper('non_backup', $nonBackupDumper);
+ $writer->addDumper('backup', $backupDumper);
+ $writer->disableBackup();
+
+ $this->assertFalse($backupDumper->backup, 'backup can be disabled if setBackup() method does exist');
+ }
+}
+
+class NonBackupDumper implements DumperInterface
+{
+ public function dump(MessageCatalogue $messages, $options = [])
+ {
+ }
+}
+
+class BackupDumper implements DumperInterface
+{
+ public $backup = true;
+
+ public function dump(MessageCatalogue $messages, $options = [])
+ {
+ }
+
+ public function setBackup($backup)
+ {
+ $this->backup = $backup;
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/empty-translation.mo b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/empty-translation.mo
new file mode 100644
index 0000000..ed01000
Binary files /dev/null and b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/empty-translation.mo differ
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/empty-translation.po b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/empty-translation.po
new file mode 100644
index 0000000..ff6f22a
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/empty-translation.po
@@ -0,0 +1,3 @@
+msgid "foo"
+msgstr ""
+
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/empty.csv b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/empty.csv
new file mode 100644
index 0000000..e69de29
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/empty.ini b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/empty.ini
new file mode 100644
index 0000000..e69de29
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/empty.json b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/empty.json
new file mode 100644
index 0000000..e69de29
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/empty.mo b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/empty.mo
new file mode 100644
index 0000000..e69de29
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/empty.po b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/empty.po
new file mode 100644
index 0000000..e69de29
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/empty.xlf b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/empty.xlf
new file mode 100644
index 0000000..e69de29
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/empty.yml b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/empty.yml
new file mode 100644
index 0000000..e69de29
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/encoding.xlf b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/encoding.xlf
new file mode 100644
index 0000000..0a88f92
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/encoding.xlf
@@ -0,0 +1,16 @@
+
+
+
+
+
+ foo
+ bär
+ bäz
+
+
+ bar
+ föö
+
+
+
+
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/escaped-id-plurals.po b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/escaped-id-plurals.po
new file mode 100644
index 0000000..c412aa2
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/escaped-id-plurals.po
@@ -0,0 +1,10 @@
+msgid ""
+msgstr ""
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: en\n"
+
+msgid "escaped \"foo\""
+msgid_plural "escaped \"foos\""
+msgstr[0] "escaped \"bar\""
+msgstr[1] "escaped \"bars\""
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/escaped-id.po b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/escaped-id.po
new file mode 100644
index 0000000..308eadd
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/escaped-id.po
@@ -0,0 +1,8 @@
+msgid ""
+msgstr ""
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: en\n"
+
+msgid "escaped \"foo\""
+msgstr "escaped \"bar\""
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/extractor/resource.format.engine b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/extractor/resource.format.engine
new file mode 100644
index 0000000..e69de29
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/extractor/this.is.a.template.format.engine b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/extractor/this.is.a.template.format.engine
new file mode 100644
index 0000000..e69de29
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/extractor/translation.html.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/extractor/translation.html.php
new file mode 100644
index 0000000..5085eab
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/extractor/translation.html.php
@@ -0,0 +1,59 @@
+This template is used for translation message extraction tests
+trans('single-quoted key'); ?>
+trans('double-quoted key'); ?>
+trans(<<
+trans(<<<'EOF'
+nowdoc key
+EOF
+); ?>
+trans(
+ "double-quoted key with whitespace and escaped \$\n\" sequences"
+); ?>
+trans(
+ 'single-quoted key with whitespace and nonescaped \$\n\' sequences'
+); ?>
+trans(<<
+trans(<<<'EOF'
+nowdoc key with whitespace and nonescaped \$\n sequences
+EOF
+); ?>
+
+trans('single-quoted key with "quote mark at the end"'); ?>
+
+transChoice(
+ '{0} There is no apples|{1} There is one apple|]1,Inf[ There are %count% apples',
+ 10,
+ ['%count%' => 10]
+); ?>
+
+trans('concatenated'.' message'.<<
+
+trans('other-domain-test-no-params-short-array', [], 'not_messages'); ?>
+
+trans('other-domain-test-no-params-long-array', [], 'not_messages'); ?>
+
+trans('other-domain-test-params-short-array', ['foo' => 'bar'], 'not_messages'); ?>
+
+trans('other-domain-test-params-long-array', ['foo' => 'bar'], 'not_messages'); ?>
+
+transChoice('other-domain-test-trans-choice-short-array-%count%', 10, ['%count%' => 10], 'not_messages'); ?>
+
+transChoice('other-domain-test-trans-choice-long-array-%count%', 10, ['%count%' => 10], 'not_messages'); ?>
+
+trans('typecast', ['a' => (int) '123'], 'not_messages'); ?>
+transChoice('msg1', 10 + 1, [], 'not_messages'); ?>
+transChoice('msg2', ceil(4.5), [], 'not_messages'); ?>
+
+trans('default domain', [], null); ?>
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/fuzzy-translations.po b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/fuzzy-translations.po
new file mode 100644
index 0000000..04d4047
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/fuzzy-translations.po
@@ -0,0 +1,10 @@
+#, php-format
+msgid "foo1"
+msgstr "bar1"
+
+#, fuzzy, php-format
+msgid "foo2"
+msgstr "fuzzy bar2"
+
+msgid "foo3"
+msgstr "bar3"
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/invalid-xml-resources.xlf b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/invalid-xml-resources.xlf
new file mode 100644
index 0000000..7bf6c98
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/invalid-xml-resources.xlf
@@ -0,0 +1,23 @@
+
+
+
+
+
+ foo
+ bar
+
+
+ extra
+
+
+ key
+
+
+
+ test
+ with
+ note
+
+
+
+
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/malformed.json b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/malformed.json
new file mode 100644
index 0000000..4563ec6
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/malformed.json
@@ -0,0 +1,3 @@
+{
+ "foo" "bar"
+}
\ No newline at end of file
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/messages.yml b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/messages.yml
new file mode 100644
index 0000000..d4f82d7
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/messages.yml
@@ -0,0 +1,3 @@
+foo:
+ bar1: value1
+ bar2: value2
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/messages_linear.yml b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/messages_linear.yml
new file mode 100644
index 0000000..6c1687d
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/messages_linear.yml
@@ -0,0 +1,2 @@
+foo.bar1: value1
+foo.bar2: value2
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/missing-plurals.po b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/missing-plurals.po
new file mode 100644
index 0000000..3b47fca
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/missing-plurals.po
@@ -0,0 +1,4 @@
+msgid "foo"
+msgid_plural "foos"
+msgstr[3] "bars"
+msgstr[1] "bar"
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/non-valid.xlf b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/non-valid.xlf
new file mode 100644
index 0000000..734fc97
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/non-valid.xlf
@@ -0,0 +1,11 @@
+
+
+
+
+
+ foo
+ bar
+
+
+
+
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/non-valid.yml b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/non-valid.yml
new file mode 100644
index 0000000..257cc56
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/non-valid.yml
@@ -0,0 +1 @@
+foo
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/plurals.mo b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/plurals.mo
new file mode 100644
index 0000000..3945ad9
Binary files /dev/null and b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/plurals.mo differ
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/plurals.po b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/plurals.po
new file mode 100644
index 0000000..5d7b39d
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/plurals.po
@@ -0,0 +1,13 @@
+msgid ""
+msgstr ""
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: en\n"
+
+msgid "foo"
+msgid_plural "foos"
+msgstr[0] "bar"
+msgstr[1] "bars"
+
+msgid "{0} no foos|one foo|%count% foos"
+msgstr "{0} no bars|one bar|%count% bars"
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resname.xlf b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resname.xlf
new file mode 100644
index 0000000..4fa5c00
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resname.xlf
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+ bar
+
+
+ bar source
+ baz
+
+
+ baz
+ foo
+
+
+ qux source
+
+
+
+
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resourcebundle/corrupted/resources.dat b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resourcebundle/corrupted/resources.dat
new file mode 100644
index 0000000..391250c
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resourcebundle/corrupted/resources.dat
@@ -0,0 +1 @@
+XXX
\ No newline at end of file
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resourcebundle/dat/en.res b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resourcebundle/dat/en.res
new file mode 100644
index 0000000..1fc1436
Binary files /dev/null and b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resourcebundle/dat/en.res differ
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resourcebundle/dat/en.txt b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resourcebundle/dat/en.txt
new file mode 100644
index 0000000..3d9e9ea
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resourcebundle/dat/en.txt
@@ -0,0 +1,3 @@
+en{
+ symfony{"Symfony is great"}
+}
\ No newline at end of file
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resourcebundle/dat/fr.res b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resourcebundle/dat/fr.res
new file mode 100644
index 0000000..f584160
Binary files /dev/null and b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resourcebundle/dat/fr.res differ
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resourcebundle/dat/fr.txt b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resourcebundle/dat/fr.txt
new file mode 100644
index 0000000..182d0a0
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resourcebundle/dat/fr.txt
@@ -0,0 +1,3 @@
+fr{
+ symfony{"Symfony est génial"}
+}
\ No newline at end of file
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resourcebundle/dat/packagelist.txt b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resourcebundle/dat/packagelist.txt
new file mode 100644
index 0000000..c5783ed
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resourcebundle/dat/packagelist.txt
@@ -0,0 +1,2 @@
+en.res
+fr.res
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resourcebundle/dat/resources.dat b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resourcebundle/dat/resources.dat
new file mode 100644
index 0000000..563b0ea
Binary files /dev/null and b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resourcebundle/dat/resources.dat differ
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resourcebundle/res/en.res b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resourcebundle/res/en.res
new file mode 100644
index 0000000..ad894a9
Binary files /dev/null and b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resourcebundle/res/en.res differ
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resources-2.0+intl-icu.xlf b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resources-2.0+intl-icu.xlf
new file mode 100644
index 0000000..6294f16
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resources-2.0+intl-icu.xlf
@@ -0,0 +1,11 @@
+
+
+
+
+
+ foo
+ bar
+
+
+
+
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resources-2.0-clean.xlf b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resources-2.0-clean.xlf
new file mode 100644
index 0000000..efa69b2
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resources-2.0-clean.xlf
@@ -0,0 +1,23 @@
+
+
+
+
+
+ foo
+ bar
+
+
+
+
+ key
+
+
+
+
+
+ key.with.cdata
+ & ]]>
+
+
+
+
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resources-2.0-multi-segment-unit.xlf b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resources-2.0-multi-segment-unit.xlf
new file mode 100644
index 0000000..d0dc2a8
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resources-2.0-multi-segment-unit.xlf
@@ -0,0 +1,17 @@
+
+
+
+
+ true
+
+
+ foo
+ foo (translated)
+
+
+ bar
+ bar (translated)
+
+
+
+
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resources-2.0.xlf b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resources-2.0.xlf
new file mode 100644
index 0000000..166172a
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resources-2.0.xlf
@@ -0,0 +1,25 @@
+
+
+
+
+
+ Quetzal
+ Quetzal
+
+
+
+
+
+ foo
+ XLIFF 文書を編集ã€ã¾ãŸã¯å‡¦ç† ã™ã‚‹ã‚¢ãƒ—リケーションã§ã™ã€‚
+
+
+
+
+ bar
+ XLIFF データ・マãƒãƒ¼ã‚¸ãƒ£
+
+
+
+
+
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resources-clean.xlf b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resources-clean.xlf
new file mode 100644
index 0000000..00c8a5c
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resources-clean.xlf
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+ foo
+ bar
+ baz
+
+
+ key
+
+ baz
+ qux
+
+
+ key.with.cdata
+ & ]]>
+
+
+
+
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resources-multi-files.xlf b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resources-multi-files.xlf
new file mode 100644
index 0000000..5f45150
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resources-multi-files.xlf
@@ -0,0 +1,27 @@
+
+
+
+
+
+ foo
+ bar
+
+
+
+
+
+
+ extra
+
+
+ key
+
+
+
+ test
+ with
+ note
+
+
+
+
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resources-notes-meta.xlf b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resources-notes-meta.xlf
new file mode 100644
index 0000000..7d5bbd4
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resources-notes-meta.xlf
@@ -0,0 +1,26 @@
+
+
+
+
+
+ new
+ true
+ user login
+
+
+ foo
+ bar
+
+
+
+
+ x_content
+ Fuzzy
+
+
+ baz
+ biz
+
+
+
+
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resources-target-attributes.xlf b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resources-target-attributes.xlf
new file mode 100644
index 0000000..700d281
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resources-target-attributes.xlf
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+ foo
+ bar
+
+
+
+
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resources-tool-info.xlf b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resources-tool-info.xlf
new file mode 100644
index 0000000..1c2ae95
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resources-tool-info.xlf
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+ foo
+ bar
+
+
+
+
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resources.csv b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resources.csv
new file mode 100644
index 0000000..374b9eb
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resources.csv
@@ -0,0 +1,4 @@
+"foo"; "bar"
+#"bar"; "foo"
+"incorrect"; "number"; "columns"; "will"; "be"; "ignored"
+"incorrect"
\ No newline at end of file
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resources.dump.json b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resources.dump.json
new file mode 100644
index 0000000..335965d
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resources.dump.json
@@ -0,0 +1 @@
+{"foo":"\u0022bar\u0022"}
\ No newline at end of file
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resources.ini b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resources.ini
new file mode 100644
index 0000000..4953062
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resources.ini
@@ -0,0 +1 @@
+foo="bar"
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resources.json b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resources.json
new file mode 100644
index 0000000..8a79687
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resources.json
@@ -0,0 +1,3 @@
+{
+ "foo": "bar"
+}
\ No newline at end of file
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resources.mo b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resources.mo
new file mode 100644
index 0000000..0a96602
Binary files /dev/null and b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resources.mo differ
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resources.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resources.php
new file mode 100644
index 0000000..c291398
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resources.php
@@ -0,0 +1,5 @@
+ 'bar',
+);
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resources.po b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resources.po
new file mode 100644
index 0000000..68e0f2d
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resources.po
@@ -0,0 +1,24 @@
+msgid ""
+msgstr ""
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: en\n"
+
+msgid "foo"
+msgstr "bar"
+
+msgid "bar"
+msgstr "foo"
+
+# Comment 1
+# Comment 2
+#, fuzzy,another
+#: src/file_1 src/file_2:50
+msgid "foo_bar"
+msgstr "foobar"
+
+# Comment
+#, fuzzy
+#: src/file_1
+msgid "bar_foo"
+msgstr "barfoo"
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resources.ts b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resources.ts
new file mode 100644
index 0000000..29e6a6f
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resources.ts
@@ -0,0 +1,21 @@
+
+
+
+ resources
+
+ foo
+ bar
+
+
+
+
+ foo_bar
+ foobar
+
+
+
+ bar_foo
+ barfoo
+
+
+
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resources.xlf b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resources.xlf
new file mode 100644
index 0000000..b0e5988
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resources.xlf
@@ -0,0 +1,23 @@
+
+
+
+
+
+ foo
+ bar
+
+
+ extra
+
+
+ key
+
+
+
+ test
+ with
+ note
+
+
+
+
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resources.yml b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resources.yml
new file mode 100644
index 0000000..20e9ff3
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/resources.yml
@@ -0,0 +1 @@
+foo: bar
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/valid.csv b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/valid.csv
new file mode 100644
index 0000000..59882e5
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/valid.csv
@@ -0,0 +1,4 @@
+foo;bar
+bar;"foo
+foo"
+"foo;foo";bar
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/with-attributes.xlf b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/with-attributes.xlf
new file mode 100644
index 0000000..7873062
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/with-attributes.xlf
@@ -0,0 +1,21 @@
+
+
+
+
+
+ foo
+ bar
+
+
+ extra
+ bar
+
+
+ key
+
+ baz
+ qux
+
+
+
+
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/withdoctype.xlf b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/withdoctype.xlf
new file mode 100644
index 0000000..f83e834
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/withdoctype.xlf
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+ foo
+ bar
+
+
+
+
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/withnote.xlf b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/withnote.xlf
new file mode 100644
index 0000000..f98cf7f
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Tests/fixtures/withnote.xlf
@@ -0,0 +1,22 @@
+
+
+
+
+
+ foo
+ bar
+ foo
+
+
+ extrasource
+ bar
+
+
+ key
+
+ baz
+ qux
+
+
+
+
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Translator.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Translator.php
new file mode 100644
index 0000000..9876051
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Translator.php
@@ -0,0 +1,540 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation;
+
+use Symfony\Component\Config\ConfigCacheFactory;
+use Symfony\Component\Config\ConfigCacheFactoryInterface;
+use Symfony\Component\Config\ConfigCacheInterface;
+use Symfony\Component\Translation\Exception\InvalidArgumentException;
+use Symfony\Component\Translation\Exception\LogicException;
+use Symfony\Component\Translation\Exception\NotFoundResourceException;
+use Symfony\Component\Translation\Exception\RuntimeException;
+use Symfony\Component\Translation\Formatter\ChoiceMessageFormatterInterface;
+use Symfony\Component\Translation\Formatter\IntlFormatterInterface;
+use Symfony\Component\Translation\Formatter\MessageFormatter;
+use Symfony\Component\Translation\Formatter\MessageFormatterInterface;
+use Symfony\Component\Translation\Loader\LoaderInterface;
+use Symfony\Component\Translation\TranslatorInterface as LegacyTranslatorInterface;
+use Symfony\Contracts\Translation\TranslatorInterface;
+
+/**
+ * @author Fabien Potencier
+ */
+class Translator implements LegacyTranslatorInterface, TranslatorInterface, TranslatorBagInterface
+{
+ /**
+ * @var MessageCatalogueInterface[]
+ */
+ protected $catalogues = [];
+
+ /**
+ * @var string
+ */
+ private $locale;
+
+ /**
+ * @var array
+ */
+ private $fallbackLocales = [];
+
+ /**
+ * @var LoaderInterface[]
+ */
+ private $loaders = [];
+
+ /**
+ * @var array
+ */
+ private $resources = [];
+
+ /**
+ * @var MessageFormatterInterface
+ */
+ private $formatter;
+
+ /**
+ * @var string
+ */
+ private $cacheDir;
+
+ /**
+ * @var bool
+ */
+ private $debug;
+
+ private $cacheVary;
+
+ /**
+ * @var ConfigCacheFactoryInterface|null
+ */
+ private $configCacheFactory;
+
+ /**
+ * @var array|null
+ */
+ private $parentLocales;
+
+ private $hasIntlFormatter;
+
+ /**
+ * @throws InvalidArgumentException If a locale contains invalid characters
+ */
+ public function __construct(?string $locale, MessageFormatterInterface $formatter = null, string $cacheDir = null, bool $debug = false, array $cacheVary = [])
+ {
+ if (null === $locale) {
+ @trigger_error(sprintf('Passing "null" as the $locale argument to %s() is deprecated since Symfony 4.4.', __METHOD__), E_USER_DEPRECATED);
+ }
+
+ $this->setLocale($locale, false);
+
+ if (null === $formatter) {
+ $formatter = new MessageFormatter();
+ }
+
+ $this->formatter = $formatter;
+ $this->cacheDir = $cacheDir;
+ $this->debug = $debug;
+ $this->cacheVary = $cacheVary;
+ $this->hasIntlFormatter = $formatter instanceof IntlFormatterInterface;
+ }
+
+ public function setConfigCacheFactory(ConfigCacheFactoryInterface $configCacheFactory)
+ {
+ $this->configCacheFactory = $configCacheFactory;
+ }
+
+ /**
+ * Adds a Loader.
+ *
+ * @param string $format The name of the loader (@see addResource())
+ */
+ public function addLoader($format, LoaderInterface $loader)
+ {
+ $this->loaders[$format] = $loader;
+ }
+
+ /**
+ * Adds a Resource.
+ *
+ * @param string $format The name of the loader (@see addLoader())
+ * @param mixed $resource The resource name
+ * @param string $locale The locale
+ * @param string $domain The domain
+ *
+ * @throws InvalidArgumentException If the locale contains invalid characters
+ */
+ public function addResource($format, $resource, $locale, $domain = null)
+ {
+ if (null === $domain) {
+ $domain = 'messages';
+ }
+
+ if (null === $locale) {
+ @trigger_error(sprintf('Passing "null" to the third argument of the "%s" method has been deprecated since Symfony 4.4 and will throw an error in 5.0.', __METHOD__), E_USER_DEPRECATED);
+ }
+
+ $this->assertValidLocale($locale);
+
+ $this->resources[$locale][] = [$format, $resource, $domain];
+
+ if (\in_array($locale, $this->fallbackLocales)) {
+ $this->catalogues = [];
+ } else {
+ unset($this->catalogues[$locale]);
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function setLocale($locale)
+ {
+ if (null === $locale && (2 > \func_num_args() || func_get_arg(1))) {
+ @trigger_error(sprintf('Passing "null" as the $locale argument to %s() is deprecated since Symfony 4.4.', __METHOD__), E_USER_DEPRECATED);
+ }
+
+ $this->assertValidLocale($locale);
+ $this->locale = $locale;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getLocale()
+ {
+ return $this->locale;
+ }
+
+ /**
+ * Sets the fallback locales.
+ *
+ * @param array $locales The fallback locales
+ *
+ * @throws InvalidArgumentException If a locale contains invalid characters
+ */
+ public function setFallbackLocales(array $locales)
+ {
+ // needed as the fallback locales are linked to the already loaded catalogues
+ $this->catalogues = [];
+
+ foreach ($locales as $locale) {
+ if (null === $locale) {
+ @trigger_error(sprintf('Passing "null" as the $locale argument to %s() is deprecated since Symfony 4.4.', __METHOD__), E_USER_DEPRECATED);
+ }
+ $this->assertValidLocale($locale);
+ }
+
+ $this->fallbackLocales = $this->cacheVary['fallback_locales'] = $locales;
+ }
+
+ /**
+ * Gets the fallback locales.
+ *
+ * @internal since Symfony 4.2
+ *
+ * @return array The fallback locales
+ */
+ public function getFallbackLocales()
+ {
+ return $this->fallbackLocales;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function trans($id, array $parameters = [], $domain = null, $locale = null)
+ {
+ if ('' === $id = (string) $id) {
+ return '';
+ }
+
+ if (null === $domain) {
+ $domain = 'messages';
+ }
+
+ $catalogue = $this->getCatalogue($locale);
+ $locale = $catalogue->getLocale();
+ while (!$catalogue->defines($id, $domain)) {
+ if ($cat = $catalogue->getFallbackCatalogue()) {
+ $catalogue = $cat;
+ $locale = $catalogue->getLocale();
+ } else {
+ break;
+ }
+ }
+
+ if ($this->hasIntlFormatter && $catalogue->defines($id, $domain.MessageCatalogue::INTL_DOMAIN_SUFFIX)) {
+ return $this->formatter->formatIntl($catalogue->get($id, $domain), $locale, $parameters);
+ }
+
+ return $this->formatter->format($catalogue->get($id, $domain), $locale, $parameters);
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @deprecated since Symfony 4.2, use the trans() method instead with a %count% parameter
+ */
+ public function transChoice($id, $number, array $parameters = [], $domain = null, $locale = null)
+ {
+ @trigger_error(sprintf('The "%s()" method is deprecated since Symfony 4.2, use the trans() one instead with a "%%count%%" parameter.', __METHOD__), E_USER_DEPRECATED);
+
+ if ('' === $id = (string) $id) {
+ return '';
+ }
+
+ if (!$this->formatter instanceof ChoiceMessageFormatterInterface) {
+ throw new LogicException(sprintf('The formatter "%s" does not support plural translations.', \get_class($this->formatter)));
+ }
+
+ if (null === $domain) {
+ $domain = 'messages';
+ }
+
+ $catalogue = $this->getCatalogue($locale);
+ $locale = $catalogue->getLocale();
+ while (!$catalogue->defines($id, $domain)) {
+ if ($cat = $catalogue->getFallbackCatalogue()) {
+ $catalogue = $cat;
+ $locale = $catalogue->getLocale();
+ } else {
+ break;
+ }
+ }
+
+ if ($this->hasIntlFormatter && $catalogue->defines($id, $domain.MessageCatalogue::INTL_DOMAIN_SUFFIX)) {
+ return $this->formatter->formatIntl($catalogue->get($id, $domain), $locale, ['%count%' => $number] + $parameters);
+ }
+
+ return $this->formatter->choiceFormat($catalogue->get($id, $domain), $number, $locale, $parameters);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getCatalogue($locale = null)
+ {
+ if (null === $locale) {
+ $locale = $this->getLocale();
+ } else {
+ $this->assertValidLocale($locale);
+ }
+
+ if (!isset($this->catalogues[$locale])) {
+ $this->loadCatalogue($locale);
+ }
+
+ return $this->catalogues[$locale];
+ }
+
+ /**
+ * Gets the loaders.
+ *
+ * @return array LoaderInterface[]
+ */
+ protected function getLoaders()
+ {
+ return $this->loaders;
+ }
+
+ /**
+ * @param string $locale
+ */
+ protected function loadCatalogue($locale)
+ {
+ if (null === $this->cacheDir) {
+ $this->initializeCatalogue($locale);
+ } else {
+ $this->initializeCacheCatalogue($locale);
+ }
+ }
+
+ /**
+ * @param string $locale
+ */
+ protected function initializeCatalogue($locale)
+ {
+ $this->assertValidLocale($locale);
+
+ try {
+ $this->doLoadCatalogue($locale);
+ } catch (NotFoundResourceException $e) {
+ if (!$this->computeFallbackLocales($locale)) {
+ throw $e;
+ }
+ }
+ $this->loadFallbackCatalogues($locale);
+ }
+
+ private function initializeCacheCatalogue(string $locale): void
+ {
+ if (isset($this->catalogues[$locale])) {
+ /* Catalogue already initialized. */
+ return;
+ }
+
+ $this->assertValidLocale($locale);
+ $cache = $this->getConfigCacheFactory()->cache($this->getCatalogueCachePath($locale),
+ function (ConfigCacheInterface $cache) use ($locale) {
+ $this->dumpCatalogue($locale, $cache);
+ }
+ );
+
+ if (isset($this->catalogues[$locale])) {
+ /* Catalogue has been initialized as it was written out to cache. */
+ return;
+ }
+
+ /* Read catalogue from cache. */
+ $this->catalogues[$locale] = include $cache->getPath();
+ }
+
+ private function dumpCatalogue(string $locale, ConfigCacheInterface $cache): void
+ {
+ $this->initializeCatalogue($locale);
+ $fallbackContent = $this->getFallbackContent($this->catalogues[$locale]);
+
+ $content = sprintf(<<getAllMessages($this->catalogues[$locale]), true),
+ $fallbackContent
+ );
+
+ $cache->write($content, $this->catalogues[$locale]->getResources());
+ }
+
+ private function getFallbackContent(MessageCatalogue $catalogue): string
+ {
+ $fallbackContent = '';
+ $current = '';
+ $replacementPattern = '/[^a-z0-9_]/i';
+ $fallbackCatalogue = $catalogue->getFallbackCatalogue();
+ while ($fallbackCatalogue) {
+ $fallback = $fallbackCatalogue->getLocale();
+ $fallbackSuffix = ucfirst(preg_replace($replacementPattern, '_', $fallback));
+ $currentSuffix = ucfirst(preg_replace($replacementPattern, '_', $current));
+
+ $fallbackContent .= sprintf(<<<'EOF'
+$catalogue%s = new MessageCatalogue('%s', %s);
+$catalogue%s->addFallbackCatalogue($catalogue%s);
+
+EOF
+ ,
+ $fallbackSuffix,
+ $fallback,
+ var_export($this->getAllMessages($fallbackCatalogue), true),
+ $currentSuffix,
+ $fallbackSuffix
+ );
+ $current = $fallbackCatalogue->getLocale();
+ $fallbackCatalogue = $fallbackCatalogue->getFallbackCatalogue();
+ }
+
+ return $fallbackContent;
+ }
+
+ private function getCatalogueCachePath(string $locale): string
+ {
+ return $this->cacheDir.'/catalogue.'.$locale.'.'.strtr(substr(base64_encode(hash('sha256', serialize($this->cacheVary), true)), 0, 7), '/', '_').'.php';
+ }
+
+ /**
+ * @internal
+ */
+ protected function doLoadCatalogue(string $locale): void
+ {
+ $this->catalogues[$locale] = new MessageCatalogue($locale);
+
+ if (isset($this->resources[$locale])) {
+ foreach ($this->resources[$locale] as $resource) {
+ if (!isset($this->loaders[$resource[0]])) {
+ throw new RuntimeException(sprintf('The "%s" translation loader is not registered.', $resource[0]));
+ }
+ $this->catalogues[$locale]->addCatalogue($this->loaders[$resource[0]]->load($resource[1], $locale, $resource[2]));
+ }
+ }
+ }
+
+ private function loadFallbackCatalogues(string $locale): void
+ {
+ $current = $this->catalogues[$locale];
+
+ foreach ($this->computeFallbackLocales($locale) as $fallback) {
+ if (!isset($this->catalogues[$fallback])) {
+ $this->initializeCatalogue($fallback);
+ }
+
+ $fallbackCatalogue = new MessageCatalogue($fallback, $this->getAllMessages($this->catalogues[$fallback]));
+ foreach ($this->catalogues[$fallback]->getResources() as $resource) {
+ $fallbackCatalogue->addResource($resource);
+ }
+ $current->addFallbackCatalogue($fallbackCatalogue);
+ $current = $fallbackCatalogue;
+ }
+ }
+
+ protected function computeFallbackLocales($locale)
+ {
+ if (null === $this->parentLocales) {
+ $parentLocales = json_decode(file_get_contents(__DIR__.'/Resources/data/parents.json'), true);
+ }
+
+ $locales = [];
+ foreach ($this->fallbackLocales as $fallback) {
+ if ($fallback === $locale) {
+ continue;
+ }
+
+ $locales[] = $fallback;
+ }
+
+ while ($locale) {
+ $parent = $parentLocales[$locale] ?? null;
+
+ if ($parent) {
+ $locale = 'root' !== $parent ? $parent : null;
+ } elseif (\function_exists('locale_parse')) {
+ $localeSubTags = locale_parse($locale);
+ $locale = null;
+ if (1 < \count($localeSubTags)) {
+ array_pop($localeSubTags);
+ $locale = locale_compose($localeSubTags) ?: null;
+ }
+ } elseif ($i = strrpos($locale, '_') ?: strrpos($locale, '-')) {
+ $locale = substr($locale, 0, $i);
+ } else {
+ $locale = null;
+ }
+
+ if (null !== $locale) {
+ array_unshift($locales, $locale);
+ }
+ }
+
+ return array_unique($locales);
+ }
+
+ /**
+ * Asserts that the locale is valid, throws an Exception if not.
+ *
+ * @param string $locale Locale to tests
+ *
+ * @throws InvalidArgumentException If the locale contains invalid characters
+ */
+ protected function assertValidLocale($locale)
+ {
+ if (1 !== preg_match('/^[a-z0-9@_\\.\\-]*$/i', $locale)) {
+ throw new InvalidArgumentException(sprintf('Invalid "%s" locale.', $locale));
+ }
+ }
+
+ /**
+ * Provides the ConfigCache factory implementation, falling back to a
+ * default implementation if necessary.
+ */
+ private function getConfigCacheFactory(): ConfigCacheFactoryInterface
+ {
+ if (!$this->configCacheFactory) {
+ $this->configCacheFactory = new ConfigCacheFactory($this->debug);
+ }
+
+ return $this->configCacheFactory;
+ }
+
+ private function getAllMessages(MessageCatalogueInterface $catalogue): array
+ {
+ $allMessages = [];
+
+ foreach ($catalogue->all() as $domain => $messages) {
+ if ($intlMessages = $catalogue->all($domain.MessageCatalogue::INTL_DOMAIN_SUFFIX)) {
+ $allMessages[$domain.MessageCatalogue::INTL_DOMAIN_SUFFIX] = $intlMessages;
+ $messages = array_diff_key($messages, $intlMessages);
+ }
+ if ($messages) {
+ $allMessages[$domain] = $messages;
+ }
+ }
+
+ return $allMessages;
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/TranslatorBagInterface.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/TranslatorBagInterface.php
new file mode 100644
index 0000000..5e49e2d
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/TranslatorBagInterface.php
@@ -0,0 +1,33 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation;
+
+use Symfony\Component\Translation\Exception\InvalidArgumentException;
+
+/**
+ * TranslatorBagInterface.
+ *
+ * @author Abdellatif Ait boudad
+ */
+interface TranslatorBagInterface
+{
+ /**
+ * Gets the catalogue by locale.
+ *
+ * @param string|null $locale The locale or null to use the default
+ *
+ * @return MessageCatalogueInterface
+ *
+ * @throws InvalidArgumentException If the locale contains invalid characters
+ */
+ public function getCatalogue($locale = null);
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/TranslatorInterface.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/TranslatorInterface.php
new file mode 100644
index 0000000..f677d24
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/TranslatorInterface.php
@@ -0,0 +1,70 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation;
+
+use Symfony\Component\Translation\Exception\InvalidArgumentException;
+use Symfony\Contracts\Translation\LocaleAwareInterface;
+
+/**
+ * TranslatorInterface.
+ *
+ * @author Fabien Potencier
+ *
+ * @deprecated since Symfony 4.2, use Symfony\Contracts\Translation\TranslatorInterface instead
+ */
+interface TranslatorInterface extends LocaleAwareInterface
+{
+ /**
+ * Translates the given message.
+ *
+ * @param string $id The message id (may also be an object that can be cast to string)
+ * @param array $parameters An array of parameters for the message
+ * @param string|null $domain The domain for the message or null to use the default
+ * @param string|null $locale The locale or null to use the default
+ *
+ * @return string The translated string
+ *
+ * @throws InvalidArgumentException If the locale contains invalid characters
+ */
+ public function trans($id, array $parameters = [], $domain = null, $locale = null);
+
+ /**
+ * Translates the given choice message by choosing a translation according to a number.
+ *
+ * @param string $id The message id (may also be an object that can be cast to string)
+ * @param int $number The number to use to find the index of the message
+ * @param array $parameters An array of parameters for the message
+ * @param string|null $domain The domain for the message or null to use the default
+ * @param string|null $locale The locale or null to use the default
+ *
+ * @return string The translated string
+ *
+ * @throws InvalidArgumentException If the locale contains invalid characters
+ */
+ public function transChoice($id, $number, array $parameters = [], $domain = null, $locale = null);
+
+ /**
+ * Sets the current locale.
+ *
+ * @param string $locale The locale
+ *
+ * @throws InvalidArgumentException If the locale contains invalid characters
+ */
+ public function setLocale($locale);
+
+ /**
+ * Returns the current locale.
+ *
+ * @return string The locale
+ */
+ public function getLocale();
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Util/ArrayConverter.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Util/ArrayConverter.php
new file mode 100644
index 0000000..22c602e
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Util/ArrayConverter.php
@@ -0,0 +1,99 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Util;
+
+/**
+ * ArrayConverter generates tree like structure from a message catalogue.
+ * e.g. this
+ * 'foo.bar1' => 'test1',
+ * 'foo.bar2' => 'test2'
+ * converts to follows:
+ * foo:
+ * bar1: test1
+ * bar2: test2.
+ *
+ * @author Gennady Telegin
+ */
+class ArrayConverter
+{
+ /**
+ * Converts linear messages array to tree-like array.
+ * For example this array('foo.bar' => 'value') will be converted to ['foo' => ['bar' => 'value']].
+ *
+ * @param array $messages Linear messages array
+ *
+ * @return array Tree-like messages array
+ */
+ public static function expandToTree(array $messages)
+ {
+ $tree = [];
+
+ foreach ($messages as $id => $value) {
+ $referenceToElement = &self::getElementByPath($tree, explode('.', $id));
+
+ $referenceToElement = $value;
+
+ unset($referenceToElement);
+ }
+
+ return $tree;
+ }
+
+ private static function &getElementByPath(array &$tree, array $parts)
+ {
+ $elem = &$tree;
+ $parentOfElem = null;
+
+ foreach ($parts as $i => $part) {
+ if (isset($elem[$part]) && \is_string($elem[$part])) {
+ /* Process next case:
+ * 'foo': 'test1',
+ * 'foo.bar': 'test2'
+ *
+ * $tree['foo'] was string before we found array {bar: test2}.
+ * Treat new element as string too, e.g. add $tree['foo.bar'] = 'test2';
+ */
+ $elem = &$elem[implode('.', \array_slice($parts, $i))];
+ break;
+ }
+ $parentOfElem = &$elem;
+ $elem = &$elem[$part];
+ }
+
+ if ($elem && \is_array($elem) && $parentOfElem) {
+ /* Process next case:
+ * 'foo.bar': 'test1'
+ * 'foo': 'test2'
+ *
+ * $tree['foo'] was array = {bar: 'test1'} before we found string constant `foo`.
+ * Cancel treating $tree['foo'] as array and cancel back it expansion,
+ * e.g. make it $tree['foo.bar'] = 'test1' again.
+ */
+ self::cancelExpand($parentOfElem, $part, $elem);
+ }
+
+ return $elem;
+ }
+
+ private static function cancelExpand(array &$tree, $prefix, array $node)
+ {
+ $prefix .= '.';
+
+ foreach ($node as $id => $value) {
+ if (\is_string($value)) {
+ $tree[$prefix.$id] = $value;
+ } else {
+ self::cancelExpand($tree, $prefix.$id, $value);
+ }
+ }
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Util/XliffUtils.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Util/XliffUtils.php
new file mode 100644
index 0000000..b5ff4ef
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Util/XliffUtils.php
@@ -0,0 +1,163 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Util;
+
+use Symfony\Component\Translation\Exception\InvalidArgumentException;
+use Symfony\Component\Translation\Exception\InvalidResourceException;
+
+/**
+ * Provides some utility methods for XLIFF translation files, such as validating
+ * their contents according to the XSD schema.
+ *
+ * @author Fabien Potencier
+ */
+class XliffUtils
+{
+ /**
+ * Gets xliff file version based on the root "version" attribute.
+ *
+ * Defaults to 1.2 for backwards compatibility.
+ *
+ * @throws InvalidArgumentException
+ */
+ public static function getVersionNumber(\DOMDocument $dom): string
+ {
+ /** @var \DOMNode $xliff */
+ foreach ($dom->getElementsByTagName('xliff') as $xliff) {
+ $version = $xliff->attributes->getNamedItem('version');
+ if ($version) {
+ return $version->nodeValue;
+ }
+
+ $namespace = $xliff->attributes->getNamedItem('xmlns');
+ if ($namespace) {
+ if (0 !== substr_compare('urn:oasis:names:tc:xliff:document:', $namespace->nodeValue, 0, 34)) {
+ throw new InvalidArgumentException(sprintf('Not a valid XLIFF namespace "%s".', $namespace));
+ }
+
+ return substr($namespace, 34);
+ }
+ }
+
+ // Falls back to v1.2
+ return '1.2';
+ }
+
+ /**
+ * Validates and parses the given file into a DOMDocument.
+ *
+ * @throws InvalidResourceException
+ */
+ public static function validateSchema(\DOMDocument $dom): array
+ {
+ $xliffVersion = static::getVersionNumber($dom);
+ $internalErrors = libxml_use_internal_errors(true);
+ $disableEntities = libxml_disable_entity_loader(false);
+
+ $isValid = @$dom->schemaValidateSource(self::getSchema($xliffVersion));
+ if (!$isValid) {
+ libxml_disable_entity_loader($disableEntities);
+
+ return self::getXmlErrors($internalErrors);
+ }
+
+ libxml_disable_entity_loader($disableEntities);
+
+ $dom->normalizeDocument();
+
+ libxml_clear_errors();
+ libxml_use_internal_errors($internalErrors);
+
+ return [];
+ }
+
+ public static function getErrorsAsString(array $xmlErrors): string
+ {
+ $errorsAsString = '';
+
+ foreach ($xmlErrors as $error) {
+ $errorsAsString .= sprintf("[%s %s] %s (in %s - line %d, column %d)\n",
+ LIBXML_ERR_WARNING === $error['level'] ? 'WARNING' : 'ERROR',
+ $error['code'],
+ $error['message'],
+ $error['file'],
+ $error['line'],
+ $error['column']
+ );
+ }
+
+ return $errorsAsString;
+ }
+
+ private static function getSchema(string $xliffVersion): string
+ {
+ if ('1.2' === $xliffVersion) {
+ $schemaSource = file_get_contents(__DIR__.'/../Resources/schemas/xliff-core-1.2-strict.xsd');
+ $xmlUri = 'http://www.w3.org/2001/xml.xsd';
+ } elseif ('2.0' === $xliffVersion) {
+ $schemaSource = file_get_contents(__DIR__.'/../Resources/schemas/xliff-core-2.0.xsd');
+ $xmlUri = 'informativeCopiesOf3rdPartySchemas/w3c/xml.xsd';
+ } else {
+ throw new InvalidArgumentException(sprintf('No support implemented for loading XLIFF version "%s".', $xliffVersion));
+ }
+
+ return self::fixXmlLocation($schemaSource, $xmlUri);
+ }
+
+ /**
+ * Internally changes the URI of a dependent xsd to be loaded locally.
+ */
+ private static function fixXmlLocation(string $schemaSource, string $xmlUri): string
+ {
+ $newPath = str_replace('\\', '/', __DIR__).'/../Resources/schemas/xml.xsd';
+ $parts = explode('/', $newPath);
+ $locationstart = 'file:///';
+ if (0 === stripos($newPath, 'phar://')) {
+ $tmpfile = tempnam(sys_get_temp_dir(), 'symfony');
+ if ($tmpfile) {
+ copy($newPath, $tmpfile);
+ $parts = explode('/', str_replace('\\', '/', $tmpfile));
+ } else {
+ array_shift($parts);
+ $locationstart = 'phar:///';
+ }
+ }
+
+ $drive = '\\' === \DIRECTORY_SEPARATOR ? array_shift($parts).'/' : '';
+ $newPath = $locationstart.$drive.implode('/', array_map('rawurlencode', $parts));
+
+ return str_replace($xmlUri, $newPath, $schemaSource);
+ }
+
+ /**
+ * Returns the XML errors of the internal XML parser.
+ */
+ private static function getXmlErrors(bool $internalErrors): array
+ {
+ $errors = [];
+ foreach (libxml_get_errors() as $error) {
+ $errors[] = [
+ 'level' => LIBXML_ERR_WARNING == $error->level ? 'WARNING' : 'ERROR',
+ 'code' => $error->code,
+ 'message' => trim($error->message),
+ 'file' => $error->file ?: 'n/a',
+ 'line' => $error->line,
+ 'column' => $error->column,
+ ];
+ }
+
+ libxml_clear_errors();
+ libxml_use_internal_errors($internalErrors);
+
+ return $errors;
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Writer/TranslationWriter.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Writer/TranslationWriter.php
new file mode 100644
index 0000000..a981b8d
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Writer/TranslationWriter.php
@@ -0,0 +1,88 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Writer;
+
+use Symfony\Component\Translation\Dumper\DumperInterface;
+use Symfony\Component\Translation\Exception\InvalidArgumentException;
+use Symfony\Component\Translation\Exception\RuntimeException;
+use Symfony\Component\Translation\MessageCatalogue;
+
+/**
+ * TranslationWriter writes translation messages.
+ *
+ * @author Michel Salib
+ */
+class TranslationWriter implements TranslationWriterInterface
+{
+ private $dumpers = [];
+
+ /**
+ * Adds a dumper to the writer.
+ *
+ * @param string $format The format of the dumper
+ */
+ public function addDumper($format, DumperInterface $dumper)
+ {
+ $this->dumpers[$format] = $dumper;
+ }
+
+ /**
+ * Disables dumper backup.
+ *
+ * @deprecated since Symfony 4.1
+ */
+ public function disableBackup()
+ {
+ @trigger_error(sprintf('The "%s()" method is deprecated since Symfony 4.1.', __METHOD__), E_USER_DEPRECATED);
+
+ foreach ($this->dumpers as $dumper) {
+ if (method_exists($dumper, 'setBackup')) {
+ $dumper->setBackup(false);
+ }
+ }
+ }
+
+ /**
+ * Obtains the list of supported formats.
+ *
+ * @return array
+ */
+ public function getFormats()
+ {
+ return array_keys($this->dumpers);
+ }
+
+ /**
+ * Writes translation from the catalogue according to the selected format.
+ *
+ * @param string $format The format to use to dump the messages
+ * @param array $options Options that are passed to the dumper
+ *
+ * @throws InvalidArgumentException
+ */
+ public function write(MessageCatalogue $catalogue, $format, $options = [])
+ {
+ if (!isset($this->dumpers[$format])) {
+ throw new InvalidArgumentException(sprintf('There is no dumper associated with format "%s".', $format));
+ }
+
+ // get the right dumper
+ $dumper = $this->dumpers[$format];
+
+ if (isset($options['path']) && !is_dir($options['path']) && !@mkdir($options['path'], 0777, true) && !is_dir($options['path'])) {
+ throw new RuntimeException(sprintf('Translation Writer was not able to create directory "%s".', $options['path']));
+ }
+
+ // save
+ $dumper->dump($catalogue, $options);
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/Writer/TranslationWriterInterface.php b/plugins/vdomah/jwtauth/vendor/symfony/translation/Writer/TranslationWriterInterface.php
new file mode 100644
index 0000000..f7c56be
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/Writer/TranslationWriterInterface.php
@@ -0,0 +1,33 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Writer;
+
+use Symfony\Component\Translation\Exception\InvalidArgumentException;
+use Symfony\Component\Translation\MessageCatalogue;
+
+/**
+ * TranslationWriter writes translation messages.
+ *
+ * @author Michel Salib
+ */
+interface TranslationWriterInterface
+{
+ /**
+ * Writes translation from the catalogue according to the selected format.
+ *
+ * @param string $format The format to use to dump the messages
+ * @param array $options Options that are passed to the dumper
+ *
+ * @throws InvalidArgumentException
+ */
+ public function write(MessageCatalogue $catalogue, $format, $options = []);
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/composer.json b/plugins/vdomah/jwtauth/vendor/symfony/translation/composer.json
new file mode 100644
index 0000000..5b01b6d
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/composer.json
@@ -0,0 +1,60 @@
+{
+ "name": "symfony/translation",
+ "type": "library",
+ "description": "Symfony Translation Component",
+ "keywords": [],
+ "homepage": "https://symfony.com",
+ "license": "MIT",
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "require": {
+ "php": "^7.1.3",
+ "symfony/polyfill-mbstring": "~1.0",
+ "symfony/translation-contracts": "^1.1.6|^2"
+ },
+ "require-dev": {
+ "symfony/config": "^3.4|^4.0|^5.0",
+ "symfony/console": "^3.4|^4.0|^5.0",
+ "symfony/dependency-injection": "^3.4|^4.0|^5.0",
+ "symfony/http-kernel": "^4.4",
+ "symfony/intl": "^3.4|^4.0|^5.0",
+ "symfony/service-contracts": "^1.1.2|^2",
+ "symfony/yaml": "^3.4|^4.0|^5.0",
+ "symfony/finder": "~2.8|~3.0|~4.0|^5.0",
+ "psr/log": "~1.0"
+ },
+ "conflict": {
+ "symfony/config": "<3.4",
+ "symfony/dependency-injection": "<3.4",
+ "symfony/http-kernel": "<4.4",
+ "symfony/yaml": "<3.4"
+ },
+ "provide": {
+ "symfony/translation-implementation": "1.0"
+ },
+ "suggest": {
+ "symfony/config": "",
+ "symfony/yaml": "",
+ "psr/log-implementation": "To use logging capability in translator"
+ },
+ "autoload": {
+ "psr-4": { "Symfony\\Component\\Translation\\": "" },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "minimum-stability": "dev",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.4-dev"
+ }
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/symfony/translation/phpunit.xml.dist b/plugins/vdomah/jwtauth/vendor/symfony/translation/phpunit.xml.dist
new file mode 100644
index 0000000..21d3246
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/symfony/translation/phpunit.xml.dist
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+ ./Tests/
+
+
+
+
+
+ ./
+
+ ./Tests
+ ./vendor
+
+
+
+
diff --git a/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/LICENSE b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/LICENSE
new file mode 100644
index 0000000..72a2739
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2014 Sean Tymon
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/README.md b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/README.md
new file mode 100644
index 0000000..dcf76e0
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/README.md
@@ -0,0 +1,40 @@
+# jwt-auth
+
+> JSON Web Token Authentication for Laravel
+
+[](https://travis-ci.org/tymondesigns/jwt-auth)
+[](https://scrutinizer-ci.com/g/tymondesigns/jwt-auth/)
+[](https://scrutinizer-ci.com/g/tymondesigns/jwt-auth/code-structure)
+[](https://styleci.io/repos/23680678)
+[](http://hhvm.h4cc.de/package/tymon/jwt-auth)
+[](https://packagist.org/packages/tymon/jwt-auth)
+[](https://packagist.org/packages/tymon/jwt-auth#dev-develop)
+[](https://packagist.org/packages/tymon/jwt-auth)
+
+See the [WIKI](https://github.com/tymondesigns/jwt-auth/wiki) for documentation
+
+## License
+
+The MIT License (MIT)
+
+Copyright (c) 2014 Sean Tymon
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+[](https://gratipay.com/~tymondesigns)
diff --git a/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/composer.json b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/composer.json
new file mode 100644
index 0000000..1faf3a6
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/composer.json
@@ -0,0 +1,51 @@
+{
+ "name": "tymon/jwt-auth",
+ "description": "JSON Web Token Authentication for Laravel 4 and 5",
+ "keywords": [
+ "jwt",
+ "auth",
+ "authentication",
+ "tymon",
+ "laravel",
+ "json web token"
+ ],
+ "homepage": "https://github.com/tymondesigns/jwt-auth",
+ "license": "MIT",
+ "authors": [
+ {
+ "name": "Sean Tymon",
+ "email": "tymon148@gmail.com",
+ "homepage": "http://tymondesigns.com",
+ "role": "Developer"
+ }
+ ],
+ "require": {
+ "php": ">=5.4.0",
+ "illuminate/support": "~5.0",
+ "illuminate/http": "~5.0",
+ "namshi/jose": "^5.0 || ^7.0",
+ "nesbot/carbon": "~1.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "4.*",
+ "mockery/mockery": "0.9.*",
+ "illuminate/auth": "~5.0",
+ "illuminate/database": "~5.0",
+ "illuminate/console" : "~5.0"
+ },
+ "autoload": {
+ "psr-4": {
+ "Tymon\\JWTAuth\\": "src"
+ }
+ },
+ "autoload-dev": {
+ "psr-4": {
+ "Tymon\\JWTAuth\\Test\\": "tests"
+ }
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-develop": "0.5-dev"
+ }
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/phpunit.xml.dist b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/phpunit.xml.dist
new file mode 100644
index 0000000..7836abe
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/phpunit.xml.dist
@@ -0,0 +1,34 @@
+
+
+
+
+ tests
+
+
+
+
+ src/
+
+ src/Providers/JWTAuthServiceProvider.php
+ src/config/
+ src/Facades/
+
+
+
+
+
+
+
+
+
+
+
diff --git a/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Blacklist.php b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Blacklist.php
new file mode 100644
index 0000000..f562b2a
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Blacklist.php
@@ -0,0 +1,113 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Tymon\JWTAuth;
+
+use Tymon\JWTAuth\Providers\Storage\StorageInterface;
+
+class Blacklist
+{
+ /**
+ * @var \Tymon\JWTAuth\Providers\Storage\StorageInterface
+ */
+ protected $storage;
+
+ /**
+ * Number of minutes from issue date in which a JWT can be refreshed.
+ *
+ * @var int
+ */
+ protected $refreshTTL = 20160;
+
+ /**
+ * @param \Tymon\JWTAuth\Providers\Storage\StorageInterface $storage
+ */
+ public function __construct(StorageInterface $storage)
+ {
+ $this->storage = $storage;
+ }
+
+ /**
+ * Add the token (jti claim) to the blacklist.
+ *
+ * @param \Tymon\JWTAuth\Payload $payload
+ * @return bool
+ */
+ public function add(Payload $payload)
+ {
+ $exp = Utils::timestamp($payload['exp']);
+ $refreshExp = Utils::timestamp($payload['iat'])->addMinutes($this->refreshTTL);
+
+ // there is no need to add the token to the blacklist
+ // if the token has already expired AND the refresh_ttl
+ // has gone by
+ if ($exp->isPast() && $refreshExp->isPast()) {
+ return false;
+ }
+
+ // Set the cache entry's lifetime to be equal to the amount
+ // of refreshable time it has remaining (which is the larger
+ // of `exp` and `iat+refresh_ttl`), rounded up a minute
+ $cacheLifetime = $exp->max($refreshExp)->addMinute()->diffInMinutes();
+
+ $this->storage->add($payload['jti'], [], $cacheLifetime);
+
+ return true;
+ }
+
+ /**
+ * Determine whether the token has been blacklisted.
+ *
+ * @param \Tymon\JWTAuth\Payload $payload
+ * @return bool
+ */
+ public function has(Payload $payload)
+ {
+ return $this->storage->has($payload['jti']);
+ }
+
+ /**
+ * Remove the token (jti claim) from the blacklist.
+ *
+ * @param \Tymon\JWTAuth\Payload $payload
+ * @return bool
+ */
+ public function remove(Payload $payload)
+ {
+ return $this->storage->destroy($payload['jti']);
+ }
+
+ /**
+ * Remove all tokens from the blacklist.
+ *
+ * @return bool
+ */
+ public function clear()
+ {
+ $this->storage->flush();
+
+ return true;
+ }
+
+ /**
+ * Set the refresh time limit.
+ *
+ * @param int
+ *
+ * @return $this
+ */
+ public function setRefreshTTL($ttl)
+ {
+ $this->refreshTTL = (int) $ttl;
+
+ return $this;
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Claims/Audience.php b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Claims/Audience.php
new file mode 100644
index 0000000..5a1854a
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Claims/Audience.php
@@ -0,0 +1,22 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Tymon\JWTAuth\Claims;
+
+class Audience extends Claim
+{
+ /**
+ * The claim name.
+ *
+ * @var string
+ */
+ protected $name = 'aud';
+}
diff --git a/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Claims/Claim.php b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Claims/Claim.php
new file mode 100644
index 0000000..1067d2a
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Claims/Claim.php
@@ -0,0 +1,121 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Tymon\JWTAuth\Claims;
+
+use Tymon\JWTAuth\Exceptions\InvalidClaimException;
+
+abstract class Claim implements ClaimInterface
+{
+ /**
+ * The claim name.
+ *
+ * @var string
+ */
+ protected $name;
+
+ /**
+ * The claim value.
+ *
+ * @var mixed
+ */
+ private $value;
+
+ /**
+ * @param mixed $value
+ */
+ public function __construct($value)
+ {
+ $this->setValue($value);
+ }
+
+ /**
+ * Set the claim value, and call a validate method if available.
+ *
+ * @param $value
+ * @throws \Tymon\JWTAuth\Exceptions\InvalidClaimException
+ * @return $this
+ */
+ public function setValue($value)
+ {
+ if (! $this->validate($value)) {
+ throw new InvalidClaimException('Invalid value provided for claim "'.$this->getName().'": '.$value);
+ }
+
+ $this->value = $value;
+
+ return $this;
+ }
+
+ /**
+ * Get the claim value.
+ *
+ * @return mixed
+ */
+ public function getValue()
+ {
+ return $this->value;
+ }
+
+ /**
+ * Set the claim name.
+ *
+ * @param string $name
+ * @return $this
+ */
+ public function setName($name)
+ {
+ $this->name = $name;
+
+ return $this;
+ }
+
+ /**
+ * Get the claim name.
+ *
+ * @return string
+ */
+ public function getName()
+ {
+ return $this->name;
+ }
+
+ /**
+ * Validate the Claim value.
+ *
+ * @param $value
+ * @return bool
+ */
+ protected function validate($value)
+ {
+ return true;
+ }
+
+ /**
+ * Build a key value array comprising of the claim name and value.
+ *
+ * @return array
+ */
+ public function toArray()
+ {
+ return [$this->getName() => $this->getValue()];
+ }
+
+ /**
+ * Get the claim as a string.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return json_encode($this->toArray(), JSON_UNESCAPED_SLASHES);
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Claims/ClaimInterface.php b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Claims/ClaimInterface.php
new file mode 100644
index 0000000..8768c71
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Claims/ClaimInterface.php
@@ -0,0 +1,45 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Tymon\JWTAuth\Claims;
+
+interface ClaimInterface
+{
+ /**
+ * Set the claim value, and call a validate method if available.
+ *
+ * @param mixed
+ * @return Claim
+ */
+ public function setValue($value);
+
+ /**
+ * Get the claim value.
+ *
+ * @return mixed
+ */
+ public function getValue();
+
+ /**
+ * Set the claim name.
+ *
+ * @param string $name
+ * @return Claim
+ */
+ public function setName($name);
+
+ /**
+ * Get the claim name.
+ *
+ * @return string
+ */
+ public function getName();
+}
diff --git a/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Claims/Custom.php b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Claims/Custom.php
new file mode 100644
index 0000000..b9a8f23
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Claims/Custom.php
@@ -0,0 +1,25 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Tymon\JWTAuth\Claims;
+
+class Custom extends Claim
+{
+ /**
+ * @param string $name
+ * @param mixed $value
+ */
+ public function __construct($name, $value)
+ {
+ parent::__construct($value);
+ $this->setName($name);
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Claims/Expiration.php b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Claims/Expiration.php
new file mode 100644
index 0000000..48f5171
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Claims/Expiration.php
@@ -0,0 +1,33 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Tymon\JWTAuth\Claims;
+
+class Expiration extends Claim
+{
+ /**
+ * The claim name.
+ *
+ * @var string
+ */
+ protected $name = 'exp';
+
+ /**
+ * Validate the expiry claim.
+ *
+ * @param mixed $value
+ * @return bool
+ */
+ protected function validate($value)
+ {
+ return is_numeric($value);
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Claims/Factory.php b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Claims/Factory.php
new file mode 100644
index 0000000..696e30b
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Claims/Factory.php
@@ -0,0 +1,55 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Tymon\JWTAuth\Claims;
+
+class Factory
+{
+ /**
+ * @var array
+ */
+ private static $classMap = [
+ 'aud' => 'Tymon\JWTAuth\Claims\Audience',
+ 'exp' => 'Tymon\JWTAuth\Claims\Expiration',
+ 'iat' => 'Tymon\JWTAuth\Claims\IssuedAt',
+ 'iss' => 'Tymon\JWTAuth\Claims\Issuer',
+ 'jti' => 'Tymon\JWTAuth\Claims\JwtId',
+ 'nbf' => 'Tymon\JWTAuth\Claims\NotBefore',
+ 'sub' => 'Tymon\JWTAuth\Claims\Subject',
+ ];
+
+ /**
+ * Get the instance of the claim when passing the name and value.
+ *
+ * @param string $name
+ * @param mixed $value
+ * @return \Tymon\JWTAuth\Claims\Claim
+ */
+ public function get($name, $value)
+ {
+ if ($this->has($name)) {
+ return new self::$classMap[$name]($value);
+ }
+
+ return new Custom($name, $value);
+ }
+
+ /**
+ * Check whether the claim exists.
+ *
+ * @param string $name
+ * @return bool
+ */
+ public function has($name)
+ {
+ return array_key_exists($name, self::$classMap);
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Claims/IssuedAt.php b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Claims/IssuedAt.php
new file mode 100644
index 0000000..89bea75
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Claims/IssuedAt.php
@@ -0,0 +1,33 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Tymon\JWTAuth\Claims;
+
+class IssuedAt extends Claim
+{
+ /**
+ * The claim name.
+ *
+ * @var string
+ */
+ protected $name = 'iat';
+
+ /**
+ * Validate the issued at claim.
+ *
+ * @param mixed $value
+ * @return bool
+ */
+ protected function validate($value)
+ {
+ return is_numeric($value);
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Claims/Issuer.php b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Claims/Issuer.php
new file mode 100644
index 0000000..c20ba82
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Claims/Issuer.php
@@ -0,0 +1,22 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Tymon\JWTAuth\Claims;
+
+class Issuer extends Claim
+{
+ /**
+ * The claim name.
+ *
+ * @var string
+ */
+ protected $name = 'iss';
+}
diff --git a/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Claims/JwtId.php b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Claims/JwtId.php
new file mode 100644
index 0000000..15a3287
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Claims/JwtId.php
@@ -0,0 +1,22 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Tymon\JWTAuth\Claims;
+
+class JwtId extends Claim
+{
+ /**
+ * The claim name.
+ *
+ * @var string
+ */
+ protected $name = 'jti';
+}
diff --git a/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Claims/NotBefore.php b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Claims/NotBefore.php
new file mode 100644
index 0000000..ee15a53
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Claims/NotBefore.php
@@ -0,0 +1,33 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Tymon\JWTAuth\Claims;
+
+class NotBefore extends Claim
+{
+ /**
+ * The claim name.
+ *
+ * @var string
+ */
+ protected $name = 'nbf';
+
+ /**
+ * Validate the not before claim.
+ *
+ * @param mixed $value
+ * @return bool
+ */
+ protected function validate($value)
+ {
+ return is_numeric($value);
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Claims/Subject.php b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Claims/Subject.php
new file mode 100644
index 0000000..71b0514
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Claims/Subject.php
@@ -0,0 +1,22 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Tymon\JWTAuth\Claims;
+
+class Subject extends Claim
+{
+ /**
+ * The claim name.
+ *
+ * @var string
+ */
+ protected $name = 'sub';
+}
diff --git a/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Commands/JWTGenerateCommand.php b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Commands/JWTGenerateCommand.php
new file mode 100644
index 0000000..da20e54
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Commands/JWTGenerateCommand.php
@@ -0,0 +1,81 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Tymon\JWTAuth\Commands;
+
+use Illuminate\Support\Str;
+use Illuminate\Console\Command;
+use Symfony\Component\Console\Input\InputOption;
+
+class JWTGenerateCommand extends Command
+{
+ /**
+ * The console command name.
+ *
+ * @var string
+ */
+ protected $name = 'jwt:generate';
+
+ /**
+ * The console command description.
+ *
+ * @var string
+ */
+ protected $description = 'Set the JWTAuth secret key used to sign the tokens';
+
+ /**
+ * Execute the console command.
+ *
+ * @return void
+ */
+ public function handle()
+ {
+ $key = $this->getRandomKey();
+
+ if ($this->option('show')) {
+ return $this->line(''.$key.' ');
+ }
+
+ $path = config_path('jwt.php');
+
+ if (file_exists($path)) {
+ file_put_contents($path, str_replace(
+ $this->laravel['config']['jwt.secret'], $key, file_get_contents($path)
+ ));
+ }
+
+ $this->laravel['config']['jwt.secret'] = $key;
+
+ $this->info("jwt-auth secret [$key] set successfully.");
+ }
+
+ /**
+ * Generate a random key for the JWT Auth secret.
+ *
+ * @return string
+ */
+ protected function getRandomKey()
+ {
+ return Str::random(32);
+ }
+
+ /**
+ * Get the console command options.
+ *
+ * @return array
+ */
+ protected function getOptions()
+ {
+ return [
+ ['show', null, InputOption::VALUE_NONE, 'Simply display the key instead of modifying files.'],
+ ];
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Exceptions/InvalidClaimException.php b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Exceptions/InvalidClaimException.php
new file mode 100644
index 0000000..b164672
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Exceptions/InvalidClaimException.php
@@ -0,0 +1,20 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Tymon\JWTAuth\Exceptions;
+
+class InvalidClaimException extends JWTException
+{
+ /**
+ * @var int
+ */
+ protected $statusCode = 400;
+}
diff --git a/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Exceptions/JWTException.php b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Exceptions/JWTException.php
new file mode 100644
index 0000000..5473f04
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Exceptions/JWTException.php
@@ -0,0 +1,49 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Tymon\JWTAuth\Exceptions;
+
+class JWTException extends \Exception
+{
+ /**
+ * @var int
+ */
+ protected $statusCode = 500;
+
+ /**
+ * @param string $message
+ * @param int $statusCode
+ */
+ public function __construct($message = 'An error occurred', $statusCode = null)
+ {
+ parent::__construct($message);
+
+ if (! is_null($statusCode)) {
+ $this->setStatusCode($statusCode);
+ }
+ }
+
+ /**
+ * @param int $statusCode
+ */
+ public function setStatusCode($statusCode)
+ {
+ $this->statusCode = $statusCode;
+ }
+
+ /**
+ * @return int the status code
+ */
+ public function getStatusCode()
+ {
+ return $this->statusCode;
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Exceptions/PayloadException.php b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Exceptions/PayloadException.php
new file mode 100644
index 0000000..4767abd
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Exceptions/PayloadException.php
@@ -0,0 +1,20 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Tymon\JWTAuth\Exceptions;
+
+class PayloadException extends JWTException
+{
+ /**
+ * @var int
+ */
+ protected $statusCode = 500;
+}
diff --git a/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Exceptions/TokenBlacklistedException.php b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Exceptions/TokenBlacklistedException.php
new file mode 100644
index 0000000..58bd582
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Exceptions/TokenBlacklistedException.php
@@ -0,0 +1,20 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Tymon\JWTAuth\Exceptions;
+
+class TokenBlacklistedException extends TokenInvalidException
+{
+ /**
+ * @var int
+ */
+ protected $statusCode = 401;
+}
diff --git a/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Exceptions/TokenExpiredException.php b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Exceptions/TokenExpiredException.php
new file mode 100644
index 0000000..d613577
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Exceptions/TokenExpiredException.php
@@ -0,0 +1,20 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Tymon\JWTAuth\Exceptions;
+
+class TokenExpiredException extends JWTException
+{
+ /**
+ * @var int
+ */
+ protected $statusCode = 401;
+}
diff --git a/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Exceptions/TokenInvalidException.php b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Exceptions/TokenInvalidException.php
new file mode 100644
index 0000000..6740d59
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Exceptions/TokenInvalidException.php
@@ -0,0 +1,20 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Tymon\JWTAuth\Exceptions;
+
+class TokenInvalidException extends JWTException
+{
+ /**
+ * @var int
+ */
+ protected $statusCode = 400;
+}
diff --git a/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Facades/JWTAuth.php b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Facades/JWTAuth.php
new file mode 100644
index 0000000..419b590
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Facades/JWTAuth.php
@@ -0,0 +1,27 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Tymon\JWTAuth\Facades;
+
+use Illuminate\Support\Facades\Facade;
+
+class JWTAuth extends Facade
+{
+ /**
+ * Get the registered name of the component.
+ *
+ * @return string
+ */
+ protected static function getFacadeAccessor()
+ {
+ return 'tymon.jwt.auth';
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Facades/JWTFactory.php b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Facades/JWTFactory.php
new file mode 100644
index 0000000..f43ff46
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Facades/JWTFactory.php
@@ -0,0 +1,27 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Tymon\JWTAuth\Facades;
+
+use Illuminate\Support\Facades\Facade;
+
+class JWTFactory extends Facade
+{
+ /**
+ * Get the registered name of the component.
+ *
+ * @return string
+ */
+ protected static function getFacadeAccessor()
+ {
+ return 'tymon.jwt.payload.factory';
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/JWTAuth.php b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/JWTAuth.php
new file mode 100644
index 0000000..9e8b627
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/JWTAuth.php
@@ -0,0 +1,343 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Tymon\JWTAuth;
+
+use Illuminate\Http\Request;
+use Tymon\JWTAuth\Exceptions\JWTException;
+use Tymon\JWTAuth\Providers\Auth\AuthInterface;
+use Tymon\JWTAuth\Providers\User\UserInterface;
+
+class JWTAuth
+{
+ /**
+ * @var \Tymon\JWTAuth\JWTManager
+ */
+ protected $manager;
+
+ /**
+ * @var \Tymon\JWTAuth\Providers\User\UserInterface
+ */
+ protected $user;
+
+ /**
+ * @var \Tymon\JWTAuth\Providers\Auth\AuthInterface
+ */
+ protected $auth;
+
+ /**
+ * @var \Illuminate\Http\Request
+ */
+ protected $request;
+
+ /**
+ * @var string
+ */
+ protected $identifier = 'id';
+
+ /**
+ * @var \Tymon\JWTAuth\Token
+ */
+ protected $token;
+
+ /**
+ * @param \Tymon\JWTAuth\JWTManager $manager
+ * @param \Tymon\JWTAuth\Providers\User\UserInterface $user
+ * @param \Tymon\JWTAuth\Providers\Auth\AuthInterface $auth
+ * @param \Illuminate\Http\Request $request
+ */
+ public function __construct(JWTManager $manager, UserInterface $user, AuthInterface $auth, Request $request)
+ {
+ $this->manager = $manager;
+ $this->user = $user;
+ $this->auth = $auth;
+ $this->request = $request;
+ }
+
+ /**
+ * Find a user using the user identifier in the subject claim.
+ *
+ * @param bool|string $token
+ *
+ * @return mixed
+ */
+ public function toUser($token = false)
+ {
+ $payload = $this->getPayload($token);
+
+ if (! $user = $this->user->getBy($this->identifier, $payload['sub'])) {
+ return false;
+ }
+
+ return $user;
+ }
+
+ /**
+ * Generate a token using the user identifier as the subject claim.
+ *
+ * @param mixed $user
+ * @param array $customClaims
+ *
+ * @return string
+ */
+ public function fromUser($user, array $customClaims = [])
+ {
+ $payload = $this->makePayload($user->{$this->identifier}, $customClaims);
+
+ return $this->manager->encode($payload)->get();
+ }
+
+ /**
+ * Attempt to authenticate the user and return the token.
+ *
+ * @param array $credentials
+ * @param array $customClaims
+ *
+ * @return false|string
+ */
+ public function attempt(array $credentials = [], array $customClaims = [])
+ {
+ if (! $this->auth->byCredentials($credentials)) {
+ return false;
+ }
+
+ return $this->fromUser($this->auth->user(), $customClaims);
+ }
+
+ /**
+ * Authenticate a user via a token.
+ *
+ * @param mixed $token
+ *
+ * @return mixed
+ */
+ public function authenticate($token = false)
+ {
+ $id = $this->getPayload($token)->get('sub');
+
+ if (! $this->auth->byId($id)) {
+ return false;
+ }
+
+ return $this->auth->user();
+ }
+
+ /**
+ * Refresh an expired token.
+ *
+ * @param mixed $token
+ *
+ * @return string
+ */
+ public function refresh($token = false)
+ {
+ $this->requireToken($token);
+
+ return $this->manager->refresh($this->token)->get();
+ }
+
+ /**
+ * Invalidate a token (add it to the blacklist).
+ *
+ * @param mixed $token
+ *
+ * @return bool
+ */
+ public function invalidate($token = false)
+ {
+ $this->requireToken($token);
+
+ return $this->manager->invalidate($this->token);
+ }
+
+ /**
+ * Get the token.
+ *
+ * @return bool|string
+ */
+ public function getToken()
+ {
+ if (! $this->token) {
+ try {
+ $this->parseToken();
+ } catch (JWTException $e) {
+ return false;
+ }
+ }
+
+ return $this->token;
+ }
+
+ /**
+ * Get the raw Payload instance.
+ *
+ * @param mixed $token
+ *
+ * @return \Tymon\JWTAuth\Payload
+ */
+ public function getPayload($token = false)
+ {
+ $this->requireToken($token);
+
+ return $this->manager->decode($this->token);
+ }
+
+ /**
+ * Parse the token from the request.
+ *
+ * @param string $query
+ *
+ * @return JWTAuth
+ */
+ public function parseToken($method = 'bearer', $header = 'authorization', $query = 'token')
+ {
+ if (! $token = $this->parseAuthHeader($header, $method)) {
+ if (! $token = $this->request->query($query, false)) {
+ throw new JWTException('The token could not be parsed from the request', 400);
+ }
+ }
+
+ return $this->setToken($token);
+ }
+
+ /**
+ * Parse token from the authorization header.
+ *
+ * @param string $header
+ * @param string $method
+ *
+ * @return false|string
+ */
+ protected function parseAuthHeader($header = 'authorization', $method = 'bearer')
+ {
+ $header = $this->request->headers->get($header);
+
+ if (! starts_with(strtolower($header), $method)) {
+ return false;
+ }
+
+ return trim(str_ireplace($method, '', $header));
+ }
+
+ /**
+ * Create a Payload instance.
+ *
+ * @param mixed $subject
+ * @param array $customClaims
+ *
+ * @return \Tymon\JWTAuth\Payload
+ */
+ protected function makePayload($subject, array $customClaims = [])
+ {
+ return $this->manager->getPayloadFactory()->make(
+ array_merge($customClaims, ['sub' => $subject])
+ );
+ }
+
+ /**
+ * Set the identifier.
+ *
+ * @param string $identifier
+ *
+ * @return $this
+ */
+ public function setIdentifier($identifier)
+ {
+ $this->identifier = $identifier;
+
+ return $this;
+ }
+
+ /**
+ * Get the identifier.
+ *
+ * @return string
+ */
+ public function getIdentifier()
+ {
+ return $this->identifier;
+ }
+
+ /**
+ * Set the token.
+ *
+ * @param string $token
+ *
+ * @return $this
+ */
+ public function setToken($token)
+ {
+ $this->token = new Token($token);
+
+ return $this;
+ }
+
+ /**
+ * Ensure that a token is available.
+ *
+ * @param mixed $token
+ *
+ * @return JWTAuth
+ *
+ * @throws \Tymon\JWTAuth\Exceptions\JWTException
+ */
+ protected function requireToken($token)
+ {
+ if ($token) {
+ return $this->setToken($token);
+ } elseif ($this->token) {
+ return $this;
+ } else {
+ throw new JWTException('A token is required', 400);
+ }
+ }
+
+ /**
+ * Set the request instance.
+ *
+ * @param Request $request
+ */
+ public function setRequest(Request $request)
+ {
+ $this->request = $request;
+
+ return $this;
+ }
+
+ /**
+ * Get the JWTManager instance.
+ *
+ * @return \Tymon\JWTAuth\JWTManager
+ */
+ public function manager()
+ {
+ return $this->manager;
+ }
+
+ /**
+ * Magically call the JWT Manager.
+ *
+ * @param string $method
+ * @param array $parameters
+ *
+ * @return mixed
+ *
+ * @throws \BadMethodCallException
+ */
+ public function __call($method, $parameters)
+ {
+ if (method_exists($this->manager, $method)) {
+ return call_user_func_array([$this->manager, $method], $parameters);
+ }
+
+ throw new \BadMethodCallException("Method [$method] does not exist.");
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/JWTManager.php b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/JWTManager.php
new file mode 100644
index 0000000..603e705
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/JWTManager.php
@@ -0,0 +1,183 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Tymon\JWTAuth;
+
+use Tymon\JWTAuth\Exceptions\JWTException;
+use Tymon\JWTAuth\Providers\JWT\JWTInterface;
+use Tymon\JWTAuth\Exceptions\TokenBlacklistedException;
+
+class JWTManager
+{
+ /**
+ * @var \Tymon\JWTAuth\Providers\JWT\JWTInterface
+ */
+ protected $jwt;
+
+ /**
+ * @var \Tymon\JWTAuth\Blacklist
+ */
+ protected $blacklist;
+
+ /**
+ * @var \Tymon\JWTAuth\PayloadFactory
+ */
+ protected $payloadFactory;
+
+ /**
+ * @var bool
+ */
+ protected $blacklistEnabled = true;
+
+ /**
+ * @var bool
+ */
+ protected $refreshFlow = false;
+
+ /**
+ * @param \Tymon\JWTAuth\Providers\JWT\JWTInterface $jwt
+ * @param \Tymon\JWTAuth\Blacklist $blacklist
+ * @param \Tymon\JWTAuth\PayloadFactory $payloadFactory
+ */
+ public function __construct(JWTInterface $jwt, Blacklist $blacklist, PayloadFactory $payloadFactory)
+ {
+ $this->jwt = $jwt;
+ $this->blacklist = $blacklist;
+ $this->payloadFactory = $payloadFactory;
+ }
+
+ /**
+ * Encode a Payload and return the Token.
+ *
+ * @param \Tymon\JWTAuth\Payload $payload
+ * @return \Tymon\JWTAuth\Token
+ */
+ public function encode(Payload $payload)
+ {
+ $token = $this->jwt->encode($payload->get());
+
+ return new Token($token);
+ }
+
+ /**
+ * Decode a Token and return the Payload.
+ *
+ * @param \Tymon\JWTAuth\Token $token
+ * @return Payload
+ * @throws TokenBlacklistedException
+ */
+ public function decode(Token $token)
+ {
+ $payloadArray = $this->jwt->decode($token->get());
+
+ $payload = $this->payloadFactory->setRefreshFlow($this->refreshFlow)->make($payloadArray);
+
+ if ($this->blacklistEnabled && $this->blacklist->has($payload)) {
+ throw new TokenBlacklistedException('The token has been blacklisted');
+ }
+
+ return $payload;
+ }
+
+ /**
+ * Refresh a Token and return a new Token.
+ *
+ * @param \Tymon\JWTAuth\Token $token
+ * @return \Tymon\JWTAuth\Token
+ */
+ public function refresh(Token $token)
+ {
+ $payload = $this->setRefreshFlow()->decode($token);
+
+ if ($this->blacklistEnabled) {
+ // invalidate old token
+ $this->blacklist->add($payload);
+ }
+
+ // return the new token
+ return $this->encode(
+ $this->payloadFactory->make([
+ 'sub' => $payload['sub'],
+ 'iat' => $payload['iat'],
+ ])
+ );
+ }
+
+ /**
+ * Invalidate a Token by adding it to the blacklist.
+ *
+ * @param Token $token
+ * @return bool
+ */
+ public function invalidate(Token $token)
+ {
+ if (! $this->blacklistEnabled) {
+ throw new JWTException('You must have the blacklist enabled to invalidate a token.');
+ }
+
+ return $this->blacklist->add($this->decode($token));
+ }
+
+ /**
+ * Get the PayloadFactory instance.
+ *
+ * @return \Tymon\JWTAuth\PayloadFactory
+ */
+ public function getPayloadFactory()
+ {
+ return $this->payloadFactory;
+ }
+
+ /**
+ * Get the JWTProvider instance.
+ *
+ * @return \Tymon\JWTAuth\Providers\JWT\JWTInterface
+ */
+ public function getJWTProvider()
+ {
+ return $this->jwt;
+ }
+
+ /**
+ * Get the Blacklist instance.
+ *
+ * @return \Tymon\JWTAuth\Blacklist
+ */
+ public function getBlacklist()
+ {
+ return $this->blacklist;
+ }
+
+ /**
+ * Set whether the blacklist is enabled.
+ *
+ * @param bool $enabled
+ */
+ public function setBlacklistEnabled($enabled)
+ {
+ $this->blacklistEnabled = $enabled;
+
+ return $this;
+ }
+
+ /**
+ * Set the refresh flow.
+ *
+ * @param bool $refreshFlow
+ * @return $this
+ */
+ public function setRefreshFlow($refreshFlow = true)
+ {
+ $this->refreshFlow = $refreshFlow;
+
+ return $this;
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Middleware/BaseMiddleware.php b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Middleware/BaseMiddleware.php
new file mode 100644
index 0000000..9715f0c
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Middleware/BaseMiddleware.php
@@ -0,0 +1,64 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Tymon\JWTAuth\Middleware;
+
+use Tymon\JWTAuth\JWTAuth;
+use Illuminate\Contracts\Events\Dispatcher;
+use Illuminate\Contracts\Routing\ResponseFactory;
+
+abstract class BaseMiddleware
+{
+ /**
+ * @var \Illuminate\Contracts\Routing\ResponseFactory
+ */
+ protected $response;
+
+ /**
+ * @var \Illuminate\Contracts\Events\Dispatcher
+ */
+ protected $events;
+
+ /**
+ * @var \Tymon\JWTAuth\JWTAuth
+ */
+ protected $auth;
+
+ /**
+ * Create a new BaseMiddleware instance.
+ *
+ * @param \Illuminate\Contracts\Routing\ResponseFactory $response
+ * @param \Illuminate\Contracts\Events\Dispatcher $events
+ * @param \Tymon\JWTAuth\JWTAuth $auth
+ */
+ public function __construct(ResponseFactory $response, Dispatcher $events, JWTAuth $auth)
+ {
+ $this->response = $response;
+ $this->events = $events;
+ $this->auth = $auth;
+ }
+
+ /**
+ * Fire event and return the response.
+ *
+ * @param string $event
+ * @param string $error
+ * @param int $status
+ * @param array $payload
+ * @return mixed
+ */
+ protected function respond($event, $error, $status, $payload = [])
+ {
+ $response = $this->events->fire($event, $payload, true);
+
+ return $response ?: $this->response->json(['error' => $error], $status);
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Middleware/GetUserFromToken.php b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Middleware/GetUserFromToken.php
new file mode 100644
index 0000000..af3b21c
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Middleware/GetUserFromToken.php
@@ -0,0 +1,48 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Tymon\JWTAuth\Middleware;
+
+use Tymon\JWTAuth\Exceptions\JWTException;
+use Tymon\JWTAuth\Exceptions\TokenExpiredException;
+
+class GetUserFromToken extends BaseMiddleware
+{
+ /**
+ * Handle an incoming request.
+ *
+ * @param \Illuminate\Http\Request $request
+ * @param \Closure $next
+ * @return mixed
+ */
+ public function handle($request, \Closure $next)
+ {
+ if (! $token = $this->auth->setRequest($request)->getToken()) {
+ return $this->respond('tymon.jwt.absent', 'token_not_provided', 400);
+ }
+
+ try {
+ $user = $this->auth->authenticate($token);
+ } catch (TokenExpiredException $e) {
+ return $this->respond('tymon.jwt.expired', 'token_expired', $e->getStatusCode(), [$e]);
+ } catch (JWTException $e) {
+ return $this->respond('tymon.jwt.invalid', 'token_invalid', $e->getStatusCode(), [$e]);
+ }
+
+ if (! $user) {
+ return $this->respond('tymon.jwt.user_not_found', 'user_not_found', 404);
+ }
+
+ $this->events->fire('tymon.jwt.valid', $user);
+
+ return $next($request);
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Middleware/RefreshToken.php b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Middleware/RefreshToken.php
new file mode 100644
index 0000000..a54774c
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Middleware/RefreshToken.php
@@ -0,0 +1,43 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Tymon\JWTAuth\Middleware;
+
+use Tymon\JWTAuth\Exceptions\JWTException;
+use Tymon\JWTAuth\Exceptions\TokenExpiredException;
+
+class RefreshToken extends BaseMiddleware
+{
+ /**
+ * Handle an incoming request.
+ *
+ * @param \Illuminate\Http\Request $request
+ * @param \Closure $next
+ * @return mixed
+ */
+ public function handle($request, \Closure $next)
+ {
+ $response = $next($request);
+
+ try {
+ $newToken = $this->auth->setRequest($request)->parseToken()->refresh();
+ } catch (TokenExpiredException $e) {
+ return $this->respond('tymon.jwt.expired', 'token_expired', $e->getStatusCode(), [$e]);
+ } catch (JWTException $e) {
+ return $this->respond('tymon.jwt.invalid', 'token_invalid', $e->getStatusCode(), [$e]);
+ }
+
+ // send the refreshed token back to the client
+ $response->headers->set('Authorization', 'Bearer '.$newToken);
+
+ return $response;
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Payload.php b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Payload.php
new file mode 100644
index 0000000..79cdb8d
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Payload.php
@@ -0,0 +1,175 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Tymon\JWTAuth;
+
+use Tymon\JWTAuth\Claims\Claim;
+use Tymon\JWTAuth\Exceptions\PayloadException;
+use Tymon\JWTAuth\Validators\PayloadValidator;
+
+class Payload implements \ArrayAccess
+{
+ /**
+ * The array of claims.
+ *
+ * @var \Tymon\JWTAuth\Claims\Claim[]
+ */
+ private $claims = [];
+
+ /**
+ * Build the Payload.
+ *
+ * @param array $claims
+ * @param \Tymon\JWTAuth\Validators\PayloadValidator $validator
+ * @param bool $refreshFlow
+ */
+ public function __construct(array $claims, PayloadValidator $validator, $refreshFlow = false)
+ {
+ $this->claims = $claims;
+
+ $validator->setRefreshFlow($refreshFlow)->check($this->toArray());
+ }
+
+ /**
+ * Get the array of claim instances.
+ *
+ * @return \Tymon\JWTAuth\Claims\Claim[]
+ */
+ public function getClaims()
+ {
+ return $this->claims;
+ }
+
+ /**
+ * Get the array of claims.
+ *
+ * @return array
+ */
+ public function toArray()
+ {
+ $results = [];
+ foreach ($this->claims as $claim) {
+ $results[$claim->getName()] = $claim->getValue();
+ }
+
+ return $results;
+ }
+
+ /**
+ * Get the payload.
+ *
+ * @param string $claim
+ * @return mixed
+ */
+ public function get($claim = null)
+ {
+ if (! is_null($claim)) {
+ if (is_array($claim)) {
+ return array_map([$this, 'get'], $claim);
+ }
+
+ return array_get($this->toArray(), $claim, false);
+ }
+
+ return $this->toArray();
+ }
+
+ /**
+ * Determine whether the payload has the claim.
+ *
+ * @param \Tymon\JWTAuth\Claims\Claim $claim
+ * @return bool
+ */
+ public function has(Claim $claim)
+ {
+ return in_array($claim, $this->claims);
+ }
+
+ /**
+ * Get the payload as a string.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return json_encode($this->toArray());
+ }
+
+ /**
+ * Determine if an item exists at an offset.
+ *
+ * @param mixed $key
+ * @return bool
+ */
+ public function offsetExists($key)
+ {
+ return array_key_exists($key, $this->toArray());
+ }
+
+ /**
+ * Get an item at a given offset.
+ *
+ * @param mixed $key
+ * @return mixed
+ */
+ public function offsetGet($key)
+ {
+ return array_get($this->toArray(), $key, []);
+ }
+
+ /**
+ * Don't allow changing the payload as it should be immutable.
+ *
+ * @param mixed $key
+ * @param mixed $value
+ * @throws Exceptions\PayloadException
+ * @return void
+ */
+ public function offsetSet($key, $value)
+ {
+ throw new PayloadException('The payload is immutable');
+ }
+
+ /**
+ * Don't allow changing the payload as it should be immutable.
+ *
+ * @param string $key
+ * @throws Exceptions\PayloadException
+ * @return void
+ */
+ public function offsetUnset($key)
+ {
+ throw new PayloadException('The payload is immutable');
+ }
+
+ /**
+ * Magically get a claim value.
+ *
+ * @param string $method
+ * @param array $parameters
+ * @return mixed
+ * @throws \BadMethodCallException
+ */
+ public function __call($method, $parameters)
+ {
+ if (! method_exists($this, $method) && starts_with($method, 'get')) {
+ $class = sprintf('Tymon\\JWTAuth\\Claims\\%s', substr($method, 3));
+
+ foreach ($this->claims as $claim) {
+ if (get_class($claim) === $class) {
+ return $claim->getValue();
+ }
+ }
+ }
+
+ throw new \BadMethodCallException(sprintf('The claim [%s] does not exist on the payload.', $method));
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/PayloadFactory.php b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/PayloadFactory.php
new file mode 100644
index 0000000..352e413
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/PayloadFactory.php
@@ -0,0 +1,245 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Tymon\JWTAuth;
+
+use Illuminate\Support\Str;
+use Illuminate\Http\Request;
+use Tymon\JWTAuth\Claims\Factory;
+use Tymon\JWTAuth\Validators\PayloadValidator;
+
+class PayloadFactory
+{
+ /**
+ * @var \Tymon\JWTAuth\Claims\Factory
+ */
+ protected $claimFactory;
+
+ /**
+ * @var \Illuminate\Http\Request
+ */
+ protected $request;
+
+ /**
+ * @var \Tymon\JWTAuth\Validators\PayloadValidator
+ */
+ protected $validator;
+
+ /**
+ * @var int
+ */
+ protected $ttl = 60;
+
+ /**
+ * @var bool
+ */
+ protected $refreshFlow = false;
+
+ /**
+ * @var array
+ */
+ protected $defaultClaims = ['iss', 'iat', 'exp', 'nbf', 'jti'];
+
+ /**
+ * @var array
+ */
+ protected $claims = [];
+
+ /**
+ * @param \Tymon\JWTAuth\Claims\Factory $claimFactory
+ * @param \Illuminate\Http\Request $request
+ * @param \Tymon\JWTAuth\Validators\PayloadValidator $validator
+ */
+ public function __construct(Factory $claimFactory, Request $request, PayloadValidator $validator)
+ {
+ $this->claimFactory = $claimFactory;
+ $this->request = $request;
+ $this->validator = $validator;
+ }
+
+ /**
+ * Create the Payload instance.
+ *
+ * @param array $customClaims
+ * @return \Tymon\JWTAuth\Payload
+ */
+ public function make(array $customClaims = [])
+ {
+ $claims = $this->buildClaims($customClaims)->resolveClaims();
+
+ return new Payload($claims, $this->validator, $this->refreshFlow);
+ }
+
+ /**
+ * Add an array of claims to the Payload.
+ *
+ * @param array $claims
+ * @return $this
+ */
+ public function addClaims(array $claims)
+ {
+ foreach ($claims as $name => $value) {
+ $this->addClaim($name, $value);
+ }
+
+ return $this;
+ }
+
+ /**
+ * Add a claim to the Payload.
+ *
+ * @param string $name
+ * @param mixed $value
+ * @return $this
+ */
+ public function addClaim($name, $value)
+ {
+ $this->claims[$name] = $value;
+
+ return $this;
+ }
+
+ /**
+ * Build the default claims.
+ *
+ * @param array $customClaims
+ * @return $this
+ */
+ protected function buildClaims(array $customClaims)
+ {
+ // add any custom claims first
+ $this->addClaims($customClaims);
+
+ foreach ($this->defaultClaims as $claim) {
+ if (! array_key_exists($claim, $customClaims)) {
+ $this->addClaim($claim, $this->$claim());
+ }
+ }
+
+ return $this;
+ }
+
+ /**
+ * Build out the Claim DTO's.
+ *
+ * @return array
+ */
+ public function resolveClaims()
+ {
+ $resolved = [];
+ foreach ($this->claims as $name => $value) {
+ $resolved[] = $this->claimFactory->get($name, $value);
+ }
+
+ return $resolved;
+ }
+
+ /**
+ * Set the Issuer (iss) claim.
+ *
+ * @return string
+ */
+ public function iss()
+ {
+ return $this->request->url();
+ }
+
+ /**
+ * Set the Issued At (iat) claim.
+ *
+ * @return int
+ */
+ public function iat()
+ {
+ return Utils::now()->timestamp;
+ }
+
+ /**
+ * Set the Expiration (exp) claim.
+ *
+ * @return int
+ */
+ public function exp()
+ {
+ return Utils::now()->addMinutes($this->ttl)->timestamp;
+ }
+
+ /**
+ * Set the Not Before (nbf) claim.
+ *
+ * @return int
+ */
+ public function nbf()
+ {
+ return Utils::now()->timestamp;
+ }
+
+ /**
+ * Set a unique id (jti) for the token.
+ *
+ * @return string
+ */
+ protected function jti()
+ {
+ return Str::random();
+ }
+
+ /**
+ * Set the token ttl (in minutes).
+ *
+ * @param int $ttl
+ * @return $this
+ */
+ public function setTTL($ttl)
+ {
+ $this->ttl = $ttl;
+
+ return $this;
+ }
+
+ /**
+ * Get the token ttl.
+ *
+ * @return int
+ */
+ public function getTTL()
+ {
+ return $this->ttl;
+ }
+
+ /**
+ * Set the refresh flow.
+ *
+ * @param bool $refreshFlow
+ * @return $this
+ */
+ public function setRefreshFlow($refreshFlow = true)
+ {
+ $this->refreshFlow = $refreshFlow;
+
+ return $this;
+ }
+
+ /**
+ * Magically add a claim.
+ *
+ * @param string $method
+ * @param array $parameters
+ * @return PayloadFactory
+ * @throws \BadMethodCallException
+ */
+ public function __call($method, $parameters)
+ {
+ $this->addClaim($method, $parameters[0]);
+
+ return $this;
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Providers/Auth/AuthInterface.php b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Providers/Auth/AuthInterface.php
new file mode 100644
index 0000000..f6f1dd7
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Providers/Auth/AuthInterface.php
@@ -0,0 +1,38 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Tymon\JWTAuth\Providers\Auth;
+
+interface AuthInterface
+{
+ /**
+ * Check a user's credentials.
+ *
+ * @param array $credentials
+ * @return bool
+ */
+ public function byCredentials(array $credentials = []);
+
+ /**
+ * Authenticate a user via the id.
+ *
+ * @param mixed $id
+ * @return bool
+ */
+ public function byId($id);
+
+ /**
+ * Get the currently authenticated user.
+ *
+ * @return mixed
+ */
+ public function user();
+}
diff --git a/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Providers/Auth/IlluminateAuthAdapter.php b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Providers/Auth/IlluminateAuthAdapter.php
new file mode 100644
index 0000000..4eaccbd
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Providers/Auth/IlluminateAuthAdapter.php
@@ -0,0 +1,62 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Tymon\JWTAuth\Providers\Auth;
+
+use Illuminate\Auth\AuthManager;
+
+class IlluminateAuthAdapter implements AuthInterface
+{
+ /**
+ * @var \Illuminate\Auth\AuthManager
+ */
+ protected $auth;
+
+ /**
+ * @param \Illuminate\Auth\AuthManager $auth
+ */
+ public function __construct(AuthManager $auth)
+ {
+ $this->auth = $auth;
+ }
+
+ /**
+ * Check a user's credentials.
+ *
+ * @param array $credentials
+ * @return bool
+ */
+ public function byCredentials(array $credentials = [])
+ {
+ return $this->auth->once($credentials);
+ }
+
+ /**
+ * Authenticate a user via the id.
+ *
+ * @param mixed $id
+ * @return bool
+ */
+ public function byId($id)
+ {
+ return $this->auth->onceUsingId($id);
+ }
+
+ /**
+ * Get the currently authenticated user.
+ *
+ * @return mixed
+ */
+ public function user()
+ {
+ return $this->auth->user();
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Providers/JWT/JWTInterface.php b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Providers/JWT/JWTInterface.php
new file mode 100644
index 0000000..0852923
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Providers/JWT/JWTInterface.php
@@ -0,0 +1,27 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Tymon\JWTAuth\Providers\JWT;
+
+interface JWTInterface
+{
+ /**
+ * @param array $payload
+ * @return string
+ */
+ public function encode(array $payload);
+
+ /**
+ * @param string $token
+ * @return array
+ */
+ public function decode($token);
+}
diff --git a/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Providers/JWT/JWTProvider.php b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Providers/JWT/JWTProvider.php
new file mode 100644
index 0000000..e15e848
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Providers/JWT/JWTProvider.php
@@ -0,0 +1,82 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Tymon\JWTAuth\Providers\JWT;
+
+abstract class JWTProvider
+{
+ /**
+ * @var string
+ */
+ protected $secret;
+
+ /**
+ * @var string
+ */
+ protected $algo;
+
+ /**
+ * @param string $secret
+ * @param string $algo
+ */
+ public function __construct($secret, $algo = 'HS256')
+ {
+ $this->secret = $secret;
+ $this->algo = $algo;
+ }
+
+ /**
+ * Set the algorithm used to sign the token.
+ *
+ * @param string $algo
+ * @return self
+ */
+ public function setAlgo($algo)
+ {
+ $this->algo = $algo;
+
+ return $this;
+ }
+
+ /**
+ * Get the algorithm used to sign the token.
+ *
+ * @return string
+ */
+ public function getAlgo()
+ {
+ return $this->algo;
+ }
+
+ /**
+ * Set the secret used to sign the token.
+ *
+ * @param string $secret
+ *
+ * @return $this
+ */
+ public function setSecret($secret)
+ {
+ $this->secret = $secret;
+
+ return $this;
+ }
+
+ /**
+ * Get the secret used to sign the token.
+ *
+ * @return string
+ */
+ public function getSecret()
+ {
+ return $this->secret;
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Providers/JWT/NamshiAdapter.php b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Providers/JWT/NamshiAdapter.php
new file mode 100644
index 0000000..e291474
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Providers/JWT/NamshiAdapter.php
@@ -0,0 +1,76 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Tymon\JWTAuth\Providers\JWT;
+
+use Exception;
+use Namshi\JOSE\JWS;
+use Tymon\JWTAuth\Exceptions\JWTException;
+use Tymon\JWTAuth\Exceptions\TokenInvalidException;
+
+class NamshiAdapter extends JWTProvider implements JWTInterface
+{
+ /**
+ * @var \Namshi\JOSE\JWS
+ */
+ protected $jws;
+
+ /**
+ * @param string $secret
+ * @param string $algo
+ * @param null $driver
+ */
+ public function __construct($secret, $algo, $driver = null)
+ {
+ parent::__construct($secret, $algo);
+
+ $this->jws = $driver ?: new JWS(['typ' => 'JWT', 'alg' => $algo]);
+ }
+
+ /**
+ * Create a JSON Web Token.
+ *
+ * @return string
+ * @throws \Tymon\JWTAuth\Exceptions\JWTException
+ */
+ public function encode(array $payload)
+ {
+ try {
+ $this->jws->setPayload($payload)->sign($this->secret);
+
+ return $this->jws->getTokenString();
+ } catch (Exception $e) {
+ throw new JWTException('Could not create token: '.$e->getMessage());
+ }
+ }
+
+ /**
+ * Decode a JSON Web Token.
+ *
+ * @param string $token
+ * @return array
+ * @throws \Tymon\JWTAuth\Exceptions\JWTException
+ */
+ public function decode($token)
+ {
+ try {
+ $jws = JWS::load($token);
+ } catch (Exception $e) {
+ throw new TokenInvalidException('Could not decode token: '.$e->getMessage());
+ }
+
+ if (! $jws->verify($this->secret, $this->algo)) {
+ throw new TokenInvalidException('Token Signature could not be verified.');
+ }
+
+ return $jws->getPayload();
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Providers/JWTAuthServiceProvider.php b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Providers/JWTAuthServiceProvider.php
new file mode 100644
index 0000000..6bb4365
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Providers/JWTAuthServiceProvider.php
@@ -0,0 +1,278 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Tymon\JWTAuth\Providers;
+
+use Tymon\JWTAuth\JWTAuth;
+use Tymon\JWTAuth\Blacklist;
+use Tymon\JWTAuth\JWTManager;
+use Tymon\JWTAuth\Claims\Factory;
+use Tymon\JWTAuth\PayloadFactory;
+use Illuminate\Support\ServiceProvider;
+use Tymon\JWTAuth\Commands\JWTGenerateCommand;
+use Tymon\JWTAuth\Validators\PayloadValidator;
+
+class JWTAuthServiceProvider extends ServiceProvider
+{
+ /**
+ * Indicates if loading of the provider is deferred.
+ *
+ * @var bool
+ */
+ protected $defer = false;
+
+ /**
+ * Boot the service provider.
+ */
+ public function boot()
+ {
+ $this->publishes([
+ __DIR__.'/../config/config.php' => config_path('jwt.php'),
+ ], 'config');
+
+ $this->bootBindings();
+
+ $this->commands('tymon.jwt.generate');
+ }
+
+ /**
+ * Bind some Interfaces and implementations.
+ */
+ protected function bootBindings()
+ {
+ $this->app->singleton('Tymon\JWTAuth\JWTAuth', function ($app) {
+ return $app['tymon.jwt.auth'];
+ });
+
+ $this->app->singleton('Tymon\JWTAuth\Providers\User\UserInterface', function ($app) {
+ return $app['tymon.jwt.provider.user'];
+ });
+
+ $this->app->singleton('Tymon\JWTAuth\Providers\JWT\JWTInterface', function ($app) {
+ return $app['tymon.jwt.provider.jwt'];
+ });
+
+ $this->app->singleton('Tymon\JWTAuth\Providers\Auth\AuthInterface', function ($app) {
+ return $app['tymon.jwt.provider.auth'];
+ });
+
+ $this->app->singleton('Tymon\JWTAuth\Providers\Storage\StorageInterface', function ($app) {
+ return $app['tymon.jwt.provider.storage'];
+ });
+
+ $this->app->singleton('Tymon\JWTAuth\JWTManager', function ($app) {
+ return $app['tymon.jwt.manager'];
+ });
+
+ $this->app->singleton('Tymon\JWTAuth\Blacklist', function ($app) {
+ return $app['tymon.jwt.blacklist'];
+ });
+
+ $this->app->singleton('Tymon\JWTAuth\PayloadFactory', function ($app) {
+ return $app['tymon.jwt.payload.factory'];
+ });
+
+ $this->app->singleton('Tymon\JWTAuth\Claims\Factory', function ($app) {
+ return $app['tymon.jwt.claim.factory'];
+ });
+
+ $this->app->singleton('Tymon\JWTAuth\Validators\PayloadValidator', function ($app) {
+ return $app['tymon.jwt.validators.payload'];
+ });
+ }
+
+ /**
+ * Register the service provider.
+ *
+ * @return void
+ */
+ public function register()
+ {
+ // register providers
+ $this->registerUserProvider();
+ $this->registerJWTProvider();
+ $this->registerAuthProvider();
+ $this->registerStorageProvider();
+ $this->registerJWTBlacklist();
+
+ $this->registerClaimFactory();
+ $this->registerJWTManager();
+
+ $this->registerJWTAuth();
+ $this->registerPayloadValidator();
+ $this->registerPayloadFactory();
+ $this->registerJWTCommand();
+
+ $this->mergeConfigFrom(__DIR__.'/../config/config.php', 'jwt');
+ }
+
+ /**
+ * Register the bindings for the User provider.
+ */
+ protected function registerUserProvider()
+ {
+ $this->app->singleton('tymon.jwt.provider.user', function ($app) {
+ $provider = $this->config('providers.user');
+ $model = $app->make($this->config('user'));
+
+ return new $provider($model);
+ });
+ }
+
+ /**
+ * Register the bindings for the JSON Web Token provider.
+ */
+ protected function registerJWTProvider()
+ {
+ $this->app->singleton('tymon.jwt.provider.jwt', function ($app) {
+ $secret = $this->config('secret');
+ $algo = $this->config('algo');
+ $provider = $this->config('providers.jwt');
+
+ return new $provider($secret, $algo);
+ });
+ }
+
+ /**
+ * Register the bindings for the Auth provider.
+ */
+ protected function registerAuthProvider()
+ {
+ $this->app->singleton('tymon.jwt.provider.auth', function ($app) {
+ return $this->getConfigInstance($this->config('providers.auth'));
+ });
+ }
+
+ /**
+ * Register the bindings for the Storage provider.
+ */
+ protected function registerStorageProvider()
+ {
+ $this->app->singleton('tymon.jwt.provider.storage', function ($app) {
+ return $this->getConfigInstance($this->config('providers.storage'));
+ });
+ }
+
+ /**
+ * Register the bindings for the Payload Factory.
+ */
+ protected function registerClaimFactory()
+ {
+ $this->app->singleton('tymon.jwt.claim.factory', function () {
+ return new Factory();
+ });
+ }
+
+ /**
+ * Register the bindings for the JWT Manager.
+ */
+ protected function registerJWTManager()
+ {
+ $this->app->singleton('tymon.jwt.manager', function ($app) {
+ $instance = new JWTManager(
+ $app['tymon.jwt.provider.jwt'],
+ $app['tymon.jwt.blacklist'],
+ $app['tymon.jwt.payload.factory']
+ );
+
+ return $instance->setBlacklistEnabled((bool) $this->config('blacklist_enabled'));
+ });
+ }
+
+ /**
+ * Register the bindings for the main JWTAuth class.
+ */
+ protected function registerJWTAuth()
+ {
+ $this->app->singleton('tymon.jwt.auth', function ($app) {
+ $auth = new JWTAuth(
+ $app['tymon.jwt.manager'],
+ $app['tymon.jwt.provider.user'],
+ $app['tymon.jwt.provider.auth'],
+ $app['request']
+ );
+
+ return $auth->setIdentifier($this->config('identifier'));
+ });
+ }
+
+ /**
+ * Register the bindings for the main JWTAuth class.
+ */
+ protected function registerJWTBlacklist()
+ {
+ $this->app->singleton('tymon.jwt.blacklist', function ($app) {
+ $instance = new Blacklist($app['tymon.jwt.provider.storage']);
+
+ return $instance->setRefreshTTL($this->config('refresh_ttl'));
+ });
+ }
+
+ /**
+ * Register the bindings for the payload validator.
+ */
+ protected function registerPayloadValidator()
+ {
+ $this->app->singleton('tymon.jwt.validators.payload', function () {
+ return with(new PayloadValidator())->setRefreshTTL($this->config('refresh_ttl'))->setRequiredClaims($this->config('required_claims'));
+ });
+ }
+
+ /**
+ * Register the bindings for the Payload Factory.
+ */
+ protected function registerPayloadFactory()
+ {
+ $this->app->singleton('tymon.jwt.payload.factory', function ($app) {
+ $factory = new PayloadFactory($app['tymon.jwt.claim.factory'], $app['request'], $app['tymon.jwt.validators.payload']);
+
+ return $factory->setTTL($this->config('ttl'));
+ });
+ }
+
+ /**
+ * Register the Artisan command.
+ */
+ protected function registerJWTCommand()
+ {
+ $this->app->singleton('tymon.jwt.generate', function () {
+ return new JWTGenerateCommand();
+ });
+ }
+
+ /**
+ * Helper to get the config values.
+ *
+ * @param string $key
+ * @return string
+ */
+ protected function config($key, $default = null)
+ {
+ return config("jwt.$key", $default);
+ }
+
+ /**
+ * Get an instantiable configuration instance. Pinched from dingo/api :).
+ *
+ * @param mixed $instance
+ * @return object
+ */
+ protected function getConfigInstance($instance)
+ {
+ if (is_callable($instance)) {
+ return call_user_func($instance, $this->app);
+ } elseif (is_string($instance)) {
+ return $this->app->make($instance);
+ }
+
+ return $instance;
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Providers/Storage/IlluminateCacheAdapter.php b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Providers/Storage/IlluminateCacheAdapter.php
new file mode 100644
index 0000000..3abdee5
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Providers/Storage/IlluminateCacheAdapter.php
@@ -0,0 +1,94 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Tymon\JWTAuth\Providers\Storage;
+
+use Illuminate\Cache\CacheManager;
+
+class IlluminateCacheAdapter implements StorageInterface
+{
+ /**
+ * @var \Illuminate\Cache\CacheManager
+ */
+ protected $cache;
+
+ /**
+ * @var string
+ */
+ protected $tag = 'tymon.jwt';
+
+ /**
+ * @param \Illuminate\Cache\CacheManager $cache
+ */
+ public function __construct(CacheManager $cache)
+ {
+ $this->cache = $cache;
+ }
+
+ /**
+ * Add a new item into storage.
+ *
+ * @param string $key
+ * @param mixed $value
+ * @param int $minutes
+ * @return void
+ */
+ public function add($key, $value, $minutes)
+ {
+ $this->cache()->put($key, $value, $minutes);
+ }
+
+ /**
+ * Check whether a key exists in storage.
+ *
+ * @param string $key
+ * @return bool
+ */
+ public function has($key)
+ {
+ return $this->cache()->has($key);
+ }
+
+ /**
+ * Remove an item from storage.
+ *
+ * @param string $key
+ * @return bool
+ */
+ public function destroy($key)
+ {
+ return $this->cache()->forget($key);
+ }
+
+ /**
+ * Remove all items associated with the tag.
+ *
+ * @return void
+ */
+ public function flush()
+ {
+ $this->cache()->flush();
+ }
+
+ /**
+ * Return the cache instance with tags attached.
+ *
+ * @return \Illuminate\Cache\CacheManager
+ */
+ protected function cache()
+ {
+ if (! method_exists($this->cache, 'tags')) {
+ return $this->cache;
+ }
+
+ return $this->cache->tags($this->tag);
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Providers/Storage/StorageInterface.php b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Providers/Storage/StorageInterface.php
new file mode 100644
index 0000000..7468ed7
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Providers/Storage/StorageInterface.php
@@ -0,0 +1,39 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Tymon\JWTAuth\Providers\Storage;
+
+interface StorageInterface
+{
+ /**
+ * @param string $key
+ * @param int $minutes
+ * @return void
+ */
+ public function add($key, $value, $minutes);
+
+ /**
+ * @param string $key
+ * @return bool
+ */
+ public function has($key);
+
+ /**
+ * @param string $key
+ * @return bool
+ */
+ public function destroy($key);
+
+ /**
+ * @return void
+ */
+ public function flush();
+}
diff --git a/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Providers/User/EloquentUserAdapter.php b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Providers/User/EloquentUserAdapter.php
new file mode 100644
index 0000000..63e80cc
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Providers/User/EloquentUserAdapter.php
@@ -0,0 +1,44 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Tymon\JWTAuth\Providers\User;
+
+use Illuminate\Database\Eloquent\Model;
+
+class EloquentUserAdapter implements UserInterface
+{
+ /**
+ * @var \Illuminate\Database\Eloquent\Model
+ */
+ protected $user;
+
+ /**
+ * Create a new User instance.
+ *
+ * @param \Illuminate\Database\Eloquent\Model $user
+ */
+ public function __construct(Model $user)
+ {
+ $this->user = $user;
+ }
+
+ /**
+ * Get the user by the given key, value.
+ *
+ * @param mixed $key
+ * @param mixed $value
+ * @return Illuminate\Database\Eloquent\Model
+ */
+ public function getBy($key, $value)
+ {
+ return $this->user->where($key, $value)->first();
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Providers/User/UserInterface.php b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Providers/User/UserInterface.php
new file mode 100644
index 0000000..6a73e3f
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Providers/User/UserInterface.php
@@ -0,0 +1,24 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Tymon\JWTAuth\Providers\User;
+
+interface UserInterface
+{
+ /**
+ * Get the user by the given key, value.
+ *
+ * @param string $key
+ * @param mixed $value
+ * @return Illuminate\Database\Eloquent\Model|null
+ */
+ public function getBy($key, $value);
+}
diff --git a/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Token.php b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Token.php
new file mode 100644
index 0000000..e451aad
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Token.php
@@ -0,0 +1,54 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Tymon\JWTAuth;
+
+use Tymon\JWTAuth\Validators\TokenValidator;
+
+class Token
+{
+ /**
+ * @var string
+ */
+ private $value;
+
+ /**
+ * Create a new JSON Web Token.
+ *
+ * @param string $value
+ */
+ public function __construct($value)
+ {
+ with(new TokenValidator)->check($value);
+
+ $this->value = $value;
+ }
+
+ /**
+ * Get the token.
+ *
+ * @return string
+ */
+ public function get()
+ {
+ return $this->value;
+ }
+
+ /**
+ * Get the token when casting to string.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return (string) $this->value;
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Utils.php b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Utils.php
new file mode 100644
index 0000000..9469781
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Utils.php
@@ -0,0 +1,38 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Tymon\JWTAuth;
+
+use Carbon\Carbon;
+
+class Utils
+{
+ /**
+ * Get the Carbon instance for the current time.
+ *
+ * @return \Carbon\Carbon
+ */
+ public static function now()
+ {
+ return Carbon::now();
+ }
+
+ /**
+ * Get the Carbon instance for the timestamp.
+ *
+ * @param int $timestamp
+ * @return \Carbon\Carbon
+ */
+ public static function timestamp($timestamp)
+ {
+ return Carbon::createFromTimeStampUTC($timestamp);
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Validators/AbstractValidator.php b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Validators/AbstractValidator.php
new file mode 100644
index 0000000..5a3ad28
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Validators/AbstractValidator.php
@@ -0,0 +1,52 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Tymon\JWTAuth\Validators;
+
+use Tymon\JWTAuth\Exceptions\JWTException;
+
+abstract class AbstractValidator implements ValidatorInterface
+{
+ /**
+ * @var bool
+ */
+ protected $refreshFlow = false;
+
+ /**
+ * Helper function to return a boolean.
+ *
+ * @param array $value
+ * @return bool
+ */
+ public function isValid($value)
+ {
+ try {
+ $this->check($value);
+ } catch (JWTException $e) {
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
+ * Set the refresh flow flag.
+ *
+ * @param bool $refreshFlow
+ * @return $this
+ */
+ public function setRefreshFlow($refreshFlow = true)
+ {
+ $this->refreshFlow = $refreshFlow;
+
+ return $this;
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Validators/PayloadValidator.php b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Validators/PayloadValidator.php
new file mode 100644
index 0000000..80e1a86
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Validators/PayloadValidator.php
@@ -0,0 +1,127 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Tymon\JWTAuth\Validators;
+
+use Tymon\JWTAuth\Utils;
+use Tymon\JWTAuth\Exceptions\TokenExpiredException;
+use Tymon\JWTAuth\Exceptions\TokenInvalidException;
+
+class PayloadValidator extends AbstractValidator
+{
+ /**
+ * @var array
+ */
+ protected $requiredClaims = ['iss', 'iat', 'exp', 'nbf', 'sub', 'jti'];
+
+ /**
+ * @var int
+ */
+ protected $refreshTTL = 20160;
+
+ /**
+ * Run the validations on the payload array.
+ *
+ * @param array $value
+ * @return void
+ */
+ public function check($value)
+ {
+ $this->validateStructure($value);
+
+ if (! $this->refreshFlow) {
+ $this->validateTimestamps($value);
+ } else {
+ $this->validateRefresh($value);
+ }
+ }
+
+ /**
+ * Ensure the payload contains the required claims and
+ * the claims have the relevant type.
+ *
+ * @param array $payload
+ * @throws \Tymon\JWTAuth\Exceptions\TokenInvalidException
+ * @return bool
+ */
+ protected function validateStructure(array $payload)
+ {
+ if (count(array_diff($this->requiredClaims, array_keys($payload))) !== 0) {
+ throw new TokenInvalidException('JWT payload does not contain the required claims');
+ }
+
+ return true;
+ }
+
+ /**
+ * Validate the payload timestamps.
+ *
+ * @param array $payload
+ * @throws \Tymon\JWTAuth\Exceptions\TokenExpiredException
+ * @throws \Tymon\JWTAuth\Exceptions\TokenInvalidException
+ * @return bool
+ */
+ protected function validateTimestamps(array $payload)
+ {
+ if (isset($payload['nbf']) && Utils::timestamp($payload['nbf'])->isFuture()) {
+ throw new TokenInvalidException('Not Before (nbf) timestamp cannot be in the future', 400);
+ }
+
+ if (isset($payload['iat']) && Utils::timestamp($payload['iat'])->isFuture()) {
+ throw new TokenInvalidException('Issued At (iat) timestamp cannot be in the future', 400);
+ }
+
+ if (Utils::timestamp($payload['exp'])->isPast()) {
+ throw new TokenExpiredException('Token has expired');
+ }
+
+ return true;
+ }
+
+ /**
+ * Check the token in the refresh flow context.
+ *
+ * @param $payload
+ * @return bool
+ */
+ protected function validateRefresh(array $payload)
+ {
+ if (isset($payload['iat']) && Utils::timestamp($payload['iat'])->addMinutes($this->refreshTTL)->isPast()) {
+ throw new TokenExpiredException('Token has expired and can no longer be refreshed', 400);
+ }
+
+ return true;
+ }
+
+ /**
+ * Set the required claims.
+ *
+ * @param array $claims
+ */
+ public function setRequiredClaims(array $claims)
+ {
+ $this->requiredClaims = $claims;
+
+ return $this;
+ }
+
+ /**
+ * Set the refresh ttl.
+ *
+ * @param int $ttl
+ */
+ public function setRefreshTTL($ttl)
+ {
+ $this->refreshTTL = $ttl;
+
+ return $this;
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Validators/TokenValidator.php b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Validators/TokenValidator.php
new file mode 100644
index 0000000..f68e195
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Validators/TokenValidator.php
@@ -0,0 +1,42 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Tymon\JWTAuth\Validators;
+
+use Tymon\JWTAuth\Exceptions\TokenInvalidException;
+
+class TokenValidator extends AbstractValidator
+{
+ /**
+ * Check the structure of the token.
+ *
+ * @param string $value
+ * @return void
+ */
+ public function check($value)
+ {
+ $this->validateStructure($value);
+ }
+
+ /**
+ * @param string $token
+ * @throws \Tymon\JWTAuth\Exceptions\TokenInvalidException
+ * @return bool
+ */
+ protected function validateStructure($token)
+ {
+ if (count(explode('.', $token)) !== 3) {
+ throw new TokenInvalidException('Wrong number of segments');
+ }
+
+ return true;
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Validators/ValidatorInterface.php b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Validators/ValidatorInterface.php
new file mode 100644
index 0000000..87d5dc0
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/Validators/ValidatorInterface.php
@@ -0,0 +1,31 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Tymon\JWTAuth\Validators;
+
+interface ValidatorInterface
+{
+ /**
+ * Perform some checks on the value.
+ *
+ * @param mixed $value
+ * @return void
+ */
+ public function check($value);
+
+ /**
+ * Helper function to return a boolean.
+ *
+ * @param array $value
+ * @return bool
+ */
+ public function isValid($value);
+}
diff --git a/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/config/config.php b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/config/config.php
new file mode 100644
index 0000000..b12ac03
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/src/config/config.php
@@ -0,0 +1,173 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+return [
+
+ /*
+ |--------------------------------------------------------------------------
+ | JWT Authentication Secret
+ |--------------------------------------------------------------------------
+ |
+ | Don't forget to set this, as it will be used to sign your tokens.
+ | A helper command is provided for this: `php artisan jwt:generate`
+ |
+ */
+
+ 'secret' => env('JWT_SECRET', 'changeme'),
+
+ /*
+ |--------------------------------------------------------------------------
+ | JWT time to live
+ |--------------------------------------------------------------------------
+ |
+ | Specify the length of time (in minutes) that the token will be valid for.
+ | Defaults to 1 hour
+ |
+ */
+
+ 'ttl' => 60,
+
+ /*
+ |--------------------------------------------------------------------------
+ | Refresh time to live
+ |--------------------------------------------------------------------------
+ |
+ | Specify the length of time (in minutes) that the token can be refreshed
+ | within. I.E. The user can refresh their token within a 2 week window of
+ | the original token being created until they must re-authenticate.
+ | Defaults to 2 weeks
+ |
+ */
+
+ 'refresh_ttl' => 20160,
+
+ /*
+ |--------------------------------------------------------------------------
+ | JWT hashing algorithm
+ |--------------------------------------------------------------------------
+ |
+ | Specify the hashing algorithm that will be used to sign the token.
+ |
+ | See here: https://github.com/namshi/jose/tree/2.2.0/src/Namshi/JOSE/Signer
+ | for possible values
+ |
+ */
+
+ 'algo' => 'HS256',
+
+ /*
+ |--------------------------------------------------------------------------
+ | User Model namespace
+ |--------------------------------------------------------------------------
+ |
+ | Specify the full namespace to your User model.
+ | e.g. 'Acme\Entities\User'
+ |
+ */
+
+ 'user' => 'App\User',
+
+ /*
+ |--------------------------------------------------------------------------
+ | User identifier
+ |--------------------------------------------------------------------------
+ |
+ | Specify a unique property of the user that will be added as the 'sub'
+ | claim of the token payload.
+ |
+ */
+
+ 'identifier' => 'id',
+
+ /*
+ |--------------------------------------------------------------------------
+ | Required Claims
+ |--------------------------------------------------------------------------
+ |
+ | Specify the required claims that must exist in any token.
+ | A TokenInvalidException will be thrown if any of these claims are not
+ | present in the payload.
+ |
+ */
+
+ 'required_claims' => ['iss', 'iat', 'exp', 'nbf', 'sub', 'jti'],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Blacklist Enabled
+ |--------------------------------------------------------------------------
+ |
+ | In order to invalidate tokens, you must have the blacklist enabled.
+ | If you do not want or need this functionality, then set this to false.
+ |
+ */
+
+ 'blacklist_enabled' => env('JWT_BLACKLIST_ENABLED', true),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Providers
+ |--------------------------------------------------------------------------
+ |
+ | Specify the various providers used throughout the package.
+ |
+ */
+
+ 'providers' => [
+
+ /*
+ |--------------------------------------------------------------------------
+ | User Provider
+ |--------------------------------------------------------------------------
+ |
+ | Specify the provider that is used to find the user based
+ | on the subject claim
+ |
+ */
+
+ 'user' => 'Tymon\JWTAuth\Providers\User\EloquentUserAdapter',
+
+ /*
+ |--------------------------------------------------------------------------
+ | JWT Provider
+ |--------------------------------------------------------------------------
+ |
+ | Specify the provider that is used to create and decode the tokens.
+ |
+ */
+
+ 'jwt' => 'Tymon\JWTAuth\Providers\JWT\NamshiAdapter',
+
+ /*
+ |--------------------------------------------------------------------------
+ | Authentication Provider
+ |--------------------------------------------------------------------------
+ |
+ | Specify the provider that is used to authenticate users.
+ |
+ */
+
+ 'auth' => 'Tymon\JWTAuth\Providers\Auth\IlluminateAuthAdapter',
+
+ /*
+ |--------------------------------------------------------------------------
+ | Storage Provider
+ |--------------------------------------------------------------------------
+ |
+ | Specify the provider that is used to store tokens in the blacklist
+ |
+ */
+
+ 'storage' => 'Tymon\JWTAuth\Providers\Storage\IlluminateCacheAdapter',
+
+ ],
+
+];
diff --git a/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/tests/BlacklistTest.php b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/tests/BlacklistTest.php
new file mode 100644
index 0000000..0f00881
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/tests/BlacklistTest.php
@@ -0,0 +1,153 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Tymon\JWTAuth\Test\Providers\JWT;
+
+use Mockery;
+use Carbon\Carbon;
+use Tymon\JWTAuth\Payload;
+use Tymon\JWTAuth\Blacklist;
+use Tymon\JWTAuth\Claims\JwtId;
+use Tymon\JWTAuth\Claims\Issuer;
+use Tymon\JWTAuth\Claims\Subject;
+use Tymon\JWTAuth\Claims\IssuedAt;
+use Tymon\JWTAuth\Claims\NotBefore;
+use Tymon\JWTAuth\Claims\Expiration;
+
+class BlacklistTest extends \PHPUnit_Framework_TestCase
+{
+ public function setUp()
+ {
+ Carbon::setTestNow(Carbon::createFromTimeStampUTC(123));
+
+ $this->storage = Mockery::mock('Tymon\JWTAuth\Providers\Storage\StorageInterface');
+ $this->blacklist = new Blacklist($this->storage);
+ $this->blacklist->setRefreshTTL(20160);
+
+ $this->validator = Mockery::mock('Tymon\JWTAuth\Validators\PayloadValidator');
+ $this->validator->shouldReceive('setRefreshFlow->check');
+ }
+
+ public function tearDown()
+ {
+ Mockery::close();
+ }
+
+ /** @test */
+ public function it_should_add_a_valid_token_to_the_blacklist()
+ {
+ $claims = [
+ new Subject(1),
+ new Issuer('http://example.com'),
+ new Expiration(100 + 3600),
+ new NotBefore(100),
+ new IssuedAt(100),
+ new JwtId('foo'),
+ ];
+ $payload = new Payload($claims, $this->validator);
+
+ $this->storage->shouldReceive('add')->once()->with('foo', [], 20160);
+ $this->assertTrue($this->blacklist->add($payload));
+ }
+
+ /** @test */
+ public function it_should_return_true_when_adding_a_refreshable_expired_token_to_the_blacklist()
+ {
+ $claims = [
+ new Subject(1),
+ new Issuer('http://example.com'),
+ new Expiration(101),
+ new NotBefore(100),
+ new IssuedAt(100),
+ new JwtId('foo'),
+ ];
+ $payload = new Payload($claims, $this->validator, true);
+
+ $this->storage->shouldReceive('add')->once()->with('foo', [], 20160);
+ $this->assertTrue($this->blacklist->add($payload));
+ }
+
+ /** @test */
+ public function it_should_return_false_when_adding_an_unrefreshable_token_to_the_blacklist()
+ {
+ $claims = [
+ new Subject(1),
+ new Issuer('http://example.com'),
+ new Expiration(100), // default refresh_ttl
+ new NotBefore(100),
+ new IssuedAt(100 - 20160 * 60),
+ new JwtId('foo'),
+ ];
+ $payload = new Payload($claims, $this->validator, true);
+
+ $this->storage->shouldReceive('add')->never();
+ $this->assertFalse($this->blacklist->add($payload));
+ }
+
+ /** @test */
+ public function it_should_return_false_when_adding_a_unrefreshable_token_after_modifying_refresh_ttl()
+ {
+ $claims = [
+ new Subject(1),
+ new Issuer('http://example.com'),
+ new Expiration(101),
+ new NotBefore(100),
+ new IssuedAt(100),
+ new JwtId('foo'),
+ ];
+ $payload = new Payload($claims, $this->validator, true);
+
+ $this->storage->shouldReceive('add')->never();
+ $this->blacklist->setRefreshTTL(0);
+ $this->assertFalse($this->blacklist->add($payload));
+ }
+
+ /** @test */
+ public function it_should_check_whether_a_token_has_been_blacklisted()
+ {
+ $claims = [
+ new Subject(1),
+ new Issuer('http://example.com'),
+ new Expiration(123 + 3600),
+ new NotBefore(123),
+ new IssuedAt(123),
+ new JwtId('foobar'),
+ ];
+ $payload = new Payload($claims, $this->validator);
+
+ $this->storage->shouldReceive('has')->once()->with('foobar')->andReturn(true);
+ $this->assertTrue($this->blacklist->has($payload));
+ }
+
+ /** @test */
+ public function it_should_remove_a_token_from_the_blacklist()
+ {
+ $claims = [
+ new Subject(1),
+ new Issuer('http://example.com'),
+ new Expiration(123 + 3600),
+ new NotBefore(123),
+ new IssuedAt(123),
+ new JwtId('foobar'),
+ ];
+ $payload = new Payload($claims, $this->validator);
+
+ $this->storage->shouldReceive('destroy')->once()->with('foobar')->andReturn(true);
+ $this->assertTrue($this->blacklist->remove($payload));
+ }
+
+ /** @test */
+ public function it_should_empty_the_blacklist()
+ {
+ $this->storage->shouldReceive('flush')->once();
+ $this->assertTrue($this->blacklist->clear());
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/tests/Commands/JWTGenerateCommandTest.php b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/tests/Commands/JWTGenerateCommandTest.php
new file mode 100644
index 0000000..a4a11ac
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/tests/Commands/JWTGenerateCommandTest.php
@@ -0,0 +1,44 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Tymon\JWTAuth\Test;
+
+use Illuminate\Foundation\Application;
+use Tymon\JWTAuth\Commands\JWTGenerateCommand;
+use Symfony\Component\Console\Input\ArrayInput;
+use Symfony\Component\Console\Output\NullOutput;
+use Symfony\Component\Console\Tester\CommandTester;
+
+class JWTGenerateCommandTest extends \PHPUnit_Framework_TestCase
+{
+ public function setUp()
+ {
+ $this->command = new JWTGenerateCommand();
+ $this->tester = new CommandTester($this->command);
+ }
+
+ /** @test */
+ public function it_shoud_generate_random_key()
+ {
+ // $app = new Application();
+
+ // $app['path.base'] = '';
+
+ // $this->command->setLaravel($app);
+
+ // $this->runCommand($this->command);
+ }
+
+ protected function runCommand($command, $input = [])
+ {
+ return $command->run(new ArrayInput($input), new NullOutput);
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/tests/JWTAuthTest.php b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/tests/JWTAuthTest.php
new file mode 100644
index 0000000..3f910d4
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/tests/JWTAuthTest.php
@@ -0,0 +1,235 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Tymon\JWTAuth\Test;
+
+use Mockery;
+use Tymon\JWTAuth\Token;
+use Tymon\JWTAuth\JWTAuth;
+use Illuminate\Http\Request;
+
+class JWTAuthTest extends \PHPUnit_Framework_TestCase
+{
+ public function setUp()
+ {
+ $this->user = Mockery::mock('Tymon\JWTAuth\Providers\User\UserInterface');
+ $this->manager = Mockery::mock('Tymon\JWTAuth\JWTManager');
+ $this->auth = Mockery::mock('Tymon\JWTAuth\Providers\Auth\AuthInterface');
+
+ $this->jwtAuth = new JWTAuth($this->manager, $this->user, $this->auth, Request::create('/foo', 'GET'));
+ }
+
+ public function tearDown()
+ {
+ Mockery::close();
+ }
+
+ /** @test */
+ public function it_should_return_a_user_when_passing_a_token_containing_a_valid_subject_claim()
+ {
+ $payload = Mockery::mock('Tymon\JWTAuth\Payload');
+ $payload->shouldReceive('offsetGet')->once()->andReturn(1);
+
+ $this->manager->shouldReceive('decode')->once()->andReturn($payload);
+ $this->user->shouldReceive('getBy')->once()->andReturn((object) ['id' => 1]);
+
+ $user = $this->jwtAuth->toUser('foo.bar.baz');
+
+ $this->assertEquals(1, $user->id);
+ }
+
+ /** @test */
+ public function it_should_return_false_when_passing_a_token_containing_an_invalid_subject_claim()
+ {
+ $payload = Mockery::mock('Tymon\JWTAuth\Payload');
+ $payload->shouldReceive('offsetGet')->once()->andReturn(1);
+
+ $this->manager->shouldReceive('decode')->once()->andReturn($payload);
+ $this->user->shouldReceive('getBy')->once()->andReturn(false);
+
+ $user = $this->jwtAuth->toUser('foo.bar.baz');
+
+ $this->assertFalse($user);
+ }
+
+ /** @test */
+ public function it_should_return_a_token_when_passing_a_user()
+ {
+ $this->manager->shouldReceive('getPayloadFactory->make')->once()->andReturn(Mockery::mock('Tymon\JWTAuth\Payload'));
+ $this->manager->shouldReceive('encode->get')->once()->andReturn('foo.bar.baz');
+
+ $token = $this->jwtAuth->fromUser((object) ['id' => 1]);
+
+ $this->assertEquals($token, 'foo.bar.baz');
+ }
+
+ /** @test */
+ public function it_should_return_a_token_when_passing_valid_credentials_to_attempt_method()
+ {
+ $this->manager->shouldReceive('getPayloadFactory->make')->once()->andReturn(Mockery::mock('Tymon\JWTAuth\Payload'));
+ $this->manager->shouldReceive('encode->get')->once()->andReturn('foo.bar.baz');
+
+ $this->auth->shouldReceive('byCredentials')->once()->andReturn(true);
+ $this->auth->shouldReceive('user')->once()->andReturn((object) ['id' => 1]);
+
+ $token = $this->jwtAuth->attempt();
+
+ $this->assertEquals($token, 'foo.bar.baz');
+ }
+
+ /** @test */
+ public function it_should_return_false_when_passing_invalid_credentials_to_attempt_method()
+ {
+ $this->manager->shouldReceive('encode->get')->never();
+ $this->auth->shouldReceive('byCredentials')->once()->andReturn(false);
+ $this->auth->shouldReceive('user')->never();
+
+ $token = $this->jwtAuth->attempt();
+
+ $this->assertFalse($token);
+ }
+
+ /** @test */
+ public function it_should_throw_an_exception_when_not_providing_a_token()
+ {
+ $this->setExpectedException('Tymon\JWTAuth\Exceptions\JWTException');
+
+ $this->jwtAuth->toUser();
+ }
+
+ /** @test */
+ public function it_should_return_the_owning_user_from_a_token_containing_an_existing_user()
+ {
+ $payload = Mockery::mock('Tymon\JWTAuth\Payload');
+ $payload->shouldReceive('get')->once()->with('sub')->andReturn(1);
+
+ $this->manager->shouldReceive('decode')->once()->andReturn($payload);
+
+ $this->auth->shouldReceive('byId')->once()->with(1)->andReturn(true);
+ $this->auth->shouldReceive('user')->once()->andReturn((object) ['id' => 1]);
+
+ $user = $this->jwtAuth->authenticate('foo.bar.baz');
+
+ $this->assertEquals($user->id, 1);
+ }
+
+ /** @test */
+ public function it_should_return_false_when_passing_a_token_not_containing_an_existing_user()
+ {
+ $payload = Mockery::mock('Tymon\JWTAuth\Payload');
+ $payload->shouldReceive('get')->once()->with('sub')->andReturn(1);
+
+ $this->manager->shouldReceive('decode')->once()->andReturn($payload);
+
+ $this->auth->shouldReceive('byId')->once()->with(1)->andReturn(false);
+ $this->auth->shouldReceive('user')->never();
+
+ $user = $this->jwtAuth->authenticate('foo.bar.baz');
+
+ $this->assertFalse($user);
+ }
+
+ /** @test */
+ public function it_should_refresh_a_token()
+ {
+ $newToken = Mockery::mock('Tymon\JWTAuth\Token');
+ $newToken->shouldReceive('get')->once()->andReturn('baz.bar.foo');
+
+ $this->manager->shouldReceive('refresh')->once()->andReturn($newToken);
+
+ $result = $this->jwtAuth->setToken('foo.bar.baz')->refresh();
+
+ $this->assertEquals($result, 'baz.bar.foo');
+ }
+
+ /** @test */
+ public function it_should_invalidate_a_token()
+ {
+ $this->manager->shouldReceive('invalidate')->once()->andReturn(true);
+
+ $result = $this->jwtAuth->invalidate('foo.bar.baz');
+
+ $this->assertTrue($result);
+ }
+
+ /** @test */
+ public function it_should_retrieve_the_token_from_the_auth_header()
+ {
+ $request = Request::create('/foo', 'GET');
+ $request->headers->set('authorization', 'Bearer foo.bar.baz');
+ $jwtAuth = new JWTAuth($this->manager, $this->user, $this->auth, $request);
+
+ $this->assertInstanceOf('Tymon\JWTAuth\Token', $jwtAuth->parseToken()->getToken());
+ $this->assertEquals($jwtAuth->getToken(), 'foo.bar.baz');
+ }
+
+ /** @test */
+ public function it_should_retrieve_the_token_from_the_query_string()
+ {
+ $request = Request::create('/foo', 'GET', ['token' => 'foo.bar.baz']);
+ $jwtAuth = new JWTAuth($this->manager, $this->user, $this->auth, $request);
+
+ $this->assertInstanceOf('Tymon\JWTAuth\Token', $jwtAuth->parseToken()->getToken());
+ $this->assertEquals($jwtAuth->getToken(), 'foo.bar.baz');
+ }
+
+ /** @test */
+ public function it_should_throw_an_exception_when_token_not_present_in_request()
+ {
+ $this->setExpectedException('Tymon\JWTAuth\Exceptions\JWTException');
+
+ $request = Request::create('/foo', 'GET');
+ $jwtAuth = new JWTAuth($this->manager, $this->user, $this->auth, $request);
+
+ $jwtAuth->parseToken();
+ }
+
+ /** @test */
+ public function it_should_return_false_when_no_token_is_set()
+ {
+ $this->assertFalse($this->jwtAuth->getToken());
+ }
+
+ /** @test */
+ public function it_should_set_the_identifier()
+ {
+ $this->jwtAuth->setIdentifier('foo');
+
+ $this->assertEquals($this->jwtAuth->getIdentifier(), 'foo');
+ }
+
+ /** @test */
+ public function it_should_magically_call_the_manager()
+ {
+ $this->manager->shouldReceive('getBlacklist')->andReturn(new \StdClass);
+
+ $blacklist = $this->jwtAuth->getBlacklist();
+
+ $this->assertInstanceOf('StdClass', $blacklist);
+ }
+
+ /** @test */
+ public function it_should_set_the_request()
+ {
+ $request = Request::create('/foo', 'GET', ['token' => 'some.random.token']);
+
+ $token = $this->jwtAuth->setRequest($request)->getToken();
+
+ $this->assertEquals('some.random.token', $token);
+ }
+
+ /** @test */
+ public function it_should_get_the_manager_instance()
+ {
+ $manager = $this->jwtAuth->manager();
+ $this->assertInstanceOf('Tymon\JWTAuth\JWTManager', $manager);
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/tests/JWTManagerTest.php b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/tests/JWTManagerTest.php
new file mode 100644
index 0000000..e3ad97d
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/tests/JWTManagerTest.php
@@ -0,0 +1,188 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Tymon\JWTAuth\Test\Providers\JWT;
+
+use Mockery;
+use Tymon\JWTAuth\Token;
+use Tymon\JWTAuth\Payload;
+use Tymon\JWTAuth\JWTManager;
+use Tymon\JWTAuth\Claims\JwtId;
+use Tymon\JWTAuth\Claims\Issuer;
+use Tymon\JWTAuth\Claims\Subject;
+use Tymon\JWTAuth\Claims\IssuedAt;
+use Tymon\JWTAuth\Claims\NotBefore;
+use Tymon\JWTAuth\Claims\Expiration;
+
+class JWTManagerTest extends \PHPUnit_Framework_TestCase
+{
+ public function setUp()
+ {
+ $this->jwt = Mockery::mock('Tymon\JWTAuth\Providers\JWT\JWTInterface');
+ $this->blacklist = Mockery::mock('Tymon\JWTAuth\Blacklist');
+ $this->factory = Mockery::mock('Tymon\JWTAuth\PayloadFactory');
+ $this->manager = new JWTManager($this->jwt, $this->blacklist, $this->factory);
+
+ $this->validator = Mockery::mock('Tymon\JWTAuth\Validators\PayloadValidator');
+ $this->validator->shouldReceive('setRefreshFlow->check');
+ }
+
+ public function tearDown()
+ {
+ Mockery::close();
+ }
+
+ /** @test */
+ public function it_should_encode_a_payload()
+ {
+ $claims = [
+ new Subject(1),
+ new Issuer('http://example.com'),
+ new Expiration(123 + 3600),
+ new NotBefore(123),
+ new IssuedAt(123),
+ new JwtId('foo'),
+ ];
+ $payload = new Payload($claims, $this->validator);
+
+ $this->jwt->shouldReceive('encode')->with($payload->toArray())->andReturn('foo.bar.baz');
+
+ $token = $this->manager->encode($payload);
+
+ $this->assertEquals($token, 'foo.bar.baz');
+ }
+
+ /** @test */
+ public function it_should_decode_a_token()
+ {
+ $claims = [
+ new Subject(1),
+ new Issuer('http://example.com'),
+ new Expiration(123 + 3600),
+ new NotBefore(123),
+ new IssuedAt(123),
+ new JwtId('foo'),
+ ];
+ $payload = new Payload($claims, $this->validator);
+ $token = new Token('foo.bar.baz');
+
+ $this->jwt->shouldReceive('decode')->once()->with('foo.bar.baz')->andReturn($payload->toArray());
+ $this->factory->shouldReceive('setRefreshFlow->make')->with($payload->toArray())->andReturn($payload);
+ $this->blacklist->shouldReceive('has')->with($payload)->andReturn(false);
+
+ $payload = $this->manager->decode($token);
+
+ $this->assertInstanceOf('Tymon\JWTAuth\Payload', $payload);
+ }
+
+ /** @test */
+ public function it_should_throw_exception_when_token_is_blacklisted()
+ {
+ $this->setExpectedException('Tymon\JWTAuth\Exceptions\TokenBlacklistedException');
+
+ $claims = [
+ new Subject(1),
+ new Issuer('http://example.com'),
+ new Expiration(123 + 3600),
+ new NotBefore(123),
+ new IssuedAt(123),
+ new JwtId('foo'),
+ ];
+ $payload = new Payload($claims, $this->validator);
+ $token = new Token('foo.bar.baz');
+
+ $this->jwt->shouldReceive('decode')->once()->with('foo.bar.baz')->andReturn($payload->toArray());
+ $this->factory->shouldReceive('setRefreshFlow->make')->with($payload->toArray())->andReturn($payload);
+ $this->blacklist->shouldReceive('has')->with($payload)->andReturn(true);
+
+ $this->manager->decode($token);
+ }
+
+ /** @test */
+ public function it_should_refresh_a_token()
+ {
+ $claims = [
+ new Subject(1),
+ new Issuer('http://example.com'),
+ new Expiration(123 - 3600),
+ new NotBefore(123),
+ new IssuedAt(123),
+ new JwtId('foo'),
+ ];
+ $payload = new Payload($claims, $this->validator, true);
+ $token = new Token('foo.bar.baz');
+
+ $this->jwt->shouldReceive('decode')->once()->with('foo.bar.baz')->andReturn($payload->toArray());
+ $this->jwt->shouldReceive('encode')->with($payload->toArray())->andReturn('baz.bar.foo');
+
+ $this->factory->shouldReceive('setRefreshFlow')->andReturn($this->factory);
+ $this->factory->shouldReceive('make')->andReturn($payload);
+
+ $this->blacklist->shouldReceive('has')->with($payload)->andReturn(false);
+ $this->blacklist->shouldReceive('add')->once()->with($payload);
+
+ $token = $this->manager->refresh($token);
+
+ $this->assertInstanceOf('Tymon\JWTAuth\Token', $token);
+ $this->assertEquals('baz.bar.foo', $token);
+ }
+
+ /** @test */
+ public function it_should_invalidate_a_token()
+ {
+ $claims = [
+ new Subject(1),
+ new Issuer('http://example.com'),
+ new Expiration(123 + 3600),
+ new NotBefore(123),
+ new IssuedAt(123),
+ new JwtId('foo'),
+ ];
+ $payload = new Payload($claims, $this->validator);
+ $token = new Token('foo.bar.baz');
+
+ $this->jwt->shouldReceive('decode')->once()->with('foo.bar.baz')->andReturn($payload->toArray());
+ $this->factory->shouldReceive('setRefreshFlow->make')->with($payload->toArray())->andReturn($payload);
+ $this->blacklist->shouldReceive('has')->with($payload)->andReturn(false);
+
+ $this->blacklist->shouldReceive('add')->with($payload)->andReturn(true);
+
+ $this->manager->invalidate($token);
+ }
+
+ /** @test */
+ public function it_should_throw_an_exception_when_enable_blacklist_is_set_to_false()
+ {
+ $this->setExpectedException('Tymon\JWTAuth\Exceptions\JWTException');
+
+ $token = new Token('foo.bar.baz');
+
+ $this->manager->setBlacklistEnabled(false)->invalidate($token);
+ }
+
+ /** @test */
+ public function it_should_get_the_payload_factory()
+ {
+ $this->assertInstanceOf('Tymon\JWTAuth\PayloadFactory', $this->manager->getPayloadFactory());
+ }
+
+ /** @test */
+ public function it_should_get_the_jwt_provider()
+ {
+ $this->assertInstanceOf('Tymon\JWTAuth\Providers\JWT\JWTInterface', $this->manager->getJWTProvider());
+ }
+
+ /** @test */
+ public function it_should_get_the_blacklist()
+ {
+ $this->assertInstanceOf('Tymon\JWTAuth\Blacklist', $this->manager->getBlacklist());
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/tests/Middleware/GetUserFromTokenTest.php b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/tests/Middleware/GetUserFromTokenTest.php
new file mode 100644
index 0000000..afb18ea
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/tests/Middleware/GetUserFromTokenTest.php
@@ -0,0 +1,108 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Tymon\JWTAuth\Test;
+
+use Mockery;
+use Tymon\JWTAuth\Middleware\GetUserFromToken;
+use Tymon\JWTAuth\Exceptions\TokenExpiredException;
+use Tymon\JWTAuth\Exceptions\TokenInvalidException;
+
+class GetUserFromTokenTest extends \PHPUnit_Framework_TestCase
+{
+ public function setUp()
+ {
+ $this->events = Mockery::mock('Illuminate\Contracts\Events\Dispatcher');
+ $this->auth = Mockery::mock('Tymon\JWTAuth\JWTAuth');
+
+ $this->request = Mockery::mock('Illuminate\Http\Request');
+ $this->response = Mockery::mock('Illuminate\Contracts\Routing\ResponseFactory');
+
+ $this->middleware = new GetUserFromToken($this->response, $this->events, $this->auth);
+
+ $this->auth->shouldReceive('setRequest')->once()->with($this->request)->andReturn($this->auth);
+ }
+
+ public function tearDown()
+ {
+ Mockery::close();
+ }
+
+ /** @test */
+ public function it_should_fire_an_event_when_no_token_is_available()
+ {
+ $this->auth->shouldReceive('getToken')->once()->andReturn(false);
+
+ $this->events->shouldReceive('fire')->once()->with('tymon.jwt.absent', [], true);
+ $this->response->shouldReceive('json')->with(['error' => 'token_not_provided'], 400);
+
+ $this->middleware->handle($this->request, function () {
+ });
+ }
+
+ /** @test */
+ public function it_should_fire_an_event_when_the_token_has_expired()
+ {
+ $exception = new TokenExpiredException;
+
+ $this->auth->shouldReceive('getToken')->once()->andReturn('foo');
+ $this->auth->shouldReceive('authenticate')->once()->with('foo')->andThrow($exception);
+
+ $this->events->shouldReceive('fire')->once()->with('tymon.jwt.expired', [$exception], true);
+ $this->response->shouldReceive('json')->with(['error' => 'token_expired'], 401);
+
+ $this->middleware->handle($this->request, function () {
+ });
+ }
+
+ /** @test */
+ public function it_should_fire_an_event_when_the_token_is_invalid()
+ {
+ $exception = new TokenInvalidException;
+
+ $this->auth->shouldReceive('getToken')->once()->andReturn('foo');
+ $this->auth->shouldReceive('authenticate')->once()->with('foo')->andThrow($exception);
+
+ $this->events->shouldReceive('fire')->once()->with('tymon.jwt.invalid', [$exception], true);
+ $this->response->shouldReceive('json')->with(['error' => 'token_invalid'], 400);
+
+ $this->middleware->handle($this->request, function () {
+ });
+ }
+
+ /** @test */
+ public function it_should_fire_an_event_when_no_user_is_found()
+ {
+ $this->auth->shouldReceive('getToken')->once()->andReturn('foo');
+ $this->auth->shouldReceive('authenticate')->once()->with('foo')->andReturn(false);
+
+ $this->events->shouldReceive('fire')->once()->with('tymon.jwt.user_not_found', [], true);
+ $this->response->shouldReceive('json')->with(['error' => 'user_not_found'], 404);
+
+ $this->middleware->handle($this->request, function () {
+ });
+ }
+
+ /** @test */
+ public function it_should_fire_an_event_when_the_token_has_been_decoded_and_user_is_found()
+ {
+ $user = (object) ['id' => 1];
+
+ $this->auth->shouldReceive('getToken')->once()->andReturn('foo');
+ $this->auth->shouldReceive('authenticate')->once()->with('foo')->andReturn($user);
+
+ $this->events->shouldReceive('fire')->once()->with('tymon.jwt.valid', $user);
+ $this->response->shouldReceive('json')->never();
+
+ $this->middleware->handle($this->request, function () {
+ });
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/tests/PayloadFactoryTest.php b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/tests/PayloadFactoryTest.php
new file mode 100644
index 0000000..f25d6cc
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/tests/PayloadFactoryTest.php
@@ -0,0 +1,136 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Tymon\JWTAuth\Test\Providers\JWT;
+
+use Mockery;
+use Carbon\Carbon;
+use Illuminate\Http\Request;
+use Tymon\JWTAuth\Claims\JwtId;
+use Tymon\JWTAuth\Claims\Custom;
+use Tymon\JWTAuth\Claims\Issuer;
+use Tymon\JWTAuth\Claims\Subject;
+use Tymon\JWTAuth\PayloadFactory;
+use Tymon\JWTAuth\Claims\IssuedAt;
+use Tymon\JWTAuth\Claims\NotBefore;
+use Tymon\JWTAuth\Claims\Expiration;
+
+class PayloadFactoryTest extends \PHPUnit_Framework_TestCase
+{
+ public function setUp()
+ {
+ Carbon::setTestNow(Carbon::createFromTimeStampUTC(123));
+
+ $this->claimFactory = Mockery::mock('Tymon\JWTAuth\Claims\Factory');
+ $this->validator = Mockery::mock('Tymon\JWTAuth\Validators\PayloadValidator');
+ $this->factory = new PayloadFactory($this->claimFactory, Request::create('/foo', 'GET'), $this->validator);
+ }
+
+ public function tearDown()
+ {
+ Mockery::close();
+ }
+
+ /** @test */
+ public function it_should_return_a_payload_when_passing_an_array_of_claims_to_make_method()
+ {
+ $this->validator->shouldReceive('setRefreshFlow->check');
+
+ $expTime = 123 + 3600;
+
+ $this->claimFactory->shouldReceive('get')->once()->with('sub', 1)->andReturn(new Subject(1));
+ $this->claimFactory->shouldReceive('get')->once()->with('iss', Mockery::any())->andReturn(new Issuer('/foo'));
+ $this->claimFactory->shouldReceive('get')->once()->with('iat', 123)->andReturn(new IssuedAt(123));
+ $this->claimFactory->shouldReceive('get')->once()->with('jti', 'foo')->andReturn(new JwtId('foo'));
+ $this->claimFactory->shouldReceive('get')->once()->with('nbf', 123)->andReturn(new NotBefore(123));
+ $this->claimFactory->shouldReceive('get')->once()->with('exp', $expTime)->andReturn(new Expiration($expTime));
+
+ $payload = $this->factory->make(['sub' => 1, 'jti' => 'foo', 'iat' => 123]);
+
+ $this->assertEquals($payload->get('sub'), 1);
+ $this->assertEquals($payload->get('iat'), 123);
+ $this->assertEquals($payload['exp'], $expTime);
+
+ $this->assertInstanceOf('Tymon\JWTAuth\Payload', $payload);
+ }
+
+ /** @test **/
+ public function it_should_check_custom_claim_keys_accurately_and_accept_numeric_claims()
+ {
+ $this->validator->shouldReceive('setRefreshFlow->check');
+
+ $this->claimFactory->shouldReceive('get')->once()->with('iss', Mockery::any())->andReturn(new Issuer('/foo'));
+ $this->claimFactory->shouldReceive('get')->once()->with('exp', 123 + 3600)->andReturn(new Expiration(123 + 3600));
+ $this->claimFactory->shouldReceive('get')->once()->with('iat', 123)->andReturn(new IssuedAt(123));
+ $this->claimFactory->shouldReceive('get')->once()->with('jti', Mockery::any())->andReturn(new JwtId('foo'));
+ $this->claimFactory->shouldReceive('get')->once()->with('nbf', 123)->andReturn(new NotBefore(123));
+ $this->claimFactory->shouldReceive('get')->once()->with(1, 'claim one')->andReturn(new Custom(1, 'claim one'));
+
+ $payload = $this->factory->make([1 => 'claim one']);
+
+ // if the checker doesn't compare defaults properly, numeric-keyed claims might be ignored
+ $this->assertEquals('claim one', $payload->get(1));
+ // iat is $defaultClaims[1], so verify it wasn't skipped due to a bad k-v comparison
+ $this->assertEquals(123, $payload->get('iat'));
+ }
+
+ /** @test */
+ public function it_should_return_a_payload_when_chaining_claim_methods()
+ {
+ $this->validator->shouldReceive('setRefreshFlow->check');
+
+ $this->claimFactory->shouldReceive('get')->once()->with('sub', 1)->andReturn(new Subject(1));
+ $this->claimFactory->shouldReceive('get')->once()->with('iss', Mockery::any())->andReturn(new Issuer('/foo'));
+ $this->claimFactory->shouldReceive('get')->once()->with('exp', 123 + 3600)->andReturn(new Expiration(123 + 3600));
+ $this->claimFactory->shouldReceive('get')->once()->with('iat', 123)->andReturn(new IssuedAt(123));
+ $this->claimFactory->shouldReceive('get')->once()->with('jti', Mockery::any())->andReturn(new JwtId('foo'));
+ $this->claimFactory->shouldReceive('get')->once()->with('nbf', 123)->andReturn(new NotBefore(123));
+ $this->claimFactory->shouldReceive('get')->once()->with('foo', 'baz')->andReturn(new Custom('foo', 'baz'));
+
+ $payload = $this->factory->sub(1)->foo('baz')->make();
+
+ $this->assertEquals($payload['sub'], 1);
+ $this->assertEquals($payload->get('jti'), 'foo');
+ $this->assertEquals($payload->get('foo'), 'baz');
+
+ $this->assertInstanceOf('Tymon\JWTAuth\Payload', $payload);
+ }
+
+ /** @test */
+ public function it_should_return_a_payload_when_passing_miltidimensional_claims()
+ {
+ $this->validator->shouldReceive('setRefreshFlow->check');
+ $userObject = ['name' => 'example'];
+
+ $this->claimFactory->shouldReceive('get')->once()->with('sub', $userObject)->andReturn(new Subject($userObject));
+ $this->claimFactory->shouldReceive('get')->once()->with('iss', Mockery::any())->andReturn(new Issuer('/foo'));
+ $this->claimFactory->shouldReceive('get')->once()->with('exp', Mockery::any())->andReturn(new Expiration(123 + 3600));
+ $this->claimFactory->shouldReceive('get')->once()->with('iat', Mockery::any())->andReturn(new IssuedAt(123));
+ $this->claimFactory->shouldReceive('get')->once()->with('jti', Mockery::any())->andReturn(new JwtId('foo'));
+ $this->claimFactory->shouldReceive('get')->once()->with('nbf', Mockery::any())->andReturn(new NotBefore(123));
+ $this->claimFactory->shouldReceive('get')->once()->with('foo', ['bar' => [0, 0, 0]])->andReturn(new Custom('foo', ['bar' => [0, 0, 0]]));
+
+ $payload = $this->factory->sub($userObject)->foo(['bar' => [0, 0, 0]])->make();
+
+ $this->assertEquals($payload->get('sub'), $userObject);
+ $this->assertEquals($payload->get('foo'), ['bar' => [0, 0, 0]]);
+
+ $this->assertInstanceOf('Tymon\JWTAuth\Payload', $payload);
+ }
+
+ /** @test */
+ public function it_should_set_the_ttl()
+ {
+ $this->factory->setTTL(12345);
+
+ $this->assertEquals($this->factory->getTTL(), 12345);
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/tests/PayloadTest.php b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/tests/PayloadTest.php
new file mode 100644
index 0000000..42ae69b
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/tests/PayloadTest.php
@@ -0,0 +1,136 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Tymon\JWTAuth\Test\Providers\JWT;
+
+use Mockery;
+use Carbon\Carbon;
+use Tymon\JWTAuth\Payload;
+use Tymon\JWTAuth\Claims\JwtId;
+use Tymon\JWTAuth\Claims\Issuer;
+use Tymon\JWTAuth\Claims\Subject;
+use Tymon\JWTAuth\Claims\Audience;
+use Tymon\JWTAuth\Claims\IssuedAt;
+use Tymon\JWTAuth\Claims\NotBefore;
+use Tymon\JWTAuth\Claims\Expiration;
+
+class PayloadTest extends \PHPUnit_Framework_TestCase
+{
+ public function setUp()
+ {
+ Carbon::setTestNow(Carbon::createFromTimeStampUTC(123));
+
+ $claims = [
+ new Subject(1),
+ new Issuer('http://example.com'),
+ new Expiration(123 + 3600),
+ new NotBefore(123),
+ new IssuedAt(123),
+ new JwtId('foo'),
+ ];
+
+ $this->validator = Mockery::mock('Tymon\JWTAuth\Validators\PayloadValidator');
+ $this->validator->shouldReceive('setRefreshFlow->check');
+
+ $this->payload = new Payload($claims, $this->validator);
+ }
+
+ public function tearDown()
+ {
+ Mockery::close();
+ }
+
+ /** @test */
+ public function it_throws_an_exception_when_trying_to_add_to_the_payload()
+ {
+ $this->setExpectedException('Tymon\JWTAuth\Exceptions\PayloadException');
+
+ $this->payload['foo'] = 'bar';
+ }
+
+ /** @test */
+ public function it_throws_an_exception_when_trying_to_remove_a_key_from_the_payload()
+ {
+ $this->setExpectedException('Tymon\JWTAuth\Exceptions\PayloadException');
+
+ unset($this->payload['foo']);
+ }
+
+ /** @test */
+ public function it_should_cast_the_payload_to_a_string_as_json()
+ {
+ $this->assertEquals((string) $this->payload, json_encode($this->payload->get()));
+ $this->assertJsonStringEqualsJsonString((string) $this->payload, json_encode($this->payload->get()));
+ }
+
+ /** @test */
+ public function it_should_allow_array_access_on_the_payload()
+ {
+ $this->assertTrue(isset($this->payload['iat']));
+ $this->assertEquals($this->payload['sub'], 1);
+ $this->assertArrayHasKey('exp', $this->payload);
+ }
+
+ /** @test */
+ public function it_should_get_properties_of_payload_via_get_method()
+ {
+ $this->assertInternalType('array', $this->payload->get());
+ $this->assertEquals($this->payload->get('sub'), 1);
+ }
+
+ /** @test */
+ public function it_should_get_multiple_properties_when_passing_an_array_to_the_get_method()
+ {
+ $values = $this->payload->get(['sub', 'jti']);
+
+ list($sub, $jti) = $values;
+
+ $this->assertInternalType('array', $values);
+ $this->assertEquals($sub, 1);
+ $this->assertEquals($jti, 'foo');
+ }
+
+ /** @test */
+ public function it_should_determine_whether_the_payload_has_a_claim()
+ {
+ $this->assertTrue($this->payload->has(new Subject(1)));
+ $this->assertFalse($this->payload->has(new Audience(1)));
+ }
+
+ /** @test */
+ public function it_should_magically_get_a_property()
+ {
+ $sub = $this->payload->getSubject();
+ $jti = $this->payload->getJwtId();
+ $iss = $this->payload->getIssuer();
+
+ $this->assertEquals($sub, 1);
+ $this->assertEquals($jti, 'foo');
+ $this->assertEquals($iss, 'http://example.com');
+ }
+
+ /** @test */
+ public function it_should_throw_an_exception_when_magically_getting_a_property_that_does_not_exist()
+ {
+ $this->setExpectedException('\BadMethodCallException');
+
+ $this->payload->getFoo();
+ }
+
+ /** @test */
+ public function it_should_get_the_claims()
+ {
+ $claims = $this->payload->getClaims();
+
+ $this->assertInstanceOf('Tymon\JWTAuth\Claims\Expiration', $claims[2]);
+ $this->assertInstanceOf('Tymon\JWTAuth\Claims\JwtId', $claims[5]);
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/tests/Providers/Auth/IlluminateAuthAdapterTest.php b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/tests/Providers/Auth/IlluminateAuthAdapterTest.php
new file mode 100644
index 0000000..3230dcc
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/tests/Providers/Auth/IlluminateAuthAdapterTest.php
@@ -0,0 +1,65 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Tymon\JWTAuth\Test\Providers\Auth;
+
+use Mockery;
+use Tymon\JWTAuth\Providers\Auth\IlluminateAuthAdapter;
+
+class IlluminateAuthAdapterTest extends \PHPUnit_Framework_TestCase
+{
+ public function setUp()
+ {
+ $this->authManager = Mockery::mock('Illuminate\Auth\AuthManager');
+ $this->auth = new IlluminateAuthAdapter($this->authManager);
+ }
+
+ public function tearDown()
+ {
+ Mockery::close();
+ }
+
+ /** @test */
+ public function it_should_return_true_if_credentials_are_valid()
+ {
+ $this->authManager->shouldReceive('once')->once()->with(['email' => 'foo@bar.com', 'password' => 'foobar'])->andReturn(true);
+ $this->assertTrue($this->auth->byCredentials(['email' => 'foo@bar.com', 'password' => 'foobar']));
+ }
+
+ /** @test */
+ public function it_should_return_true_if_user_is_found()
+ {
+ $this->authManager->shouldReceive('onceUsingId')->once()->with(123)->andReturn(true);
+ $this->assertTrue($this->auth->byId(123));
+ }
+
+ /** @test */
+ public function it_should_return_false_if_user_is_not_found()
+ {
+ $this->authManager->shouldReceive('onceUsingId')->once()->with(123)->andReturn(false);
+ $this->assertFalse($this->auth->byId(123));
+ }
+
+ /** @test */
+ public function it_should_bubble_exceptions_from_auth()
+ {
+ $this->authManager->shouldReceive('onceUsingId')->once()->with(123)->andThrow(new \Exception('Some auth failure'));
+ $this->setExpectedException('Exception', 'Some auth failure');
+ $this->auth->byId(123);
+ }
+
+ /** @test */
+ public function it_should_return_the_currently_authenticated_user()
+ {
+ $this->authManager->shouldReceive('user')->once()->andReturn((object) ['id' => 1]);
+ $this->assertEquals($this->auth->user()->id, 1);
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/tests/Providers/JWT/JWTProviderTest.php b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/tests/Providers/JWT/JWTProviderTest.php
new file mode 100644
index 0000000..227afdb
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/tests/Providers/JWT/JWTProviderTest.php
@@ -0,0 +1,36 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Tymon\JWTAuth\Test\Providers\JWT;
+
+use Mockery;
+use Tymon\JWTAuth\Test\Stubs\JWTProviderStub;
+
+class JWTProviderTest extends \PHPUnit_Framework_TestCase
+{
+ public function setUp()
+ {
+ $this->provider = new JWTProviderStub('secret', 'HS256');
+ }
+
+ public function tearDown()
+ {
+ Mockery::close();
+ }
+
+ /** @test */
+ public function it_should_set_the_algo()
+ {
+ $this->provider->setAlgo('HS512');
+
+ $this->assertEquals('HS512', $this->provider->getAlgo());
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/tests/Providers/JWT/NamshiAdapterTest.php b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/tests/Providers/JWT/NamshiAdapterTest.php
new file mode 100644
index 0000000..2f4be91
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/tests/Providers/JWT/NamshiAdapterTest.php
@@ -0,0 +1,77 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Tymon\JWTAuth\Test\Providers\JWT;
+
+use Mockery;
+use Carbon\Carbon;
+use Tymon\JWTAuth\Providers\JWT\NamshiAdapter;
+
+class NamshiAdapterTest extends \PHPUnit_Framework_TestCase
+{
+ public function setUp()
+ {
+ Carbon::setTestNow(Carbon::createFromTimeStampUTC(123));
+
+ $this->jws = Mockery::mock('Namshi\JOSE\JWS');
+ $this->provider = new NamshiAdapter('secret', 'HS256', $this->jws);
+ }
+
+ public function tearDown()
+ {
+ Mockery::close();
+ }
+
+ /** @test */
+ public function it_should_return_the_token_when_passing_a_valid_subject_to_encode()
+ {
+ $payload = ['sub' => 1, 'exp' => 123, 'iat' => 123, 'iss' => '/foo'];
+
+ $this->jws->shouldReceive('setPayload')->once()->with($payload)->andReturn(Mockery::self());
+ $this->jws->shouldReceive('sign')->once()->with('secret')->andReturn(Mockery::self());
+ $this->jws->shouldReceive('getTokenString')->once()->andReturn('foo.bar.baz');
+
+ $token = $this->provider->encode($payload);
+
+ $this->assertEquals('foo.bar.baz', $token);
+ }
+
+ /** @test */
+ public function it_should_throw_an_invalid_exception_when_the_payload_could_not_be_encoded()
+ {
+ $this->setExpectedException('Tymon\JWTAuth\Exceptions\JWTException');
+
+ $this->jws->shouldReceive('sign')->andThrow(new \Exception);
+
+ $payload = ['sub' => 1, 'exp' => 123, 'iat' => 123, 'iss' => '/foo'];
+ $this->provider->encode($payload);
+ }
+
+ /** @test */
+ // public function it_should_return_the_payload_when_passing_a_valid_token_to_decode()
+ // {
+ // $this->jws->shouldReceive('load')->once()->with('foo.bar.baz')->andReturn(true);
+ // $this->jws->shouldReceive('verify')->andReturn(true);
+
+ // $payload = $this->provider->decode('foo.bar.baz');
+
+ // }
+
+ /** @test */
+ public function it_should_throw_a_token_invalid_exception_when_the_token_could_not_be_decoded()
+ {
+ $this->setExpectedException('Tymon\JWTAuth\Exceptions\TokenInvalidException');
+
+ $this->jws->shouldReceive('verify')->andReturn(false);
+
+ $token = $this->provider->decode('foo');
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/tests/Providers/Storage/IlluminateCacheAdapterTest.php b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/tests/Providers/Storage/IlluminateCacheAdapterTest.php
new file mode 100644
index 0000000..26bc40f
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/tests/Providers/Storage/IlluminateCacheAdapterTest.php
@@ -0,0 +1,63 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Tymon\JWTAuth\Test\Providers\Storage;
+
+use Mockery;
+use Tymon\JWTAuth\Providers\Storage\IlluminateCacheAdapter;
+
+class IlluminateCacheAdapterTest extends \PHPUnit_Framework_TestCase
+{
+ public function setUp()
+ {
+ $this->cache = Mockery::mock('Illuminate\Cache\CacheManager');
+ $this->storage = new IlluminateCacheAdapter($this->cache);
+
+ $this->cache->shouldReceive('tags')->andReturn(Mockery::self());
+ }
+
+ public function tearDown()
+ {
+ Mockery::close();
+ }
+
+ /** @test */
+ public function it_should_add_the_item_to_storage()
+ {
+ $this->cache->shouldReceive('tags->put')->with('foo', 'bar', 10);
+
+ $this->storage->add('foo', 'bar', 10);
+ }
+
+ /** @test */
+ public function it_should_check_if_the_item_exists_in_storage()
+ {
+ $this->cache->shouldReceive('tags->has')->with('foo')->andReturn(true);
+
+ $this->assertTrue($this->storage->has('foo'));
+ }
+
+ /** @test */
+ public function it_should_remove_the_item_from_storage()
+ {
+ $this->cache->shouldReceive('tags->forget')->with('foo')->andReturn(true);
+
+ $this->assertTrue($this->storage->destroy('foo'));
+ }
+
+ /** @test */
+ public function it_should_remove_all_items_from_storage()
+ {
+ $this->cache->shouldReceive('tags->flush')->withNoArgs();
+
+ $this->storage->flush();
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/tests/Providers/User/EloquentUserAdapterTest.php b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/tests/Providers/User/EloquentUserAdapterTest.php
new file mode 100644
index 0000000..233a377
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/tests/Providers/User/EloquentUserAdapterTest.php
@@ -0,0 +1,41 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Tymon\JWTAuth\Test\Providers\User;
+
+use Mockery;
+use Tymon\JWTAuth\Providers\User\EloquentUserAdapter;
+
+class EloquentUserAdapterTest extends \PHPUnit_Framework_TestCase
+{
+ public function setUp()
+ {
+ $this->builder = Mockery::mock('Illuminate\Database\Query\Builder');
+ $this->model = Mockery::mock('Illuminate\Database\Eloquent\Model');
+ $this->user = new EloquentUserAdapter($this->model);
+ }
+
+ public function tearDown()
+ {
+ Mockery::close();
+ }
+
+ /** @test */
+ public function it_should_return_the_user_if_found()
+ {
+ $this->builder->shouldReceive('first')->once()->withNoArgs()->andReturn((object) ['id' => 1]);
+ $this->model->shouldReceive('where')->once()->with('foo', 'bar')->andReturn($this->builder);
+
+ $user = $this->user->getBy('foo', 'bar');
+
+ $this->assertEquals(1, $user->id);
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/tests/Stubs/JWTProviderStub.php b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/tests/Stubs/JWTProviderStub.php
new file mode 100644
index 0000000..f05ec18
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/tests/Stubs/JWTProviderStub.php
@@ -0,0 +1,18 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Tymon\JWTAuth\Test\Stubs;
+
+use Tymon\JWTAuth\Providers\JWT\JWTProvider;
+
+class JWTProviderStub extends JWTProvider
+{
+}
diff --git a/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/tests/TokenTest.php b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/tests/TokenTest.php
new file mode 100644
index 0000000..c105dff
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/tests/TokenTest.php
@@ -0,0 +1,34 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Tymon\JWTAuth\Test\Providers\JWT;
+
+use Tymon\JWTAuth\Token;
+
+class TokenTest extends \PHPUnit_Framework_TestCase
+{
+ public function setUp()
+ {
+ $this->token = new Token('foo.bar.baz');
+ }
+
+ /** @test */
+ public function it_should_return_the_token_when_casting_to_a_string()
+ {
+ $this->assertEquals((string) $this->token, $this->token);
+ }
+
+ /** @test */
+ public function it_should_return_the_token_when_calling_get_method()
+ {
+ $this->assertInternalType('string', $this->token->get());
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/tests/Validators/PayloadValidatorTest.php b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/tests/Validators/PayloadValidatorTest.php
new file mode 100644
index 0000000..a0cb7df
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/tests/Validators/PayloadValidatorTest.php
@@ -0,0 +1,142 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Tymon\JWTAuth\Test;
+
+use Carbon\Carbon;
+use Tymon\JWTAuth\Validators\PayloadValidator;
+
+class PayloadValidatorTest extends \PHPUnit_Framework_TestCase
+{
+ public function setUp()
+ {
+ Carbon::setTestNow(Carbon::createFromTimeStampUTC(123));
+ $this->validator = new PayloadValidator();
+ }
+
+ /** @test */
+ public function it_should_return_true_when_providing_a_valid_payload()
+ {
+ $payload = [
+ 'iss' => 'http://example.com',
+ 'iat' => 100,
+ 'nbf' => 100,
+ 'exp' => 100 + 3600,
+ 'sub' => 1,
+ 'jti' => 'foo',
+ ];
+
+ $this->assertTrue($this->validator->isValid($payload));
+ }
+
+ /** @test */
+ public function it_should_throw_an_exception_when_providing_an_expired_payload()
+ {
+ $this->setExpectedException('Tymon\JWTAuth\Exceptions\TokenExpiredException');
+
+ $payload = [
+ 'iss' => 'http://example.com',
+ 'iat' => 20,
+ 'nbf' => 20,
+ 'exp' => 120,
+ 'sub' => 1,
+ 'jti' => 'foo',
+ ];
+
+ $this->validator->check($payload);
+ }
+
+ /** @test */
+ public function it_should_throw_an_exception_when_providing_an_invalid_nbf_claim()
+ {
+ $this->setExpectedException('Tymon\JWTAuth\Exceptions\TokenInvalidException');
+
+ $payload = [
+ 'iss' => 'http://example.com',
+ 'iat' => 100,
+ 'nbf' => 150,
+ 'exp' => 150 + 3600,
+ 'sub' => 1,
+ 'jti' => 'foo',
+ ];
+
+ $this->validator->check($payload);
+ }
+
+ /** @test */
+ public function it_should_throw_an_exception_when_providing_an_invalid_iat_claim()
+ {
+ $this->setExpectedException('Tymon\JWTAuth\Exceptions\TokenInvalidException');
+
+ $payload = [
+ 'iss' => 'http://example.com',
+ 'iat' => 150,
+ 'nbf' => 100,
+ 'exp' => 150 + 3600,
+ 'sub' => 1,
+ 'jti' => 'foo',
+ ];
+
+ $this->validator->check($payload);
+ }
+
+ /** @test */
+ public function it_should_throw_an_exception_when_providing_an_invalid_payload()
+ {
+ $this->setExpectedException('Tymon\JWTAuth\Exceptions\TokenInvalidException');
+
+ $payload = [
+ 'iss' => 'http://example.com',
+ 'sub' => 1,
+ ];
+
+ $this->validator->check($payload);
+ }
+
+ /** @test */
+ public function it_should_throw_an_exception_when_providing_an_invalid_expiry()
+ {
+ $this->setExpectedException('Tymon\JWTAuth\Exceptions\TokenInvalidException');
+
+ $payload = [
+ 'iss' => 'http://example.com',
+ 'iat' => 100,
+ 'exp' => 'foo',
+ 'sub' => 1,
+ 'jti' => 'foo',
+ ];
+
+ $this->validator->check($payload);
+ }
+
+ /** @test **/
+ public function it_should_throw_an_exception_when_required_claims_are_missing()
+ {
+ $this->setExpectedException('Tymon\JWTAuth\Exceptions\TokenInvalidException');
+
+ $payload = [
+ 'iss' => 'http://example.com',
+ 'foo' => 'bar',
+ // these are inserted to check for regression to a previous bug
+ // where the check would only compare keys of autoindexed name arrays
+ // (There are enough to account for all of the required claims' indices)
+ 'autoindexed',
+ 'autoindexed',
+ 'autoindexed',
+ 'autoindexed',
+ 'autoindexed',
+ 'autoindexed',
+ 'autoindexed',
+ ];
+
+ $this->validator->check($payload);
+ }
+}
diff --git a/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/tests/Validators/TokenValidatorTest.php b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/tests/Validators/TokenValidatorTest.php
new file mode 100644
index 0000000..eb18ebb
--- /dev/null
+++ b/plugins/vdomah/jwtauth/vendor/tymon/jwt-auth/tests/Validators/TokenValidatorTest.php
@@ -0,0 +1,42 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Tymon\JWTAuth\Test;
+
+use Tymon\JWTAuth\Validators\TokenValidator;
+
+class TokenValidatorTest extends \PHPUnit_Framework_TestCase
+{
+ public function setUp()
+ {
+ $this->validator = new TokenValidator();
+ }
+
+ /** @test */
+ public function it_should_return_true_when_providing_a_well_formed_token()
+ {
+ $this->assertTrue($this->validator->isValid('one.two.three'));
+ }
+
+ /** @test */
+ public function it_should_return_false_when_providing_a_malformed_token()
+ {
+ $this->assertFalse($this->validator->isValid('one.two.three.four.five'));
+ }
+
+ /** @test */
+ public function it_should_throw_an_axception_when_providing_a_malformed_token()
+ {
+ $this->setExpectedException('Tymon\JWTAuth\Exceptions\TokenInvalidException');
+
+ $this->validator->check('one.two.three.four.five');
+ }
+}
diff --git a/plugins/vdomah/jwtauth/views/_btn_generate.htm b/plugins/vdomah/jwtauth/views/_btn_generate.htm
new file mode 100644
index 0000000..00010c8
--- /dev/null
+++ b/plugins/vdomah/jwtauth/views/_btn_generate.htm
@@ -0,0 +1,21 @@
+
+
+
\ No newline at end of file