opltypes/states.rs
1//! Data types for the MeetState column.
2
3use serde::de::{self, Deserialize, Visitor};
4use serde::ser::Serialize;
5use strum::ParseError;
6
7use std::fmt;
8
9use crate::Country;
10
11/// The State column.
12#[derive(Copy, Clone, Debug, PartialEq)]
13pub enum State {
14 InArgentina(ArgentinaState),
15 InAustralia(AustraliaState),
16 InBrazil(BrazilState),
17 InCanada(CanadaState),
18 InChina(ChinaState),
19 InEngland(EnglandState),
20 InGermany(GermanyState),
21 InIndia(IndiaState),
22 InMexico(MexicoState),
23 InNetherlands(NetherlandsState),
24 InNewZealand(NewZealandState),
25 InRomania(RomaniaState),
26 InRussia(RussiaState),
27 InSouthAfrica(SouthAfricaState),
28 InUSA(USAState),
29}
30
31impl State {
32 /// Constructs a State for a specific Country.
33 ///
34 /// This is how the checker interprets the State column.
35 ///
36 /// # Examples
37 ///
38 /// ```
39 /// # use opltypes::Country;
40 /// # use opltypes::states::{State, USAState};
41 /// let state = State::from_str_and_country("NY", Country::USA).unwrap();
42 /// assert_eq!(state, State::InUSA(USAState::NY));
43 /// ```
44 pub fn from_str_and_country(s: &str, country: Country) -> Result<State, ParseError> {
45 match country {
46 Country::Argentina => Ok(State::InArgentina(s.parse::<ArgentinaState>()?)),
47 Country::Australia => Ok(State::InAustralia(s.parse::<AustraliaState>()?)),
48 Country::Brazil => Ok(State::InBrazil(s.parse::<BrazilState>()?)),
49 Country::Canada => Ok(State::InCanada(s.parse::<CanadaState>()?)),
50 Country::China => Ok(State::InChina(s.parse::<ChinaState>()?)),
51 Country::England => Ok(State::InEngland(s.parse::<EnglandState>()?)),
52 Country::Germany => Ok(State::InGermany(s.parse::<GermanyState>()?)),
53 Country::India => Ok(State::InIndia(s.parse::<IndiaState>()?)),
54 Country::Mexico => Ok(State::InMexico(s.parse::<MexicoState>()?)),
55 Country::Netherlands => Ok(State::InNetherlands(s.parse::<NetherlandsState>()?)),
56 Country::NewZealand => Ok(State::InNewZealand(s.parse::<NewZealandState>()?)),
57 Country::Romania => Ok(State::InRomania(s.parse::<RomaniaState>()?)),
58 Country::Russia => Ok(State::InRussia(s.parse::<RussiaState>()?)),
59 Country::SouthAfrica => Ok(State::InSouthAfrica(s.parse::<SouthAfricaState>()?)),
60 Country::USA => Ok(State::InUSA(s.parse::<USAState>()?)),
61 _ => Err(ParseError::VariantNotFound),
62 }
63 }
64
65 /// Constructs a State given a full, unambiguous code like "USA-NY".
66 ///
67 /// This is how the server interprets the State column.
68 /// Codes of this format are the result of serializing a State value.
69 ///
70 /// # Examples
71 ///
72 /// ```
73 /// # use opltypes::Country;
74 /// # use opltypes::states::{State, USAState};
75 /// let state = State::from_full_code("USA-NY").unwrap();
76 /// assert_eq!(state, State::InUSA(USAState::NY));
77 /// ```
78 pub fn from_full_code(s: &str) -> Result<State, ParseError> {
79 // The codes are of the form "{Country}-{State}".
80 let parts: Vec<&str> = s.split('-').collect();
81 if parts.len() != 2 {
82 return Err(ParseError::VariantNotFound);
83 }
84
85 let country: Country = parts[0].parse::<Country>()?;
86 Self::from_str_and_country(parts[1], country)
87 }
88
89 /// Returns the Country for the given State.
90 ///
91 /// # Examples
92 ///
93 /// ```
94 /// # use opltypes::Country;
95 /// # use opltypes::states::{State, USAState};
96 /// let state = State::from_full_code("USA-NY").unwrap();
97 /// assert_eq!(state.to_country(), Country::USA);
98 /// ```
99 pub fn to_country(self) -> Country {
100 match self {
101 State::InArgentina(_) => Country::Argentina,
102 State::InAustralia(_) => Country::Australia,
103 State::InBrazil(_) => Country::Brazil,
104 State::InCanada(_) => Country::Canada,
105 State::InChina(_) => Country::China,
106 State::InEngland(_) => Country::England,
107 State::InGermany(_) => Country::Germany,
108 State::InIndia(_) => Country::India,
109 State::InMexico(_) => Country::Mexico,
110 State::InNetherlands(_) => Country::Netherlands,
111 State::InNewZealand(_) => Country::NewZealand,
112 State::InRomania(_) => Country::Romania,
113 State::InRussia(_) => Country::Russia,
114 State::InSouthAfrica(_) => Country::SouthAfrica,
115 State::InUSA(_) => Country::USA,
116 }
117 }
118
119 /// Returns a String describing just the given State (no Country).
120 ///
121 /// # Examples
122 ///
123 /// ```
124 /// # use opltypes::Country;
125 /// # use opltypes::states::{State, USAState};
126 /// let state = State::from_full_code("USA-NY").unwrap();
127 /// assert_eq!(state.to_state_string(), "NY");
128 /// ```
129 pub fn to_state_string(self) -> String {
130 match self {
131 State::InArgentina(s) => s.to_string(),
132 State::InAustralia(s) => s.to_string(),
133 State::InBrazil(s) => s.to_string(),
134 State::InCanada(s) => s.to_string(),
135 State::InChina(s) => s.to_string(),
136 State::InEngland(s) => s.to_string(),
137 State::InGermany(s) => s.to_string(),
138 State::InIndia(s) => s.to_string(),
139 State::InMexico(s) => s.to_string(),
140 State::InNetherlands(s) => s.to_string(),
141 State::InNewZealand(s) => s.to_string(),
142 State::InRomania(s) => s.to_string(),
143 State::InRussia(s) => s.to_string(),
144 State::InSouthAfrica(s) => s.to_string(),
145 State::InUSA(s) => s.to_string(),
146 }
147 }
148}
149
150impl Serialize for State {
151 /// Serialization for the server. The checker uses from_str_and_country().
152 fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
153 let country = self.to_country().to_string();
154 let state = self.to_state_string();
155 format!("{}-{}", country, state).serialize(serializer)
156 }
157}
158
159/// Helper struct for State deserialization.
160///
161/// This is only used by the server, not by the checker.
162/// The checker uses from_str_and_country().
163struct StateVisitor;
164
165impl<'de> Visitor<'de> for StateVisitor {
166 type Value = State;
167
168 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
169 formatter.write_str("A Country-State code like USA-NY")
170 }
171
172 fn visit_str<E: de::Error>(self, value: &str) -> Result<State, E> {
173 State::from_full_code(value).map_err(E::custom)
174 }
175}
176
177impl<'de> Deserialize<'de> for State {
178 fn deserialize<D: serde::Deserializer<'de>>(deserializer: D) -> Result<State, D::Error> {
179 deserializer.deserialize_str(StateVisitor)
180 }
181}
182
183/// A state in Argentina.
184#[derive(Copy, Clone, Debug, EnumString, PartialEq, Serialize, ToString)]
185pub enum ArgentinaState {
186 /// Ciudad Autónoma de Buenos Aires.
187 CA,
188 /// Buenos Aires.
189 BA,
190 /// Catamarca.
191 CT,
192 /// Chaco.
193 CC,
194 /// Chubut.
195 CH,
196 /// Córdoba.
197 CB,
198 /// Corrientes.
199 CN,
200 /// Entre Ríos.
201 ER,
202 /// Formosa.
203 FM,
204 /// Jujuy.
205 JY,
206 /// La Pampa.
207 LP,
208 /// La Rioja.
209 LR,
210 /// Mendoza.
211 MZ,
212 /// Misiones.
213 MN,
214 /// Neuquén.
215 NQ,
216 /// Río Negro.
217 RN,
218 /// Salta.
219 SA,
220 /// San Juan.
221 SJ,
222 /// San Luis.
223 SL,
224 /// Santa Cruz.
225 SC,
226 /// Santa Fe.
227 SF,
228 /// Santiago del Estero.
229 SE,
230 /// Tierra del Fuego.
231 TF,
232 /// Tucumán.
233 TM,
234}
235
236/// A state in Australia.
237#[derive(Copy, Clone, Debug, EnumString, PartialEq, Serialize, ToString)]
238pub enum AustraliaState {
239 /// Australian Capital Territory.
240 ACT,
241 /// Jervis Bay Territory.
242 JBT,
243 /// New South Wales.
244 NSW,
245 /// Northern Territory.
246 NT,
247 /// Queensland.
248 QLD,
249 /// South Australia.
250 SA,
251 /// Tasmania.
252 TAS,
253 /// Victoria.
254 VIC,
255 /// Western Australia.
256 WA,
257}
258
259/// A state in Brazil.
260#[derive(Copy, Clone, Debug, EnumString, PartialEq, Serialize, ToString)]
261pub enum BrazilState {
262 /// Acre.
263 AC,
264 /// Alagoas.
265 AL,
266 /// Amapá.
267 AP,
268 /// Amazonas.
269 AM,
270 /// Bahia.
271 BA,
272 /// Ceará.
273 CE,
274 /// Distrito Federal.
275 DF,
276 /// Espírito Santo.
277 ES,
278 /// Goiás.
279 GO,
280 /// Maranhão.
281 MA,
282 /// Mato Grosso.
283 MT,
284 /// Mato Grosso do Sul.
285 MS,
286 /// Minas Gerais.
287 MG,
288 /// Pará.
289 PA,
290 /// Paraíba.
291 PB,
292 /// Paraná.
293 PR,
294 /// Pernambuco.
295 PE,
296 /// Piauí.
297 PI,
298 /// Rio de Janeiro.
299 RJ,
300 /// Rio Grande do Norte.
301 RN,
302 /// Rio Grande do Sul.
303 RS,
304 /// Rondônia.
305 RO,
306 /// Roraima.
307 RR,
308 /// Santa Catarina.
309 SC,
310 /// São Paulo.
311 SP,
312 /// Sergipe.
313 SE,
314 /// Tocantins.
315 TO,
316}
317
318/// A state in Canada.
319#[rustfmt::skip]
320#[derive(Copy, Clone, Debug, EnumString, PartialEq, Serialize, ToString)]
321pub enum CanadaState {
322 AB, BC, MB, NB, NL, NT, NS, NU, ON, PE, QC, SK, YT
323}
324
325/// A province in China.
326#[rustfmt::skip]
327#[derive(Copy, Clone, Debug, EnumString, PartialEq, Serialize, ToString)]
328pub enum ChinaState {
329 /// Anhui Province (安徽省, Ānhuī Shěng).
330 AH,
331 /// Beijing Municipality (北京市, Běijīng Shì).
332 BJ,
333 /// Chongqing Municipality (重庆市, Chóngqìng Shì).
334 CQ,
335 /// Fujian Province (福建省, Fújiàn Shěng).
336 FJ,
337 /// Guangdong Province (广东省, Guǎngdōng Shěng).
338 GD,
339 /// Gansu Province (甘肃省, Gānsù Shěng).
340 GS,
341 /// Guangxi Zhuang Autonomous Region (广西壮族自治区, Guǎngxī Zhuàngzú Zìzhìqū).
342 GX,
343 /// Guizhou Province (贵州省, Guìzhōu Shěng).
344 GZ,
345 /// Henan Province (河南省, Hénán Shěng).
346 HEN,
347 /// Hubei Province (湖北省, Húběi Shěng).
348 HUB,
349 /// Hebei Province (河北省, Héběi Shěng).
350 HEB,
351 /// Hainan Province (海南省, Hǎinán Shěng).
352 HI,
353 /// Hong Kong Special Administrative Region (香港特别行政区, Xiānggǎng Tèbié Xíngzhèngqū).
354 ///
355 /// We usually treat Hong Kong as a separate country. This is here for completeness.
356 HK,
357 /// Heilongjiang Province (黑龙江省, Hēilóngjiāng Shěng).
358 HL,
359 /// Hunan Province (湖南省, Húnán Shěng).
360 HUN,
361 /// Jilin Province (吉林省, Jílín Shěng).
362 JL,
363 /// Jiangsu Province (江苏省, Jiāngsū Shěng).
364 JS,
365 /// Jiangxi Province (江西省, Jiāngxī Shěng).
366 JX,
367 /// Liaoning Province (辽宁省, Liáoníng Shěng).
368 LN,
369 /// Macau Special Administrative Region (澳门特别行政区, Àomén Tèbié Xíngzhèngqū).
370 MO,
371 /// Inner Mongolia Autonomous Region (內蒙古自治区, Nèi Měnggǔ Zìzhìqū).
372 NM,
373 /// Ningxia Hui Autonomous Region (宁夏回族自治区, Níngxià Huízú Zìzhìqū).
374 NX,
375 /// Qinghai Province (青海省, Qīnghǎi Shěng).
376 QH,
377 /// Sichuan Province (四川省, Sìchuān Shěng).
378 SC,
379 /// Shandong Province (山东省, Shāndōng Shěng).
380 SD,
381 /// Shanghai Municipality (上海市, Shànghǎi Shì).
382 SH,
383 /// Shaanxi Province (陕西省, Shǎnxī Shěng).
384 SAA,
385 /// Shanxi Province (山西省, Shānxī Shěng).
386 SAX,
387 /// Tianjin Municipality (天津市, Tiānjīn Shì).
388 TJ,
389 /// Xinjiang Uyghur Autonomous Region (新疆维吾尔自治区, Xīnjiāng Wéiwú'ěr Zìzhìqū).
390 XJ,
391 /// Tibet Autonomous Region (西藏自治区, Xīzàng Zìzhìqū).
392 XZ,
393 /// Yunnan Province (云南省, Yúnnán Shěng).
394 YN,
395 /// Zhejiang Province (浙江省, Zhèjiāng Shěng).
396 ZJ,
397}
398
399/// A region in England, ill-defined and used only by BP.
400///
401/// This omits other divisions not in England: Scotland, N.Ireland, and Wales.
402#[rustfmt::skip]
403#[derive(Copy, Clone, Debug, EnumString, PartialEq, Serialize, ToString)]
404pub enum EnglandState {
405 /// East Midlands.
406 EM,
407 /// Greater London.
408 GL,
409 /// North Midlands.
410 NM,
411 /// North West.
412 NW,
413 /// South East.
414 SE,
415 /// South Midlands.
416 SM,
417 /// South West.
418 SW,
419 /// West Midlands.
420 WM,
421 /// Yorkshire North East.
422 YNE,
423}
424
425/// A state in Germany.
426#[derive(Copy, Clone, Debug, EnumString, PartialEq, Serialize, ToString)]
427pub enum GermanyState {
428 /// Baden-Württemberg.
429 BW,
430 /// Bavaria.
431 BY,
432 /// Berlin.
433 BE,
434 /// Brandenburg.
435 BB,
436 /// Bremen.
437 HB,
438 /// Hesse.
439 HE,
440 /// Hamburg.
441 HH,
442 /// Mecklenburg-Vorpommern.
443 MV,
444 /// Lower Saxony.
445 NI,
446 /// North Rhine-Westphalia.
447 NRW,
448 /// Rhineland-Palatinate.
449 RP,
450 /// Schleswig-Holstein.
451 SH,
452 /// Saarland.
453 SL,
454 /// Saxony.
455 SN,
456 /// Saxony-Anhalt.
457 ST,
458 /// Thuringia.
459 TH,
460}
461
462/// A state in India.
463#[derive(Copy, Clone, Debug, EnumString, PartialEq, Serialize, ToString)]
464pub enum IndiaState {
465 /// Andaman and Nicobar Islands.
466 AN,
467 /// Andhra Pradesh.
468 AP,
469 /// Arunachal Pradesh.
470 AR,
471 /// Assam.
472 AS,
473 /// Bihar.
474 BR,
475 /// Chhattisgarh.
476 CG,
477 /// Chandigarh.
478 CH,
479 /// Daman and Diu.
480 DD,
481 /// Dadra and Nagar Haveli.
482 DH,
483 /// Delhi.
484 DL,
485 /// Goa.
486 GA,
487 /// Gujarat.
488 GJ,
489 /// Haryana.
490 HR,
491 /// Himachal Pradesh.
492 HP,
493 /// Jammu and Kashmir.
494 JK,
495 /// Jharkhand.
496 JH,
497 /// Karnataka.
498 KA,
499 /// Kerala.
500 KL,
501 /// Lakshadweep.
502 LD,
503 /// Madhya Pradesh.
504 MP,
505 /// Maharashtra.
506 MH,
507 /// Manipur.
508 MN,
509 /// Meghalaya.
510 ML,
511 /// Mizoram.
512 MZ,
513 /// Nagaland.
514 NL,
515 /// Orissa.
516 OR,
517 /// Punjab.
518 PB,
519 /// Pondicherry / Puducherry.
520 PY,
521 /// Rajasthan.
522 RJ,
523 /// Sikkim.
524 SK,
525 /// Tamil Nadu.
526 TN,
527 /// Tripura.
528 TR,
529 /// Uttarakhand.
530 UK,
531 /// Uttar Pradesh.
532 UP,
533 /// West Bengal.
534 WB,
535}
536
537/// A state in Mexico.
538#[derive(Copy, Clone, Debug, EnumString, PartialEq, Serialize, ToString)]
539pub enum MexicoState {
540 /// Aguascalientes.
541 AG,
542 /// Baja California.
543 BC,
544 /// Baja California Sur.
545 BS,
546 /// Campeche.
547 CM,
548 /// Chiapas.
549 CS,
550 /// Chihuahua.
551 CH,
552 /// Coahuila.
553 CO,
554 /// Colima.
555 CL,
556 /// Mexico City.
557 DF,
558 /// Durango.
559 DG,
560 /// Guanajuato.
561 GT,
562 /// Guerrero.
563 GR,
564 /// Hidalgo.
565 HG,
566 /// Jalisco.
567 JA,
568 /// México.
569 EM,
570 /// Michoacán.
571 MI,
572 /// Morelos.
573 MO,
574 /// Nayarit.
575 NA,
576 /// Nuevo León.
577 NL,
578 /// Oaxaca.
579 OA,
580 /// Puebla.
581 PU,
582 /// Querétaro.
583 QT,
584 /// Quintana Roo.
585 QR,
586 /// San Luis Potosí.
587 SL,
588 /// Sinaloa.
589 SI,
590 /// Sonora.
591 SO,
592 /// Tabasco.
593 TB,
594 /// Tamaulipas.
595 TM,
596 /// Tlaxcala.
597 TL,
598 /// Veracruz.
599 VE,
600 /// Yucatán.
601 YU,
602 /// Zacatecas.
603 ZA,
604}
605
606/// A state in the Netherlands.
607#[derive(Copy, Clone, Debug, EnumString, PartialEq, Serialize, ToString)]
608pub enum NetherlandsState {
609 /// Drenthe.
610 DR,
611 /// Flevoland.
612 FL,
613 /// Friesland / Fryslân.
614 FR,
615 /// Gelderland.
616 GE,
617 /// Groningen.
618 GR,
619 /// Limburg.
620 LI,
621 /// North Brabant / Noord-Brabant.
622 NB,
623 /// North Holland / Noord-Holland.
624 NH,
625 /// Overijssel / Overissel.
626 OV,
627 /// Utrecht.
628 UT,
629 /// Zeeland.
630 ZE,
631 /// South Holland / Zuid-Holland.
632 ZH,
633}
634
635/// A region in New Zealand.
636#[rustfmt::skip]
637#[derive(Copy, Clone, Debug, EnumString, PartialEq, Serialize, ToString)]
638pub enum NewZealandState {
639 /// Northland.
640 NTL,
641 /// Auckland.
642 AKL,
643 /// Waikato.
644 WKO,
645 /// Bay of Plenty.
646 BOP,
647 /// Gisborne (East Coast).
648 GIS,
649 /// Hawke's Bay.
650 HKB,
651 /// Taranaki.
652 TKI,
653 /// Manawatu-Whanganui.
654 MWT,
655 /// Wellington.
656 WGN,
657 /// Tasman.
658 TAS,
659 /// Nelson.
660 NSN,
661 /// Marlborough.
662 MBH,
663 /// West Coast.
664 WTC,
665 /// Canterbury.
666 CAN,
667 /// Otago.
668 OTA,
669 /// Southland.
670 STL,
671}
672
673/// A county in Romania.
674#[derive(Copy, Clone, Debug, EnumString, PartialEq, Serialize, ToString)]
675pub enum RomaniaState {
676 /// Alba.
677 AB,
678 /// Argeș.
679 AG,
680 /// Arad.
681 AR,
682 /// Bucharest.
683 B,
684 /// Bacău.
685 BC,
686 /// Bihor.
687 BH,
688 /// Bistrița-Năsăud.
689 BN,
690 /// Brăila.
691 BR,
692 /// Botoșani.
693 BT,
694 /// Brașov.
695 BV,
696 /// Buzău.
697 BZ,
698 /// Cluj.
699 CJ,
700 /// Călărași.
701 CL,
702 /// Caraș-Severin.
703 CS,
704 /// Constanța.
705 CT,
706 /// Covasna.
707 CV,
708 /// Dâmbovița.
709 DB,
710 /// Dolj.
711 DJ,
712 /// Gorj.
713 GJ,
714 /// Galați.
715 GL,
716 /// Giurgiu.
717 GR,
718 /// Hunedoara.
719 HD,
720 /// Harghita.
721 HR,
722 /// Ilfov.
723 IF,
724 /// Ialomița.
725 IL,
726 /// Iași.
727 IS,
728 /// Mehedinți.
729 MH,
730 /// Maramureș.
731 MM,
732 /// Mureș.
733 MS,
734 /// Neamț.
735 NT,
736 /// Olt.
737 OT,
738 /// Prahova.
739 PH,
740 /// Sibiu.
741 SB,
742 /// Sălaj.
743 SJ,
744 /// Satu Mare.
745 SM,
746 /// Suceava.
747 SV,
748 /// Tulcea.
749 TL,
750 /// Timiș.
751 TM,
752 /// Teleorman.
753 TR,
754 /// Vâlcea.
755 VL,
756 /// Vrancea.
757 VN,
758 /// Vaslui.
759 VS,
760}
761
762/// An oblast in Russia.
763#[rustfmt::skip]
764#[derive(Copy, Clone, Debug, EnumString, PartialEq, Serialize, ToString)]
765pub enum RussiaState {
766 AD, AL, BA, BU, CE, CU, DA, IN, KB, KL, KC, KR, KK, KO, ME, MO, SA,
767 SE, TA, TY, UD, ALT, KAM, KHA, KDA, KYA, PER, PRI, STA, ZAB, AMU, ARK,
768 AST, BEL, BRY, CHE, IRK, IVA, KGD, KLU, KEM, KIR, KOS, KGN, KRS, LEN,
769 LIP, MAG, MOS, MUR, NIZ, NGR, NVS, OMS, ORE, ORL, PNZ, PSK, ROS, RYA,
770 SAK, SAM, SAR, SMO, SVE, TAM, TOM, TUL, TVE, TYE, TYU, ULY, VLA, VGG,
771 VLG, VOR, YAR, MOW, SPE, YEV, CHU, KHM, NEN, YAN
772}
773
774/// A province in South Africa, using conventional acronyms (non-ISO).
775#[derive(Copy, Clone, Debug, EnumString, PartialEq, Serialize, ToString)]
776pub enum SouthAfricaState {
777 /// Eastern Cape.
778 EC,
779 /// Free State.
780 FS,
781 /// Gauteng.
782 GT,
783 /// KwaZulu-Natal (ISO: NL).
784 KZN,
785 /// Limpopo.
786 LP,
787 /// Mpumalanga.
788 MP,
789 /// Northern Cape.
790 NC,
791 /// North-West.
792 NW,
793 /// Western Cape.
794 WC,
795}
796
797/// A state in the USA.
798#[rustfmt::skip]
799#[derive(Copy, Clone, Debug, EnumString, PartialEq, Serialize, ToString)]
800pub enum USAState {
801 AL, AK, AZ, AR, CA, CO, CT, DE, DC, FL, GA, HI, ID, IL, IN, IA, KS,
802 KY, LA, ME, MD, MA, MI, MN, MS, MO, MT, NE, NV, NH, NJ, NM, NY, NC,
803 ND, OH, OK, OR, PA, RI, SC, SD, TN, TX, UT, VT, VA, WA, WV, WI, WY,
804
805 /// Guam is an unincorporated territory of the USA.
806 Guam,
807}