@koda-sl/baker-cli 0.566.0 → 0.568.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (490) hide show
  1. package/README.md +8 -7
  2. package/dist/{account-EFZSU23W.js → account-D2AGXMM3.js} +5 -5
  3. package/dist/{account-reads-X35O4MCA.js → account-reads-WPKD2LPB.js} +4 -4
  4. package/dist/{account-users-ZS7S3XST.js → account-users-BK45DBUH.js} +5 -5
  5. package/dist/{accounts-HGCR3WFZ.js → accounts-3DS67RX7.js} +4 -4
  6. package/dist/{accounts-R7FX5RTQ.js → accounts-FALANOYX.js} +4 -4
  7. package/dist/{accounts-HHNJP2HK.js → accounts-VSJVFIPH.js} +8 -8
  8. package/dist/{actions-AS77IUIW.js → actions-JIXQEVIN.js} +18 -18
  9. package/dist/{activecampaign-LVVAEAZ7.js → activecampaign-4ST7BMHO.js} +4 -4
  10. package/dist/{add-YT75GMYQ.js → add-NZ6SEWUR.js} +3 -3
  11. package/dist/{add-NNTB7UC7.js → add-ZH5HJBUN.js} +4 -4
  12. package/dist/{ads-RTUNE3XQ.js → ads-JYSYXF3U.js} +5 -5
  13. package/dist/{advertisers-UKHV7DMF.js → advertisers-T37UHN3C.js} +6 -6
  14. package/dist/{analytics-3HPYB3LJ.js → analytics-7QSUKFXF.js} +9 -9
  15. package/dist/{analytics-ZNHNNEZO.js → analytics-DR4DPUP4.js} +4 -4
  16. package/dist/{assign-3LP47K4A.js → assign-3CVJL35R.js} +4 -4
  17. package/dist/{audience-size-GZQBVP4G.js → audience-size-6CZ2AZCK.js} +4 -4
  18. package/dist/{audit-JOS4VENF.js → audit-Q66O3Z46.js} +4 -4
  19. package/dist/{autocomplete-QTV3USWN.js → autocomplete-T642QXBX.js} +6 -6
  20. package/dist/{avatars-QH6FKWOF.js → avatars-33UGHCQA.js} +4 -4
  21. package/dist/{bid-pricing-KK25LRZG.js → bid-pricing-LUWEWGCJ.js} +5 -5
  22. package/dist/{brand-XQ6EXK6B.js → brand-36YIAVGK.js} +2 -2
  23. package/dist/{brief-OAXDT6M2.js → brief-A5XFT6VH.js} +13 -13
  24. package/dist/{campaign-groups-SKTIXZFH.js → campaign-groups-SZSO5B6C.js} +10 -10
  25. package/dist/{campaign-writes-QI3MPKZE.js → campaign-writes-AN4IHY5G.js} +4 -4
  26. package/dist/{campaigns-KJ6TFKHO.js → campaigns-RDHQNOTI.js} +5 -5
  27. package/dist/{campaigns-J6TJ5I6U.js → campaigns-VLVV2PPO.js} +13 -13
  28. package/dist/{canvas-NY43T57N.js → canvas-D7L7R4D2.js} +13 -13
  29. package/dist/{capabilities-H4CMKTJ5.js → capabilities-YC36LOZU.js} +4 -4
  30. package/dist/{changes-6CL42LG3.js → changes-WWZYTLC6.js} +4 -4
  31. package/dist/{chats-XQLS3UJZ.js → chats-M3RP62YO.js} +168 -33
  32. package/dist/chats-M3RP62YO.js.map +1 -0
  33. package/dist/{check-24FR7WPA.js → check-FQYDJ5RS.js} +6 -6
  34. package/dist/{chunk-4S5ZAG4S.js → chunk-22RM3UOO.js} +2 -2
  35. package/dist/{chunk-J47JWEHU.js → chunk-2JBPS2CV.js} +2 -2
  36. package/dist/{chunk-T2MBCTLY.js → chunk-2N2R5YSN.js} +2 -2
  37. package/dist/{chunk-2J5OCFOW.js → chunk-2Q7K4F4H.js} +18 -7
  38. package/dist/chunk-2Q7K4F4H.js.map +1 -0
  39. package/dist/{chunk-TH4LKHWT.js → chunk-2TS2ITSG.js} +2 -2
  40. package/dist/{chunk-4E6EZ4RL.js → chunk-6E4KJMXO.js} +3 -3
  41. package/dist/{chunk-NQVUPVI5.js → chunk-7CORYCEZ.js} +3 -3
  42. package/dist/{chunk-ZF5G7QTP.js → chunk-AC7WLPXF.js} +5 -5
  43. package/dist/{chunk-4JONZ6LA.js → chunk-AIK2HPDZ.js} +2 -2
  44. package/dist/{chunk-Q2JDS6WL.js → chunk-BMMXYR7A.js} +2 -2
  45. package/dist/{chunk-JPICIFPM.js → chunk-CI3QSB6G.js} +2 -2
  46. package/dist/{chunk-IWNINMRI.js → chunk-CORECUKT.js} +2 -2
  47. package/dist/{chunk-2KT7DG5E.js → chunk-E3PYHCQL.js} +2 -2
  48. package/dist/{chunk-PX2VBLV7.js → chunk-EIDHLGQM.js} +2 -2
  49. package/dist/{chunk-WGD6LMRW.js → chunk-FGAXZ7ET.js} +2 -2
  50. package/dist/{chunk-CVVWIXOP.js → chunk-FGTOOTYC.js} +2 -2
  51. package/dist/{chunk-ZV2GM3LW.js → chunk-GDRJS2QJ.js} +2 -2
  52. package/dist/{chunk-UXY7V3PK.js → chunk-GUYFVYLY.js} +2 -2
  53. package/dist/{chunk-5VBGY6CB.js → chunk-H3RCEM6L.js} +2 -2
  54. package/dist/{chunk-CXRFK47Z.js → chunk-HH5WM5VA.js} +2 -2
  55. package/dist/{chunk-FVDC6AKZ.js → chunk-IGCS3X4F.js} +2 -2
  56. package/dist/{chunk-4NCQIO37.js → chunk-IID2MAYZ.js} +2 -2
  57. package/dist/{chunk-ZIKSJBWD.js → chunk-JCDCIQMA.js} +2 -2
  58. package/dist/{chunk-OWEON2S7.js → chunk-JHS5PE5Y.js} +3 -3
  59. package/dist/{chunk-LCDWDG4U.js → chunk-JIE45TKJ.js} +2 -2
  60. package/dist/{chunk-OJGNQYYS.js → chunk-JSOOLOHP.js} +3 -3
  61. package/dist/{chunk-OBVSGXTA.js → chunk-JWV7LUFM.js} +5 -5
  62. package/dist/{chunk-RNVDTUWO.js → chunk-KH7AOX2R.js} +4 -4
  63. package/dist/{chunk-TMFC2LYC.js → chunk-KJTMY7K6.js} +2 -2
  64. package/dist/{chunk-YFXF5XAT.js → chunk-KZQQ6OLC.js} +2 -2
  65. package/dist/{chunk-7QWLIZFI.js → chunk-L5GFFF5G.js} +3 -3
  66. package/dist/{chunk-JAZZ3HFR.js → chunk-LQACNCAV.js} +2 -2
  67. package/dist/{chunk-EOMY5SUJ.js → chunk-MKG57P2E.js} +2 -2
  68. package/dist/{chunk-SICI27M7.js → chunk-MOKZ5XZO.js} +2 -2
  69. package/dist/{chunk-VNRL3EF7.js → chunk-MXVP7Z54.js} +3 -3
  70. package/dist/{chunk-TCR6KI6P.js → chunk-N2TXADL7.js} +2 -2
  71. package/dist/{chunk-KBFYB6YK.js → chunk-O3O7PXMK.js} +2 -2
  72. package/dist/{chunk-CE25X6HT.js → chunk-SIUYWLXB.js} +2 -2
  73. package/dist/{chunk-DFDV42NY.js → chunk-TPGFX47R.js} +2 -2
  74. package/dist/{chunk-FZ4OKE7N.js → chunk-TYFXPC5D.js} +6 -6
  75. package/dist/{chunk-UMTGHV5C.js → chunk-TZTHGLWN.js} +3 -3
  76. package/dist/{chunk-OZTNA2O7.js → chunk-UJTIMPEE.js} +2 -2
  77. package/dist/{chunk-6AK74BNG.js → chunk-UQZZM6UM.js} +3 -3
  78. package/dist/{chunk-XWN2BUAD.js → chunk-UUXGSDUC.js} +3 -3
  79. package/dist/{chunk-BW3E6EDJ.js → chunk-UZHDNE6M.js} +8 -8
  80. package/dist/{chunk-ZNZHEDVB.js → chunk-VJ4IOJQZ.js} +2 -2
  81. package/dist/{chunk-UGIF23QY.js → chunk-X25XRSDP.js} +2 -2
  82. package/dist/{chunk-MSMTG6OC.js → chunk-XHWHBGKX.js} +9 -1
  83. package/dist/{chunk-MSMTG6OC.js.map → chunk-XHWHBGKX.js.map} +1 -1
  84. package/dist/{chunk-SSEJKI43.js → chunk-XRUB4KRV.js} +3 -3
  85. package/dist/{chunk-2A24YMHV.js → chunk-YVFHDZ3K.js} +3 -3
  86. package/dist/{chunk-5O57QLEV.js → chunk-ZQ7JDYJB.js} +2 -2
  87. package/dist/{claim-44U3RIL6.js → claim-CG3J32WS.js} +4 -4
  88. package/dist/cli.js +31 -31
  89. package/dist/{companies-CBWSZMLE.js → companies-X6O55ACG.js} +4 -4
  90. package/dist/{company-XZAQYAAE.js → company-4CD2OJLB.js} +4 -4
  91. package/dist/{complete-FQH646EJ.js → complete-JSP6VQYI.js} +4 -4
  92. package/dist/{connect-JCN3JCGD.js → connect-O5NRDY4Y.js} +7 -7
  93. package/dist/{conversation-VW7VBIOQ.js → conversation-J22BH6O5.js} +4 -4
  94. package/dist/{conversion-upload-command-WNHVNVMW.js → conversion-upload-command-5OILW65U.js} +4 -4
  95. package/dist/{conversions-Q3TYENCG.js → conversions-I2ZOQHKJ.js} +9 -9
  96. package/dist/{create-FYJFH6A7.js → create-DQ5X5AJT.js} +4 -4
  97. package/dist/{create-5X2MFN6V.js → create-FNPFVKLT.js} +4 -4
  98. package/dist/{create-LQCOOKWJ.js → create-GXOFZCR5.js} +4 -4
  99. package/dist/{create-CG34L6OG.js → create-VAZ65QNJ.js} +3 -3
  100. package/dist/{creatives-PU3V4EDT.js → creatives-4G2V4J6N.js} +10 -10
  101. package/dist/{creatives-PWIEGVPE.js → creatives-QWNQDPNE.js} +12 -12
  102. package/dist/{credentials-RHSPLXSE.js → credentials-VCERJE24.js} +4 -4
  103. package/dist/{critique-B5FSBCL6.js → critique-62QFBC33.js} +4 -4
  104. package/dist/{critique-WEIGEHNU.js → critique-MSL6EU5V.js} +9 -9
  105. package/dist/{crm-EBK4Z6EO.js → crm-HODCOAAI.js} +5 -5
  106. package/dist/{crm-QB4AUGEW.js → crm-J3SCOR4L.js} +6 -6
  107. package/dist/{currency-VQMZZXSS.js → currency-BZUNQ4XJ.js} +4 -4
  108. package/dist/{customers-U3SNJUZB.js → customers-EYVTYCGY.js} +6 -6
  109. package/dist/{delete-CKCG56WV.js → delete-7A6T6XBD.js} +3 -3
  110. package/dist/{delete-Q2WPGQQQ.js → delete-I3W3M6T7.js} +4 -4
  111. package/dist/{delete-B4WV52YL.js → delete-RZCW3Y6L.js} +4 -4
  112. package/dist/{demographics-HRH4TJ76.js → demographics-OFBRSF7A.js} +4 -4
  113. package/dist/{discard-R2SJQDCW.js → discard-I773LYVR.js} +4 -4
  114. package/dist/{discover-4F4USNHE.js → discover-PDSEJR2P.js} +4 -4
  115. package/dist/{domain-LV6YI57G.js → domain-7YO5HYHU.js} +4 -4
  116. package/dist/{download-5NLYEXK3.js → download-IYK3UVBF.js} +3 -3
  117. package/dist/{draft-MRRCPIKF.js → draft-2Z7EGKBO.js} +4 -4
  118. package/dist/{draft-33DTE674.js → draft-6MWXURYC.js} +4 -4
  119. package/dist/{draft-VIZTQ6W4.js → draft-PCXWAA2Y.js} +30 -9
  120. package/dist/draft-PCXWAA2Y.js.map +1 -0
  121. package/dist/{draft-KA5F4QIQ.js → draft-QN5XXOS6.js} +5 -5
  122. package/dist/{experiments-AKQDYU5Z.js → experiments-2DX4K3AQ.js} +5 -5
  123. package/dist/{extract-FZ7YZFYN.js → extract-ZIW5JFTY.js} +3 -3
  124. package/dist/{facets-IRDQ2TNF.js → facets-OLRASLT7.js} +4 -4
  125. package/dist/{feedback-CGOFO6UH.js → feedback-2YJ24NV7.js} +13 -13
  126. package/dist/{feedback-V6TCMABL.js → feedback-X3GLQ2QF.js} +4 -4
  127. package/dist/{feedback-record-SKMSWYAI.js → feedback-record-A5JLS3QY.js} +14 -14
  128. package/dist/{fetch-2ZOPSTXX.js → fetch-6XMRKLYH.js} +4 -4
  129. package/dist/{fit-JQ7MR5FU.js → fit-BRJSLR7P.js} +6 -6
  130. package/dist/{flows-77X3R6XX.js → flows-LXJHL3KW.js} +12 -12
  131. package/dist/{fonts-VOHGLU5R.js → fonts-UUSCLUHW.js} +6 -6
  132. package/dist/{forecast-E2HJSD6E.js → forecast-3KMAJJWJ.js} +4 -4
  133. package/dist/{forecast-PAGM5TBI.js → forecast-7DZGLC7Y.js} +5 -5
  134. package/dist/{funnel-7FWBX2MH.js → funnel-2ALYZ3GP.js} +5 -5
  135. package/dist/{get-DISZAEWO.js → get-KVZSVN7U.js} +4 -4
  136. package/dist/{get-TPFELCGO.js → get-OZ7THI2W.js} +4 -4
  137. package/dist/{google-OYCSQ6Z3.js → google-5U5KXEX7.js} +3 -3
  138. package/dist/{google-ZRZGM2XI.js → google-RTDPHVLU.js} +23 -23
  139. package/dist/{google-ads-6KW323PN.js → google-ads-YZTK3YTW.js} +4 -4
  140. package/dist/{history-GXFXEPSQ.js → history-RYTNMGU5.js} +4 -4
  141. package/dist/{history-BFWII3NI.js → history-XDYDNQWK.js} +4 -4
  142. package/dist/{hubspot-BU3UJNZY.js → hubspot-MRUCRJLL.js} +8 -8
  143. package/dist/{ideas-WSUZEFLG.js → ideas-TT24LJR5.js} +5 -5
  144. package/dist/{images-CFZL3N4Z.js → images-PLYPUXM2.js} +7 -7
  145. package/dist/{ingest-ML2BFCNR.js → ingest-CSPC3RUK.js} +3 -3
  146. package/dist/{ingest-NGNELRYE.js → ingest-MSPQX3Z6.js} +4 -4
  147. package/dist/{inspect-VF3DJBRX.js → inspect-VD6CB2NA.js} +4 -4
  148. package/dist/{intent-ZKLT4DAW.js → intent-HXRSLFIO.js} +4 -4
  149. package/dist/{keyword-gap-QC3ITLNG.js → keyword-gap-WUHMSTNR.js} +4 -4
  150. package/dist/{keyword-metrics-VDLZYA76.js → keyword-metrics-NJV3WR75.js} +6 -6
  151. package/dist/{keywords-for-site-6IAS7QK3.js → keywords-for-site-B7MUDHFH.js} +6 -6
  152. package/dist/{landing-HBBNHU4W.js → landing-RKOEVY7L.js} +2 -2
  153. package/dist/{languages-QMLC4QWZ.js → languages-SVTYYYOC.js} +4 -4
  154. package/dist/{leads-6RFLDXIP.js → leads-HFB5UXZJ.js} +4 -4
  155. package/dist/{learn-QL2ZO7OP.js → learn-XNN3DGDF.js} +5 -5
  156. package/dist/{line-item-writes-FZVYSBWK.js → line-item-writes-VEJ5Y6X4.js} +4 -4
  157. package/dist/{line-items-44QSYZTE.js → line-items-U6L2TMPG.js} +5 -5
  158. package/dist/{link-N7VUZE5R.js → link-ENZQAISO.js} +4 -4
  159. package/dist/{linkedin-BP6LWQIS.js → linkedin-SY2WZWKP.js} +31 -31
  160. package/dist/{linkedin-person-KPFROM7O.js → linkedin-person-3RCX4MI3.js} +4 -4
  161. package/dist/{list-IZ2MUUQ5.js → list-AF522LRC.js} +4 -4
  162. package/dist/{list-OW5UIFI3.js → list-GPTYUCSX.js} +3 -3
  163. package/dist/{list-VSDOV3QX.js → list-VYTHVUDP.js} +4 -4
  164. package/dist/{locations-DNRK7DY4.js → locations-7EBZ6KRH.js} +4 -4
  165. package/dist/{log-U5P25U6W.js → log-NJR3FJWN.js} +4 -4
  166. package/dist/{make-55LQECUE.js → make-4XUB6RSF.js} +16 -16
  167. package/dist/{map-QSBCVWNW.js → map-LIYQCWXU.js} +5 -5
  168. package/dist/{mcp-4VUUHCWJ.js → mcp-QDOAKB3A.js} +3 -3
  169. package/dist/{media-sources-B36AGK4K.js → media-sources-LFSDIPUB.js} +2 -2
  170. package/dist/{members-O5MYSZ6W.js → members-KGKQQFMN.js} +4 -4
  171. package/dist/{metrics-P4QDFCVB.js → metrics-WRERNMRK.js} +4 -4
  172. package/dist/{normalize-6YBZQ6MJ.js → normalize-DQPKM3MG.js} +4 -4
  173. package/dist/{options-WCJ4SZ4Q.js → options-XIH7YPEG.js} +7 -7
  174. package/dist/{organization-RKV7KDMQ.js → organization-BUSXIGA4.js} +4 -4
  175. package/dist/{performance-JZ2IUWJX.js → performance-PU4NHFUE.js} +5 -5
  176. package/dist/{performance-ASGNJQTT.js → performance-Y2DTYSFV.js} +4 -4
  177. package/dist/{preview-SMFKMMZU.js → preview-3UOBVP6M.js} +4 -4
  178. package/dist/{promoted-tweet-writes-5VBLE23Q.js → promoted-tweet-writes-6Y4MDPBH.js} +4 -4
  179. package/dist/{promoted-tweets-N7XPG3XB.js → promoted-tweets-JAR2W6KC.js} +3 -3
  180. package/dist/{publish-ZCVVBT2E.js → publish-MDVPC77V.js} +4 -4
  181. package/dist/{query-AQ6HNKW7.js → query-3QFT42PG.js} +5 -5
  182. package/dist/{reddit-ZWA4GSD3.js → reddit-ZPKVVZGP.js} +5 -5
  183. package/dist/{refresh-GZSPTRQO.js → refresh-V34YWN3W.js} +3 -3
  184. package/dist/{release-YQSDFSAD.js → release-WRNUOSHB.js} +4 -4
  185. package/dist/{relevant-pages-NZKXWMNA.js → relevant-pages-OFKZYWR3.js} +4 -4
  186. package/dist/{remove-IC6XZSLZ.js → remove-HKWV7P27.js} +3 -3
  187. package/dist/{reopen-4D4S5TFN.js → reopen-VHHYVAKC.js} +4 -4
  188. package/dist/{rerun-QCV3QX2U.js → rerun-THE43RCG.js} +15 -15
  189. package/dist/{research-XRKLDLK3.js → research-773Y7GT4.js} +16 -16
  190. package/dist/{research-SPWJYSF3.js → research-G5A2WXVK.js} +3 -3
  191. package/dist/{reset-MTSRIAXC.js → reset-GFJ3AKF5.js} +3 -3
  192. package/dist/{reset-RPHQ6R4T.js → reset-MVTWA3HT.js} +3 -3
  193. package/dist/{resolve-F4Q7TPBU.js → resolve-JRSSTIAF.js} +4 -4
  194. package/dist/{retry-ZJYQRVXA.js → retry-AGHA6IVT.js} +3 -3
  195. package/dist/{retry-EY4VUCWE.js → retry-LDJ6FZCZ.js} +3 -3
  196. package/dist/{revenue-MWDAUG2M.js → revenue-Q2JK5VY6.js} +5 -5
  197. package/dist/{rules-LIHB6YIY.js → rules-4A25K2P7.js} +6 -6
  198. package/dist/{rules-add-6NIC4BSS.js → rules-add-GT7NCUB3.js} +6 -6
  199. package/dist/{run-TSLHGOVM.js → run-NFLKYVIC.js} +15 -15
  200. package/dist/{run-K3ZTVHXF.js → run-ZLHQNLCF.js} +4 -4
  201. package/dist/{scaffold-ad-G4GPAJNA.js → scaffold-ad-AJN67FWG.js} +11 -11
  202. package/dist/{scaffold-static-ad-5G4T4QOV.js → scaffold-static-ad-L6KXZ3TN.js} +19 -19
  203. package/dist/{scaffold-video-BCQTXK3B.js → scaffold-video-XQBZZ5TZ.js} +10 -10
  204. package/dist/{schedule-6AEZXHSM.js → schedule-45CJDHIX.js} +3 -3
  205. package/dist/{scheduled-agents-4ALAF7S2.js → scheduled-agents-72MWHK63.js} +11 -11
  206. package/dist/{schema-G2RFAHMC.js → schema-VX66FH4O.js} +5 -5
  207. package/dist/{search-QXTEVPDB.js → search-Y6TS5UZS.js} +3 -3
  208. package/dist/{select-BDE4444H.js → select-MZ2U7U5U.js} +12 -12
  209. package/dist/{set-prompt-BJGXSGF7.js → set-prompt-YH6PXNXB.js} +9 -9
  210. package/dist/{setup-links-PI6HRHB3.js → setup-links-Y4YYDQBK.js} +4 -4
  211. package/dist/{shopify-RTWQDLMB.js → shopify-HGFUHYT7.js} +4 -4
  212. package/dist/{site-F5YCQRXX.js → site-WZ654OP3.js} +5 -5
  213. package/dist/{sources-AIY3SEIE.js → sources-7ZFY3VEZ.js} +7 -7
  214. package/dist/{sources-JBOEVF5L.js → sources-FCBFLR2J.js} +6 -6
  215. package/dist/{stale-R63TSO5I.js → stale-VSSDVB4H.js} +11 -11
  216. package/dist/{status-NXZSC3WG.js → status-L7LYUD3F.js} +4 -4
  217. package/dist/{stock-WUOFRG3K.js → stock-73PLAUYU.js} +3 -3
  218. package/dist/{sync-4T577GH4.js → sync-XBC3PSSV.js} +3 -3
  219. package/dist/{sync-definition-IRW4MSRQ.js → sync-definition-IM2NY5QC.js} +10 -10
  220. package/dist/{tags-DVWORXQR.js → tags-2KNOJ7A6.js} +4 -4
  221. package/dist/{tags-VS37KZCM.js → tags-COALQ2CT.js} +4 -4
  222. package/dist/{tags-VAPD3LWN.js → tags-HCJTTLSR.js} +3 -3
  223. package/dist/{tags-R66INE52.js → tags-MVC56SHA.js} +4 -4
  224. package/dist/{tags-24RR4Q2Y.js → tags-UNUZVGUA.js} +4 -4
  225. package/dist/{targeting-criteria-CR5VHR35.js → targeting-criteria-SMBIEM7U.js} +3 -3
  226. package/dist/{targets-MF2K7JRS.js → targets-BNH37YAQ.js} +4 -4
  227. package/dist/{testimonials-J6FUERA2.js → testimonials-IIAT5IDM.js} +6 -6
  228. package/dist/{themes-WMZJWXFT.js → themes-5HKRO5RR.js} +4 -4
  229. package/dist/{top-companies-ZEFG2CVI.js → top-companies-PY2NL2GS.js} +4 -4
  230. package/dist/{transcript-O2UOSI54.js → transcript-7WFXVRVW.js} +4 -4
  231. package/dist/{translate-DZAZAUI2.js → translate-IPTYPZF6.js} +14 -14
  232. package/dist/{triggers-NQMVL755.js → triggers-RBD2XGNG.js} +4 -4
  233. package/dist/{unlink-2RGEODVO.js → unlink-5IMEUVIS.js} +4 -4
  234. package/dist/{unstage-KLYI3EMB.js → unstage-DSOVSWEK.js} +4 -4
  235. package/dist/{update-ZUB7IM4K.js → update-7JVV5ZL3.js} +4 -4
  236. package/dist/{update-CVUA6TTH.js → update-FIU2ECYQ.js} +3 -3
  237. package/dist/{update-YUMXVVIV.js → update-HSS6CVUK.js} +4 -4
  238. package/dist/{update-HDI54TX2.js → update-XWL3Q5QY.js} +4 -4
  239. package/dist/{upload-RARJSXYY.js → upload-B5SM33MK.js} +4 -4
  240. package/dist/{url-options-QLDSJ7QJ.js → url-options-4J3FRXHO.js} +4 -4
  241. package/dist/{url-params-YRMDSBOO.js → url-params-TGCGWKAJ.js} +4 -4
  242. package/dist/{validate-NG3O63DD.js → validate-4NXKYAL2.js} +12 -12
  243. package/dist/{videos-IWTKAIJL.js → videos-FMV4AVB2.js} +6 -6
  244. package/dist/{viewer-check-JNFFC5IK.js → viewer-check-2W6BTVQV.js} +7 -7
  245. package/dist/{web-VR6XXNL6.js → web-K2EMYVCD.js} +4 -4
  246. package/dist/{winning-ads-M6UG74BB.js → winning-ads-Q3RXH7EC.js} +3 -3
  247. package/dist/{write-commands-6OHNL3UR.js → write-commands-VQPEHKH7.js} +5 -5
  248. package/dist/{x-TSLM5O2T.js → x-PW43O6JS.js} +6 -6
  249. package/package.json +1 -1
  250. package/dist/chats-XQLS3UJZ.js.map +0 -1
  251. package/dist/chunk-2J5OCFOW.js.map +0 -1
  252. package/dist/draft-VIZTQ6W4.js.map +0 -1
  253. /package/dist/{account-EFZSU23W.js.map → account-D2AGXMM3.js.map} +0 -0
  254. /package/dist/{account-reads-X35O4MCA.js.map → account-reads-WPKD2LPB.js.map} +0 -0
  255. /package/dist/{account-users-ZS7S3XST.js.map → account-users-BK45DBUH.js.map} +0 -0
  256. /package/dist/{accounts-HGCR3WFZ.js.map → accounts-3DS67RX7.js.map} +0 -0
  257. /package/dist/{accounts-R7FX5RTQ.js.map → accounts-FALANOYX.js.map} +0 -0
  258. /package/dist/{accounts-HHNJP2HK.js.map → accounts-VSJVFIPH.js.map} +0 -0
  259. /package/dist/{actions-AS77IUIW.js.map → actions-JIXQEVIN.js.map} +0 -0
  260. /package/dist/{activecampaign-LVVAEAZ7.js.map → activecampaign-4ST7BMHO.js.map} +0 -0
  261. /package/dist/{add-YT75GMYQ.js.map → add-NZ6SEWUR.js.map} +0 -0
  262. /package/dist/{add-NNTB7UC7.js.map → add-ZH5HJBUN.js.map} +0 -0
  263. /package/dist/{ads-RTUNE3XQ.js.map → ads-JYSYXF3U.js.map} +0 -0
  264. /package/dist/{advertisers-UKHV7DMF.js.map → advertisers-T37UHN3C.js.map} +0 -0
  265. /package/dist/{analytics-3HPYB3LJ.js.map → analytics-7QSUKFXF.js.map} +0 -0
  266. /package/dist/{analytics-ZNHNNEZO.js.map → analytics-DR4DPUP4.js.map} +0 -0
  267. /package/dist/{assign-3LP47K4A.js.map → assign-3CVJL35R.js.map} +0 -0
  268. /package/dist/{audience-size-GZQBVP4G.js.map → audience-size-6CZ2AZCK.js.map} +0 -0
  269. /package/dist/{audit-JOS4VENF.js.map → audit-Q66O3Z46.js.map} +0 -0
  270. /package/dist/{autocomplete-QTV3USWN.js.map → autocomplete-T642QXBX.js.map} +0 -0
  271. /package/dist/{avatars-QH6FKWOF.js.map → avatars-33UGHCQA.js.map} +0 -0
  272. /package/dist/{bid-pricing-KK25LRZG.js.map → bid-pricing-LUWEWGCJ.js.map} +0 -0
  273. /package/dist/{brand-XQ6EXK6B.js.map → brand-36YIAVGK.js.map} +0 -0
  274. /package/dist/{brief-OAXDT6M2.js.map → brief-A5XFT6VH.js.map} +0 -0
  275. /package/dist/{campaign-groups-SKTIXZFH.js.map → campaign-groups-SZSO5B6C.js.map} +0 -0
  276. /package/dist/{campaign-writes-QI3MPKZE.js.map → campaign-writes-AN4IHY5G.js.map} +0 -0
  277. /package/dist/{campaigns-KJ6TFKHO.js.map → campaigns-RDHQNOTI.js.map} +0 -0
  278. /package/dist/{campaigns-J6TJ5I6U.js.map → campaigns-VLVV2PPO.js.map} +0 -0
  279. /package/dist/{canvas-NY43T57N.js.map → canvas-D7L7R4D2.js.map} +0 -0
  280. /package/dist/{capabilities-H4CMKTJ5.js.map → capabilities-YC36LOZU.js.map} +0 -0
  281. /package/dist/{changes-6CL42LG3.js.map → changes-WWZYTLC6.js.map} +0 -0
  282. /package/dist/{check-24FR7WPA.js.map → check-FQYDJ5RS.js.map} +0 -0
  283. /package/dist/{chunk-4S5ZAG4S.js.map → chunk-22RM3UOO.js.map} +0 -0
  284. /package/dist/{chunk-J47JWEHU.js.map → chunk-2JBPS2CV.js.map} +0 -0
  285. /package/dist/{chunk-T2MBCTLY.js.map → chunk-2N2R5YSN.js.map} +0 -0
  286. /package/dist/{chunk-TH4LKHWT.js.map → chunk-2TS2ITSG.js.map} +0 -0
  287. /package/dist/{chunk-4E6EZ4RL.js.map → chunk-6E4KJMXO.js.map} +0 -0
  288. /package/dist/{chunk-NQVUPVI5.js.map → chunk-7CORYCEZ.js.map} +0 -0
  289. /package/dist/{chunk-ZF5G7QTP.js.map → chunk-AC7WLPXF.js.map} +0 -0
  290. /package/dist/{chunk-4JONZ6LA.js.map → chunk-AIK2HPDZ.js.map} +0 -0
  291. /package/dist/{chunk-Q2JDS6WL.js.map → chunk-BMMXYR7A.js.map} +0 -0
  292. /package/dist/{chunk-JPICIFPM.js.map → chunk-CI3QSB6G.js.map} +0 -0
  293. /package/dist/{chunk-IWNINMRI.js.map → chunk-CORECUKT.js.map} +0 -0
  294. /package/dist/{chunk-2KT7DG5E.js.map → chunk-E3PYHCQL.js.map} +0 -0
  295. /package/dist/{chunk-PX2VBLV7.js.map → chunk-EIDHLGQM.js.map} +0 -0
  296. /package/dist/{chunk-WGD6LMRW.js.map → chunk-FGAXZ7ET.js.map} +0 -0
  297. /package/dist/{chunk-CVVWIXOP.js.map → chunk-FGTOOTYC.js.map} +0 -0
  298. /package/dist/{chunk-ZV2GM3LW.js.map → chunk-GDRJS2QJ.js.map} +0 -0
  299. /package/dist/{chunk-UXY7V3PK.js.map → chunk-GUYFVYLY.js.map} +0 -0
  300. /package/dist/{chunk-5VBGY6CB.js.map → chunk-H3RCEM6L.js.map} +0 -0
  301. /package/dist/{chunk-CXRFK47Z.js.map → chunk-HH5WM5VA.js.map} +0 -0
  302. /package/dist/{chunk-FVDC6AKZ.js.map → chunk-IGCS3X4F.js.map} +0 -0
  303. /package/dist/{chunk-4NCQIO37.js.map → chunk-IID2MAYZ.js.map} +0 -0
  304. /package/dist/{chunk-ZIKSJBWD.js.map → chunk-JCDCIQMA.js.map} +0 -0
  305. /package/dist/{chunk-OWEON2S7.js.map → chunk-JHS5PE5Y.js.map} +0 -0
  306. /package/dist/{chunk-LCDWDG4U.js.map → chunk-JIE45TKJ.js.map} +0 -0
  307. /package/dist/{chunk-OJGNQYYS.js.map → chunk-JSOOLOHP.js.map} +0 -0
  308. /package/dist/{chunk-OBVSGXTA.js.map → chunk-JWV7LUFM.js.map} +0 -0
  309. /package/dist/{chunk-RNVDTUWO.js.map → chunk-KH7AOX2R.js.map} +0 -0
  310. /package/dist/{chunk-TMFC2LYC.js.map → chunk-KJTMY7K6.js.map} +0 -0
  311. /package/dist/{chunk-YFXF5XAT.js.map → chunk-KZQQ6OLC.js.map} +0 -0
  312. /package/dist/{chunk-7QWLIZFI.js.map → chunk-L5GFFF5G.js.map} +0 -0
  313. /package/dist/{chunk-JAZZ3HFR.js.map → chunk-LQACNCAV.js.map} +0 -0
  314. /package/dist/{chunk-EOMY5SUJ.js.map → chunk-MKG57P2E.js.map} +0 -0
  315. /package/dist/{chunk-SICI27M7.js.map → chunk-MOKZ5XZO.js.map} +0 -0
  316. /package/dist/{chunk-VNRL3EF7.js.map → chunk-MXVP7Z54.js.map} +0 -0
  317. /package/dist/{chunk-TCR6KI6P.js.map → chunk-N2TXADL7.js.map} +0 -0
  318. /package/dist/{chunk-KBFYB6YK.js.map → chunk-O3O7PXMK.js.map} +0 -0
  319. /package/dist/{chunk-CE25X6HT.js.map → chunk-SIUYWLXB.js.map} +0 -0
  320. /package/dist/{chunk-DFDV42NY.js.map → chunk-TPGFX47R.js.map} +0 -0
  321. /package/dist/{chunk-FZ4OKE7N.js.map → chunk-TYFXPC5D.js.map} +0 -0
  322. /package/dist/{chunk-UMTGHV5C.js.map → chunk-TZTHGLWN.js.map} +0 -0
  323. /package/dist/{chunk-OZTNA2O7.js.map → chunk-UJTIMPEE.js.map} +0 -0
  324. /package/dist/{chunk-6AK74BNG.js.map → chunk-UQZZM6UM.js.map} +0 -0
  325. /package/dist/{chunk-XWN2BUAD.js.map → chunk-UUXGSDUC.js.map} +0 -0
  326. /package/dist/{chunk-BW3E6EDJ.js.map → chunk-UZHDNE6M.js.map} +0 -0
  327. /package/dist/{chunk-ZNZHEDVB.js.map → chunk-VJ4IOJQZ.js.map} +0 -0
  328. /package/dist/{chunk-UGIF23QY.js.map → chunk-X25XRSDP.js.map} +0 -0
  329. /package/dist/{chunk-SSEJKI43.js.map → chunk-XRUB4KRV.js.map} +0 -0
  330. /package/dist/{chunk-2A24YMHV.js.map → chunk-YVFHDZ3K.js.map} +0 -0
  331. /package/dist/{chunk-5O57QLEV.js.map → chunk-ZQ7JDYJB.js.map} +0 -0
  332. /package/dist/{claim-44U3RIL6.js.map → claim-CG3J32WS.js.map} +0 -0
  333. /package/dist/{companies-CBWSZMLE.js.map → companies-X6O55ACG.js.map} +0 -0
  334. /package/dist/{company-XZAQYAAE.js.map → company-4CD2OJLB.js.map} +0 -0
  335. /package/dist/{complete-FQH646EJ.js.map → complete-JSP6VQYI.js.map} +0 -0
  336. /package/dist/{connect-JCN3JCGD.js.map → connect-O5NRDY4Y.js.map} +0 -0
  337. /package/dist/{conversation-VW7VBIOQ.js.map → conversation-J22BH6O5.js.map} +0 -0
  338. /package/dist/{conversion-upload-command-WNHVNVMW.js.map → conversion-upload-command-5OILW65U.js.map} +0 -0
  339. /package/dist/{conversions-Q3TYENCG.js.map → conversions-I2ZOQHKJ.js.map} +0 -0
  340. /package/dist/{create-FYJFH6A7.js.map → create-DQ5X5AJT.js.map} +0 -0
  341. /package/dist/{create-5X2MFN6V.js.map → create-FNPFVKLT.js.map} +0 -0
  342. /package/dist/{create-LQCOOKWJ.js.map → create-GXOFZCR5.js.map} +0 -0
  343. /package/dist/{create-CG34L6OG.js.map → create-VAZ65QNJ.js.map} +0 -0
  344. /package/dist/{creatives-PU3V4EDT.js.map → creatives-4G2V4J6N.js.map} +0 -0
  345. /package/dist/{creatives-PWIEGVPE.js.map → creatives-QWNQDPNE.js.map} +0 -0
  346. /package/dist/{credentials-RHSPLXSE.js.map → credentials-VCERJE24.js.map} +0 -0
  347. /package/dist/{critique-B5FSBCL6.js.map → critique-62QFBC33.js.map} +0 -0
  348. /package/dist/{critique-WEIGEHNU.js.map → critique-MSL6EU5V.js.map} +0 -0
  349. /package/dist/{crm-EBK4Z6EO.js.map → crm-HODCOAAI.js.map} +0 -0
  350. /package/dist/{crm-QB4AUGEW.js.map → crm-J3SCOR4L.js.map} +0 -0
  351. /package/dist/{currency-VQMZZXSS.js.map → currency-BZUNQ4XJ.js.map} +0 -0
  352. /package/dist/{customers-U3SNJUZB.js.map → customers-EYVTYCGY.js.map} +0 -0
  353. /package/dist/{delete-CKCG56WV.js.map → delete-7A6T6XBD.js.map} +0 -0
  354. /package/dist/{delete-Q2WPGQQQ.js.map → delete-I3W3M6T7.js.map} +0 -0
  355. /package/dist/{delete-B4WV52YL.js.map → delete-RZCW3Y6L.js.map} +0 -0
  356. /package/dist/{demographics-HRH4TJ76.js.map → demographics-OFBRSF7A.js.map} +0 -0
  357. /package/dist/{discard-R2SJQDCW.js.map → discard-I773LYVR.js.map} +0 -0
  358. /package/dist/{discover-4F4USNHE.js.map → discover-PDSEJR2P.js.map} +0 -0
  359. /package/dist/{domain-LV6YI57G.js.map → domain-7YO5HYHU.js.map} +0 -0
  360. /package/dist/{download-5NLYEXK3.js.map → download-IYK3UVBF.js.map} +0 -0
  361. /package/dist/{draft-MRRCPIKF.js.map → draft-2Z7EGKBO.js.map} +0 -0
  362. /package/dist/{draft-33DTE674.js.map → draft-6MWXURYC.js.map} +0 -0
  363. /package/dist/{draft-KA5F4QIQ.js.map → draft-QN5XXOS6.js.map} +0 -0
  364. /package/dist/{experiments-AKQDYU5Z.js.map → experiments-2DX4K3AQ.js.map} +0 -0
  365. /package/dist/{extract-FZ7YZFYN.js.map → extract-ZIW5JFTY.js.map} +0 -0
  366. /package/dist/{facets-IRDQ2TNF.js.map → facets-OLRASLT7.js.map} +0 -0
  367. /package/dist/{feedback-CGOFO6UH.js.map → feedback-2YJ24NV7.js.map} +0 -0
  368. /package/dist/{feedback-V6TCMABL.js.map → feedback-X3GLQ2QF.js.map} +0 -0
  369. /package/dist/{feedback-record-SKMSWYAI.js.map → feedback-record-A5JLS3QY.js.map} +0 -0
  370. /package/dist/{fetch-2ZOPSTXX.js.map → fetch-6XMRKLYH.js.map} +0 -0
  371. /package/dist/{fit-JQ7MR5FU.js.map → fit-BRJSLR7P.js.map} +0 -0
  372. /package/dist/{flows-77X3R6XX.js.map → flows-LXJHL3KW.js.map} +0 -0
  373. /package/dist/{fonts-VOHGLU5R.js.map → fonts-UUSCLUHW.js.map} +0 -0
  374. /package/dist/{forecast-E2HJSD6E.js.map → forecast-3KMAJJWJ.js.map} +0 -0
  375. /package/dist/{forecast-PAGM5TBI.js.map → forecast-7DZGLC7Y.js.map} +0 -0
  376. /package/dist/{funnel-7FWBX2MH.js.map → funnel-2ALYZ3GP.js.map} +0 -0
  377. /package/dist/{get-DISZAEWO.js.map → get-KVZSVN7U.js.map} +0 -0
  378. /package/dist/{get-TPFELCGO.js.map → get-OZ7THI2W.js.map} +0 -0
  379. /package/dist/{google-OYCSQ6Z3.js.map → google-5U5KXEX7.js.map} +0 -0
  380. /package/dist/{google-ZRZGM2XI.js.map → google-RTDPHVLU.js.map} +0 -0
  381. /package/dist/{google-ads-6KW323PN.js.map → google-ads-YZTK3YTW.js.map} +0 -0
  382. /package/dist/{history-GXFXEPSQ.js.map → history-RYTNMGU5.js.map} +0 -0
  383. /package/dist/{history-BFWII3NI.js.map → history-XDYDNQWK.js.map} +0 -0
  384. /package/dist/{hubspot-BU3UJNZY.js.map → hubspot-MRUCRJLL.js.map} +0 -0
  385. /package/dist/{ideas-WSUZEFLG.js.map → ideas-TT24LJR5.js.map} +0 -0
  386. /package/dist/{images-CFZL3N4Z.js.map → images-PLYPUXM2.js.map} +0 -0
  387. /package/dist/{ingest-ML2BFCNR.js.map → ingest-CSPC3RUK.js.map} +0 -0
  388. /package/dist/{ingest-NGNELRYE.js.map → ingest-MSPQX3Z6.js.map} +0 -0
  389. /package/dist/{inspect-VF3DJBRX.js.map → inspect-VD6CB2NA.js.map} +0 -0
  390. /package/dist/{intent-ZKLT4DAW.js.map → intent-HXRSLFIO.js.map} +0 -0
  391. /package/dist/{keyword-gap-QC3ITLNG.js.map → keyword-gap-WUHMSTNR.js.map} +0 -0
  392. /package/dist/{keyword-metrics-VDLZYA76.js.map → keyword-metrics-NJV3WR75.js.map} +0 -0
  393. /package/dist/{keywords-for-site-6IAS7QK3.js.map → keywords-for-site-B7MUDHFH.js.map} +0 -0
  394. /package/dist/{landing-HBBNHU4W.js.map → landing-RKOEVY7L.js.map} +0 -0
  395. /package/dist/{languages-QMLC4QWZ.js.map → languages-SVTYYYOC.js.map} +0 -0
  396. /package/dist/{leads-6RFLDXIP.js.map → leads-HFB5UXZJ.js.map} +0 -0
  397. /package/dist/{learn-QL2ZO7OP.js.map → learn-XNN3DGDF.js.map} +0 -0
  398. /package/dist/{line-item-writes-FZVYSBWK.js.map → line-item-writes-VEJ5Y6X4.js.map} +0 -0
  399. /package/dist/{line-items-44QSYZTE.js.map → line-items-U6L2TMPG.js.map} +0 -0
  400. /package/dist/{link-N7VUZE5R.js.map → link-ENZQAISO.js.map} +0 -0
  401. /package/dist/{linkedin-BP6LWQIS.js.map → linkedin-SY2WZWKP.js.map} +0 -0
  402. /package/dist/{linkedin-person-KPFROM7O.js.map → linkedin-person-3RCX4MI3.js.map} +0 -0
  403. /package/dist/{list-IZ2MUUQ5.js.map → list-AF522LRC.js.map} +0 -0
  404. /package/dist/{list-OW5UIFI3.js.map → list-GPTYUCSX.js.map} +0 -0
  405. /package/dist/{list-VSDOV3QX.js.map → list-VYTHVUDP.js.map} +0 -0
  406. /package/dist/{locations-DNRK7DY4.js.map → locations-7EBZ6KRH.js.map} +0 -0
  407. /package/dist/{log-U5P25U6W.js.map → log-NJR3FJWN.js.map} +0 -0
  408. /package/dist/{make-55LQECUE.js.map → make-4XUB6RSF.js.map} +0 -0
  409. /package/dist/{map-QSBCVWNW.js.map → map-LIYQCWXU.js.map} +0 -0
  410. /package/dist/{mcp-4VUUHCWJ.js.map → mcp-QDOAKB3A.js.map} +0 -0
  411. /package/dist/{media-sources-B36AGK4K.js.map → media-sources-LFSDIPUB.js.map} +0 -0
  412. /package/dist/{members-O5MYSZ6W.js.map → members-KGKQQFMN.js.map} +0 -0
  413. /package/dist/{metrics-P4QDFCVB.js.map → metrics-WRERNMRK.js.map} +0 -0
  414. /package/dist/{normalize-6YBZQ6MJ.js.map → normalize-DQPKM3MG.js.map} +0 -0
  415. /package/dist/{options-WCJ4SZ4Q.js.map → options-XIH7YPEG.js.map} +0 -0
  416. /package/dist/{organization-RKV7KDMQ.js.map → organization-BUSXIGA4.js.map} +0 -0
  417. /package/dist/{performance-JZ2IUWJX.js.map → performance-PU4NHFUE.js.map} +0 -0
  418. /package/dist/{performance-ASGNJQTT.js.map → performance-Y2DTYSFV.js.map} +0 -0
  419. /package/dist/{preview-SMFKMMZU.js.map → preview-3UOBVP6M.js.map} +0 -0
  420. /package/dist/{promoted-tweet-writes-5VBLE23Q.js.map → promoted-tweet-writes-6Y4MDPBH.js.map} +0 -0
  421. /package/dist/{promoted-tweets-N7XPG3XB.js.map → promoted-tweets-JAR2W6KC.js.map} +0 -0
  422. /package/dist/{publish-ZCVVBT2E.js.map → publish-MDVPC77V.js.map} +0 -0
  423. /package/dist/{query-AQ6HNKW7.js.map → query-3QFT42PG.js.map} +0 -0
  424. /package/dist/{reddit-ZWA4GSD3.js.map → reddit-ZPKVVZGP.js.map} +0 -0
  425. /package/dist/{refresh-GZSPTRQO.js.map → refresh-V34YWN3W.js.map} +0 -0
  426. /package/dist/{release-YQSDFSAD.js.map → release-WRNUOSHB.js.map} +0 -0
  427. /package/dist/{relevant-pages-NZKXWMNA.js.map → relevant-pages-OFKZYWR3.js.map} +0 -0
  428. /package/dist/{remove-IC6XZSLZ.js.map → remove-HKWV7P27.js.map} +0 -0
  429. /package/dist/{reopen-4D4S5TFN.js.map → reopen-VHHYVAKC.js.map} +0 -0
  430. /package/dist/{rerun-QCV3QX2U.js.map → rerun-THE43RCG.js.map} +0 -0
  431. /package/dist/{research-XRKLDLK3.js.map → research-773Y7GT4.js.map} +0 -0
  432. /package/dist/{research-SPWJYSF3.js.map → research-G5A2WXVK.js.map} +0 -0
  433. /package/dist/{reset-MTSRIAXC.js.map → reset-GFJ3AKF5.js.map} +0 -0
  434. /package/dist/{reset-RPHQ6R4T.js.map → reset-MVTWA3HT.js.map} +0 -0
  435. /package/dist/{resolve-F4Q7TPBU.js.map → resolve-JRSSTIAF.js.map} +0 -0
  436. /package/dist/{retry-ZJYQRVXA.js.map → retry-AGHA6IVT.js.map} +0 -0
  437. /package/dist/{retry-EY4VUCWE.js.map → retry-LDJ6FZCZ.js.map} +0 -0
  438. /package/dist/{revenue-MWDAUG2M.js.map → revenue-Q2JK5VY6.js.map} +0 -0
  439. /package/dist/{rules-LIHB6YIY.js.map → rules-4A25K2P7.js.map} +0 -0
  440. /package/dist/{rules-add-6NIC4BSS.js.map → rules-add-GT7NCUB3.js.map} +0 -0
  441. /package/dist/{run-TSLHGOVM.js.map → run-NFLKYVIC.js.map} +0 -0
  442. /package/dist/{run-K3ZTVHXF.js.map → run-ZLHQNLCF.js.map} +0 -0
  443. /package/dist/{scaffold-ad-G4GPAJNA.js.map → scaffold-ad-AJN67FWG.js.map} +0 -0
  444. /package/dist/{scaffold-static-ad-5G4T4QOV.js.map → scaffold-static-ad-L6KXZ3TN.js.map} +0 -0
  445. /package/dist/{scaffold-video-BCQTXK3B.js.map → scaffold-video-XQBZZ5TZ.js.map} +0 -0
  446. /package/dist/{schedule-6AEZXHSM.js.map → schedule-45CJDHIX.js.map} +0 -0
  447. /package/dist/{scheduled-agents-4ALAF7S2.js.map → scheduled-agents-72MWHK63.js.map} +0 -0
  448. /package/dist/{schema-G2RFAHMC.js.map → schema-VX66FH4O.js.map} +0 -0
  449. /package/dist/{search-QXTEVPDB.js.map → search-Y6TS5UZS.js.map} +0 -0
  450. /package/dist/{select-BDE4444H.js.map → select-MZ2U7U5U.js.map} +0 -0
  451. /package/dist/{set-prompt-BJGXSGF7.js.map → set-prompt-YH6PXNXB.js.map} +0 -0
  452. /package/dist/{setup-links-PI6HRHB3.js.map → setup-links-Y4YYDQBK.js.map} +0 -0
  453. /package/dist/{shopify-RTWQDLMB.js.map → shopify-HGFUHYT7.js.map} +0 -0
  454. /package/dist/{site-F5YCQRXX.js.map → site-WZ654OP3.js.map} +0 -0
  455. /package/dist/{sources-AIY3SEIE.js.map → sources-7ZFY3VEZ.js.map} +0 -0
  456. /package/dist/{sources-JBOEVF5L.js.map → sources-FCBFLR2J.js.map} +0 -0
  457. /package/dist/{stale-R63TSO5I.js.map → stale-VSSDVB4H.js.map} +0 -0
  458. /package/dist/{status-NXZSC3WG.js.map → status-L7LYUD3F.js.map} +0 -0
  459. /package/dist/{stock-WUOFRG3K.js.map → stock-73PLAUYU.js.map} +0 -0
  460. /package/dist/{sync-4T577GH4.js.map → sync-XBC3PSSV.js.map} +0 -0
  461. /package/dist/{sync-definition-IRW4MSRQ.js.map → sync-definition-IM2NY5QC.js.map} +0 -0
  462. /package/dist/{tags-DVWORXQR.js.map → tags-2KNOJ7A6.js.map} +0 -0
  463. /package/dist/{tags-VS37KZCM.js.map → tags-COALQ2CT.js.map} +0 -0
  464. /package/dist/{tags-VAPD3LWN.js.map → tags-HCJTTLSR.js.map} +0 -0
  465. /package/dist/{tags-R66INE52.js.map → tags-MVC56SHA.js.map} +0 -0
  466. /package/dist/{tags-24RR4Q2Y.js.map → tags-UNUZVGUA.js.map} +0 -0
  467. /package/dist/{targeting-criteria-CR5VHR35.js.map → targeting-criteria-SMBIEM7U.js.map} +0 -0
  468. /package/dist/{targets-MF2K7JRS.js.map → targets-BNH37YAQ.js.map} +0 -0
  469. /package/dist/{testimonials-J6FUERA2.js.map → testimonials-IIAT5IDM.js.map} +0 -0
  470. /package/dist/{themes-WMZJWXFT.js.map → themes-5HKRO5RR.js.map} +0 -0
  471. /package/dist/{top-companies-ZEFG2CVI.js.map → top-companies-PY2NL2GS.js.map} +0 -0
  472. /package/dist/{transcript-O2UOSI54.js.map → transcript-7WFXVRVW.js.map} +0 -0
  473. /package/dist/{translate-DZAZAUI2.js.map → translate-IPTYPZF6.js.map} +0 -0
  474. /package/dist/{triggers-NQMVL755.js.map → triggers-RBD2XGNG.js.map} +0 -0
  475. /package/dist/{unlink-2RGEODVO.js.map → unlink-5IMEUVIS.js.map} +0 -0
  476. /package/dist/{unstage-KLYI3EMB.js.map → unstage-DSOVSWEK.js.map} +0 -0
  477. /package/dist/{update-ZUB7IM4K.js.map → update-7JVV5ZL3.js.map} +0 -0
  478. /package/dist/{update-CVUA6TTH.js.map → update-FIU2ECYQ.js.map} +0 -0
  479. /package/dist/{update-YUMXVVIV.js.map → update-HSS6CVUK.js.map} +0 -0
  480. /package/dist/{update-HDI54TX2.js.map → update-XWL3Q5QY.js.map} +0 -0
  481. /package/dist/{upload-RARJSXYY.js.map → upload-B5SM33MK.js.map} +0 -0
  482. /package/dist/{url-options-QLDSJ7QJ.js.map → url-options-4J3FRXHO.js.map} +0 -0
  483. /package/dist/{url-params-YRMDSBOO.js.map → url-params-TGCGWKAJ.js.map} +0 -0
  484. /package/dist/{validate-NG3O63DD.js.map → validate-4NXKYAL2.js.map} +0 -0
  485. /package/dist/{videos-IWTKAIJL.js.map → videos-FMV4AVB2.js.map} +0 -0
  486. /package/dist/{viewer-check-JNFFC5IK.js.map → viewer-check-2W6BTVQV.js.map} +0 -0
  487. /package/dist/{web-VR6XXNL6.js.map → web-K2EMYVCD.js.map} +0 -0
  488. /package/dist/{winning-ads-M6UG74BB.js.map → winning-ads-Q3RXH7EC.js.map} +0 -0
  489. /package/dist/{write-commands-6OHNL3UR.js.map → write-commands-VQPEHKH7.js.map} +0 -0
  490. /package/dist/{x-TSLM5O2T.js.map → x-PW43O6JS.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../api/src/ads-google/limits.ts","../../api/src/ads-google/conversion-upload.ts","../../api/src/ads-google/bidding-matrix.ts","../../api/src/ads-google/channel-settings.ts","../../api/src/ads-google/geo-constants.ts","../../../node_modules/.pnpm/tldts-core@7.4.15/node_modules/tldts-core/src/domain.ts","../../../node_modules/.pnpm/tldts-core@7.4.15/node_modules/tldts-core/src/domain-without-suffix.ts","../../../node_modules/.pnpm/tldts-core@7.4.15/node_modules/tldts-core/src/extract-hostname.ts","../../../node_modules/.pnpm/tldts-core@7.4.15/node_modules/tldts-core/src/is-ip.ts","../../../node_modules/.pnpm/tldts-core@7.4.15/node_modules/tldts-core/src/is-special-use.ts","../../../node_modules/.pnpm/tldts-core@7.4.15/node_modules/tldts-core/src/is-valid.ts","../../../node_modules/.pnpm/tldts-core@7.4.15/node_modules/tldts-core/src/options.ts","../../../node_modules/.pnpm/tldts-core@7.4.15/node_modules/tldts-core/src/subdomain.ts","../../../node_modules/.pnpm/tldts-core@7.4.15/node_modules/tldts-core/src/factory.ts","../../../node_modules/.pnpm/tldts-core@7.4.15/node_modules/tldts-core/src/lookup/fast-path.ts","../../../node_modules/.pnpm/tldts@7.4.15/node_modules/tldts/src/data/trie.ts","../../../node_modules/.pnpm/tldts@7.4.15/node_modules/tldts/src/suffix-trie.ts","../../../node_modules/.pnpm/tldts@7.4.15/node_modules/tldts/index.ts","../../api/src/ads-google/criteria.ts","../../api/src/ads-google/structured-snippet-headers.ts","../../api/src/ads-google/ops.ts","../../api/src/ads-google/wire.ts"],"sourcesContent":["/**\n * Single source of truth for Google Ads API write constraints (v23). Every zod\n * schema in `ops.ts` reads from here — no scattered literals. Money is in\n * micros (major currency × 1,000,000) everywhere the API expects it.\n */\n\nexport const GOOGLE_ADS_LIMITS = {\n budget: {\n nameMax: 255,\n amountMicrosMin: 1,\n },\n campaign: {\n nameMax: 255,\n /** `campaign.final_url_suffix` — the query string appended to every final URL under the campaign. */\n finalUrlSuffixMax: 2048,\n /** `campaign.tracking_url_template` — the click-measurement URL every ad routes through. */\n trackingUrlTemplateMax: 2048,\n /** `campaign.url_custom_parameters` — Google caps a single entity at 8 `{_name}` parameters. */\n urlCustomParametersMax: 8,\n urlCustomParameterKeyMax: 16,\n urlCustomParameterValueMax: 250,\n /** `campaign.text_guidelines.term_exclusions` — words AI Max and Performance Max must never write. */\n termExclusionsMax: 25,\n termExclusionMax: 30,\n /** `campaign.text_guidelines.messaging_restrictions` — freeform rules for generated text. */\n messagingRestrictionsMax: 40,\n messagingRestrictionMax: 300,\n },\n adGroup: {\n nameMax: 255,\n },\n keyword: {\n textMax: 80,\n wordsMax: 10,\n },\n responsiveSearchAd: {\n headlinesMin: 3,\n headlinesMax: 15,\n headlineTextMax: 30,\n descriptionsMin: 2,\n descriptionsMax: 4,\n descriptionTextMax: 90,\n pathMax: 15,\n },\n responsiveDisplayAd: {\n headlinesMin: 1,\n headlinesMax: 5,\n headlineTextMax: 30,\n longHeadlineTextMax: 90,\n descriptionsMin: 1,\n descriptionsMax: 5,\n descriptionTextMax: 90,\n businessNameMax: 25,\n },\n appAd: {\n headlinesMin: 1,\n headlinesMax: 5,\n headlineTextMax: 30,\n descriptionsMin: 1,\n descriptionsMax: 5,\n descriptionTextMax: 90,\n imagesMax: 20,\n youtubeVideosMax: 20,\n },\n /** `DemandGenMultiAssetAdInfo` — the image-carrying Demand Gen ad. No long headline exists on it. */\n demandGenAd: {\n adNameMax: 255,\n headlinesMin: 1,\n headlinesMax: 5,\n headlineTextMax: 40,\n descriptionsMin: 1,\n descriptionsMax: 5,\n descriptionTextMax: 90,\n businessNameMax: 25,\n },\n /**\n * `DemandGenVideoResponsiveAdInfo` — the Demand Gen ad that runs a YouTube video. It is the only\n * ad format with BOTH a headline list and a long-headline list, which is why its copy has no home\n * in `demandGenAd`: every content schema is strict, so a payload naming `longHeadlines` there is\n * refused, and before this format existed a served Demand Gen video ad could not be edited at all.\n */\n demandGenVideoAd: {\n adNameMax: 255,\n headlinesMin: 1,\n headlinesMax: 5,\n headlineTextMax: 40,\n longHeadlinesMin: 1,\n longHeadlinesMax: 5,\n longHeadlineTextMax: 90,\n descriptionsMin: 1,\n descriptionsMax: 5,\n descriptionTextMax: 90,\n businessNameMax: 25,\n },\n sharedSet: {\n nameMax: 255,\n },\n asset: {\n sitelinkLinkTextMax: 25,\n sitelinkDescriptionMax: 35,\n calloutTextMax: 25,\n // A snippet's HEADER has no length limit of its own — it has to be one of\n // Google's published headers (`structured-snippet-headers.ts`), the longest\n // of which is 29 characters. Only the values are capped.\n structuredSnippetValuesMin: 3,\n structuredSnippetValuesMax: 10,\n /**\n * Per VALUE, not per asset. Google rejects a 26-character value with a bare \"Too long.\" at\n * `structured_snippet_asset.values[i]` — one red row inside an otherwise clean publish, plus\n * every link that depends on the asset. Confirmed live on v23: \"Bases de datos vectoriales\"\n * (26) rejected, its four neighbours accepted.\n */\n structuredSnippetValueMax: 25,\n },\n conversionAction: {\n nameMax: 255,\n },\n audience: {\n nameMax: 255,\n /** `membership_life_span` and a rule's lookback window top out at 540 days. */\n membershipLifeSpanDaysMax: 540,\n },\n biddingStrategy: {\n nameMax: 255,\n },\n label: {\n nameMax: 255,\n },\n assetGroup: {\n nameMax: 255,\n headlinesMin: 3,\n headlinesMax: 15,\n headlineTextMax: 30,\n longHeadlinesMin: 1,\n longHeadlinesMax: 5,\n longHeadlineTextMax: 90,\n descriptionsMin: 2,\n descriptionsMax: 5,\n descriptionTextMax: 90,\n businessNameMax: 25,\n },\n /** A Performance Max asset group's signals: its search themes and its one combined audience. */\n assetGroupSignal: {\n searchThemesMax: 25,\n searchThemeTextMax: 80,\n audiencesMax: 1,\n },\n} as const;\n\n/**\n * Most rows one `/api/ads/google/query` read returns — the route refuses a larger `pageSize`, the CLI a\n * larger `--limit` or statement LIMIT. Google pages at 10000, but a Convex function returns at most 8192\n * array items, so a larger page fails the route as a bare internal error.\n */\nexport const GOOGLE_ADS_QUERY_MAX_PAGE_SIZE = 8192;\n\nexport const KEYWORD_MATCH_TYPES = [\"EXACT\", \"PHRASE\", \"BROAD\"] as const;\nexport type GoogleKeywordMatchType = (typeof KEYWORD_MATCH_TYPES)[number];\n\n/**\n * The campaign types Baker can CREATE. Its one consumer is `campaignCreateSchema.channelType`, so\n * this is a write-side allowlist, not a vocabulary — GAQL reads never pass through it.\n *\n * A type is here only once its required settings are staged fields with a builder and, where they\n * name something outside the campaign, a stage-time precheck (`channel-settings.ts`; backend\n * `channelLinks.ts`). Every other channel was sent to Google as a validateOnly create on v25\n * (2026-10-08) and refused, so each is answered by {@link CHANNEL_CREATE_REFUSALS} with why and what\n * to do instead: VIDEO is `MUTATE_NOT_ALLOWED` for every sub-type and bidding; LOCAL's\n * `local_campaign_setting` is `OPERATION_NOT_PERMITTED_FOR_CONTEXT` (Local campaigns became\n * Performance Max); SMART's business setting is `RESOURCE_DOES_NOT_SUPPORT_VALIDATE_ONLY`, so no\n * draft holding one could be validated.\n */\nexport const ADVERTISING_CHANNEL_TYPES = [\n \"SEARCH\",\n \"DISPLAY\",\n \"PERFORMANCE_MAX\",\n \"DEMAND_GEN\",\n \"SHOPPING\",\n \"MULTI_CHANNEL\",\n \"TRAVEL\",\n \"HOTEL\",\n] as const;\nexport type GoogleAdvertisingChannelType = (typeof ADVERTISING_CHANNEL_TYPES)[number];\n\n/** Why each channel Baker does not create is refused — the route, in words a marketer acts on. */\nexport const CHANNEL_CREATE_REFUSALS: Readonly<Record<string, string>> = {\n VIDEO:\n \"Google does not allow Video campaigns to be created through its API. To run video on YouTube, stage a Demand Gen campaign with a Demand Gen video ad; for a Video views or reach campaign, ask the user to create it in Google Ads.\",\n LOCAL:\n \"Google retired Local campaigns — they became Performance Max. Stage a PERFORMANCE_MAX campaign with store-visit goals instead.\",\n APP: \"An App campaign is channel MULTI_CHANNEL with channelSubType APP_CAMPAIGN (installs) or APP_CAMPAIGN_FOR_ENGAGEMENT, plus appCampaignSetting.\",\n SMART:\n \"Baker can't create Smart campaigns: their business details (phone, website, business profile) are a setting Google refuses to check before publishing, so the change could never be validated. Stage a Search or Performance Max campaign instead, or ask the user to create the Smart campaign in Google Ads.\",\n LOCAL_SERVICES:\n \"Local Services campaigns are created by Google's own Local Services setup, not through the API. Ask the user to set it up in Google Ads.\",\n DISCOVERY: \"Discovery campaigns are now Demand Gen — stage a DEMAND_GEN campaign instead.\",\n};\n\n/**\n * Sub-types still accepted on a channel Google lets the API create (validateOnly creates on v25):\n * DISPLAY_MOBILE_APP with Manual CPC; APP_CAMPAIGN and APP_CAMPAIGN_FOR_ENGAGEMENT (one is required on\n * an App campaign); TRAVEL_ACTIVITIES (required on Travel — sent when a Travel create leaves it out).\n */\nexport const ADVERTISING_CHANNEL_SUB_TYPES = [\n \"DISPLAY_MOBILE_APP\",\n \"APP_CAMPAIGN\",\n \"APP_CAMPAIGN_FOR_ENGAGEMENT\",\n \"TRAVEL_ACTIVITIES\",\n] as const;\n\n/** The channel each sub-type belongs to — a sub-type on any other channel is refused. */\nexport const SUB_TYPE_CHANNEL: Readonly<Record<(typeof ADVERTISING_CHANNEL_SUB_TYPES)[number], string>> = {\n DISPLAY_MOBILE_APP: \"DISPLAY\",\n APP_CAMPAIGN: \"MULTI_CHANNEL\",\n APP_CAMPAIGN_FOR_ENGAGEMENT: \"MULTI_CHANNEL\",\n TRAVEL_ACTIVITIES: \"TRAVEL\",\n};\n\nconst RETIRED_SUB_TYPE = \"Google retired this campaign sub-type — it can no longer be created.\";\n\n/**\n * Sub-types Google refuses on v25, each answered live (2026-10-08): Express and Gmail are\n * `MUTATE_NOT_ALLOWED` / `ENUM_VALUE_NOT_PERMITTED`, Smart Display and Smart Shopping are not\n * permitted, Video's are part of a channel the API cannot create, and two are not in v25's enum at\n * all (a request-level 400 for the whole window).\n */\nexport const SUB_TYPE_CREATE_REFUSALS: Readonly<Record<string, string>> = {\n SEARCH_EXPRESS: `${RETIRED_SUB_TYPE} Stage a standard Search campaign (leave the sub-type out).`,\n DISPLAY_EXPRESS: `${RETIRED_SUB_TYPE} Stage a standard Display campaign (leave the sub-type out).`,\n DISPLAY_GMAIL_AD: `${RETIRED_SUB_TYPE} Gmail ads now run through Demand Gen — stage a DEMAND_GEN campaign.`,\n DISPLAY_SMART_CAMPAIGN: `${RETIRED_SUB_TYPE} Stage a standard Display campaign, or Performance Max.`,\n SHOPPING_SMART_ADS: `${RETIRED_SUB_TYPE} Smart Shopping became Performance Max — stage a PERFORMANCE_MAX campaign.`,\n SHOPPING_COMPARISON_LISTING_ADS: `${RETIRED_SUB_TYPE} Ask the user to create a comparison-listing campaign in Google Ads.`,\n SEARCH_MOBILE_APP: `${RETIRED_SUB_TYPE} App promotion runs through App campaigns — stage MULTI_CHANNEL with sub-type APP_CAMPAIGN.`,\n SEARCH_MOBILE_APP_ENGAGEMENT: `${RETIRED_SUB_TYPE} App promotion runs through App campaigns — stage MULTI_CHANNEL with sub-type APP_CAMPAIGN_FOR_ENGAGEMENT.`,\n APP_CAMPAIGN_FOR_PRE_REGISTRATION:\n \"Baker does not stage pre-registration App campaigns: Google needs the app open for pre-registration and goal settings Baker cannot set. Ask the user to create it in Google Ads.\",\n VIDEO_ACTION: `${RETIRED_SUB_TYPE} Video action campaigns became Demand Gen — stage a DEMAND_GEN campaign.`,\n VIDEO_NON_SKIPPABLE: CHANNEL_CREATE_REFUSALS.VIDEO ?? RETIRED_SUB_TYPE,\n VIDEO_OUTSTREAM: CHANNEL_CREATE_REFUSALS.VIDEO ?? RETIRED_SUB_TYPE,\n LOCAL_CAMPAIGN: CHANNEL_CREATE_REFUSALS.LOCAL ?? RETIRED_SUB_TYPE,\n};\nexport type GoogleAdvertisingChannelSubType = (typeof ADVERTISING_CHANNEL_SUB_TYPES)[number];\n\nexport const BIDDING_STRATEGY_TYPES = [\n \"MANUAL_CPC\",\n \"MAXIMIZE_CONVERSIONS\",\n \"MAXIMIZE_CONVERSION_VALUE\",\n \"TARGET_SPEND\",\n \"TARGET_CPA\",\n \"TARGET_ROAS\",\n \"TARGET_IMPRESSION_SHARE\",\n \"MANUAL_CPM\",\n \"MANUAL_CPV\",\n \"PERCENT_CPC\",\n // Demand Gen's \"maximize clicks at a target CPC\" — `Campaign.target_cpc`, overridable per ad\n // group via `AdGroup.target_cpc_micros`. Confirmed present in v23.\n // It is one of the target-driven strategies governed by the August 2026 budget-limited\n // change, so modelling it as a strategy without a target would leave a Demand Gen\n // campaign's exposure invisible to `biddingTargetWarnings`.\n \"TARGET_CPC\",\n] as const;\nexport type GoogleBiddingStrategyType = (typeof BIDDING_STRATEGY_TYPES)[number];\n\n/**\n * v25 `BrandSafetySuitability` — the account's video inventory setting\n * (`customer.video_brand_safety_suitability`, writable on the customer since v25): expanded shows\n * ads beside the widest range of content, limited beside the narrowest.\n */\nexport const VIDEO_BRAND_SAFETY_LEVELS = [\"EXPANDED_INVENTORY\", \"STANDARD_INVENTORY\", \"LIMITED_INVENTORY\"] as const;\n\n/** v25 `TargetImpressionShareLocation` — where on the results page the share is counted. */\nexport const TARGET_IMPRESSION_SHARE_LOCATIONS = [\"ANYWHERE_ON_PAGE\", \"TOP_OF_PAGE\", \"ABSOLUTE_TOP_OF_PAGE\"] as const;\n\n/**\n * Channels where Google folded the standalone Target CPA / Target ROAS strategies into Maximize\n * conversions / Maximize conversion value (2021). On one of these, the target lives at\n * `campaign.maximize_conversions.target_cpa_micros`, and writing the legacy `campaign.target_cpa`\n * comes back `ContextError.OPERATION_NOT_PERMITTED_FOR_CONTEXT` — confirmed live on v23 against a\n * Search campaign (request GphdG5HKabzlUWQqjGne9w, at\n * `mutate_operations[109].campaign_operation.update.target_cpa`).\n *\n * `SEARCH` alone, deliberately. Google's own announcement of the merge covers Search campaigns, and\n * the field is still the live one on App, Display and Video, where a blanket refusal would block a\n * legitimate edit. The June 2026 relabel that brings \"Target CPA\" back as its own option in the UI\n * is cosmetic — it renames the same Maximize-conversions-with-a-target strategy and does not make\n * `campaign.target_cpa` settable again. Widen this set only against a live rejection, the way this\n * entry was earned.\n */\nconst MERGED_TARGET_STRATEGY_CHANNELS = new Set([\"SEARCH\"]);\n\n/**\n * Shared by the CLI-boundary refusal on a campaign create, the stage-time refusal on a campaign\n * update, and the publish-time humanizer — so all three tell the user the same thing.\n *\n * Names the route, because the strategy the user asked for is not gone: it is the same bidding under\n * the name Google now files it under, one flag away. Saying only \"not allowed\" would send a marketer\n * looking for a setting that no longer exists.\n */\nexport const MERGED_TARGET_CPA_MESSAGE =\n \"Google doesn't accept Target CPA as a bidding strategy of its own on a Search campaign — the target sits inside Maximize conversions. Choose Maximize conversions and give it the same target CPA; it bids exactly the same.\";\n\n/** The Target ROAS half of {@link MERGED_TARGET_CPA_MESSAGE}. */\nexport const MERGED_TARGET_ROAS_MESSAGE =\n \"Google doesn't accept Target ROAS as a bidding strategy of its own on a Search campaign — the target sits inside Maximize conversion value. Choose Maximize conversion value and give it the same target ROAS; it bids exactly the same.\";\n\n/**\n * Why this inline bidding strategy can't be set on this campaign, or undefined to let it through.\n *\n * Only a positively-read channel refuses: an unknown channel (a stage-time read that missed, an\n * op that never carried one) falls through to publish, where the partial-failure isolation and the\n * humanized message are the backstop. Blocking a legitimate change is worse than failing one.\n *\n * Portfolio strategies are not covered on purpose — `BiddingStrategy` still takes a standalone\n * `target_cpa` / `target_roas`, and a Search campaign may point at one.\n */\nexport function mergedTargetStrategyRefusal(\n channelType: string | undefined,\n biddingType: string | undefined,\n): string | undefined {\n if (channelType === undefined || !MERGED_TARGET_STRATEGY_CHANNELS.has(channelType)) {\n return undefined;\n }\n if (biddingType === \"TARGET_CPA\") {\n return MERGED_TARGET_CPA_MESSAGE;\n }\n return biddingType === \"TARGET_ROAS\" ? MERGED_TARGET_ROAS_MESSAGE : undefined;\n}\n\n/**\n * The route out of {@link EMBEDDED_TARGET_CPA_DEMAND_GEN_MESSAGE} — named, not just refused, because\n * the bidding the user asked for is available here, under the other spelling.\n */\nexport const EMBEDDED_TARGET_CPA_DEMAND_GEN_MESSAGE =\n \"Google doesn't accept a target CPA inside Maximize conversions on a Demand Gen campaign — there the target is its own bidding strategy. Choose Target CPA and give it the same target; it bids exactly the same.\";\n\n/**\n * The exact inverse of {@link mergedTargetStrategyRefusal}, and the reason both have to exist.\n *\n * On Search, Google merged Target CPA into Maximize conversions, so the target rides inside that\n * strategy and a standalone `TARGET_CPA` is refused. On Demand Gen the opposite holds: the target is\n * its own strategy, and `maximize_conversions.target_cpa_micros` is refused. So the single rule\n * \"put the target inside Maximize conversions\" — correct on Search, and the one the CLI's own\n * `--target-cpa` help teaches — publishes a rejected op the moment it is applied to a Demand Gen\n * campaign. That is not hypothetical: two campaigns on one account, both\n * `{\"maximizeConversions\":{\"targetCpaMicros\":…}}` with `updateMask` `maximizeConversions.targetCpaMicros`,\n * both answered `OPERATION_NOT_PERMITTED_FOR_CONTEXT` (\"The operation is not allowed for the given\n * context.\") after the Session had already merged and gone live.\n *\n * `DEMAND_GEN` alone, and Target CPA alone, deliberately — the same discipline the Search entry\n * documents. Maximize conversion value's embedded `target_roas` was refused here too once Google was\n * asked (v25, 2026-10-09); that one lives with the other channels' in `embeddedTargetRefusal`.\n */\nexport function embeddedTargetOnDemandGenRefusal(\n channelType: string | undefined,\n bidding: { type?: string; targetCpaMicros?: number } | undefined,\n): string | undefined {\n if (channelType !== \"DEMAND_GEN\" || bidding?.type !== \"MAXIMIZE_CONVERSIONS\") {\n return undefined;\n }\n return bidding.targetCpaMicros === undefined ? undefined : EMBEDDED_TARGET_CPA_DEMAND_GEN_MESSAGE;\n}\n\n/** The route out of {@link manualCpcOnDemandGenRefusal}, naming bidding that has been published on this channel. */\nexport const MANUAL_CPC_DEMAND_GEN_MESSAGE =\n \"Google doesn't accept Manual CPC on a Demand Gen campaign. Choose Maximize conversions (with a Target CPA as its own strategy if you have a target), or Target CPC, which exists on this channel alone.\";\n\n/**\n * Manual CPC on Demand Gen, the third per-channel bidding rule and the one that was being actively\n * taught: the Demand Gen playbook that ships in every sandbox said to use `MANUAL_CPC` \"as the click\n * proxy\" for prospecting. Google answers the create with `OPERATION_NOT_PERMITTED_FOR_CONTEXT` at\n * `campaign_operation.create.manual_cpc`, and because a campaign create is one operation inside an\n * atomic batch, the ad group, the ad and every asset staged with it fail too. Confirmed live on v23,\n * then confirmed the other way by publishing the same campaign with `MAXIMIZE_CONVERSIONS`.\n *\n * Same discipline as its siblings: `DEMAND_GEN` alone, `MANUAL_CPC` alone, and an unread channel\n * falls through to publish.\n */\nexport function manualCpcOnDemandGenRefusal(\n channelType: string | undefined,\n biddingType: string | undefined,\n): string | undefined {\n return channelType === \"DEMAND_GEN\" && biddingType === \"MANUAL_CPC\" ? MANUAL_CPC_DEMAND_GEN_MESSAGE : undefined;\n}\n\n/** The Demand-Gen-only half of {@link MERGED_TARGET_CPA_MESSAGE}, and named the same way: route, not verdict. */\nexport const TARGET_CPC_DEMAND_GEN_MESSAGE =\n \"Google only accepts Target CPC on a Demand Gen campaign — no other campaign type has a target CPC. Pick the bidding this campaign's type supports (Maximize conversions with a target CPA on Search), or set the target CPC on the Demand Gen campaign that should carry it.\";\n\n/**\n * The mirror image of {@link mergedTargetStrategyRefusal}: that one names the channels a strategy is\n * refused ON, this one names the only channel a strategy is accepted on. `Campaign.target_cpc` exists\n * on Demand Gen alone, so the same op staged against Search, Display or Video passes every payload\n * check and then fails the whole atomic publish batch.\n *\n * Same conservatism, for the same reason: an unknown channel falls through to publish rather than\n * blocking a change that may well be legitimate.\n */\nexport function demandGenOnlyStrategyRefusal(\n channelType: string | undefined,\n biddingType: string | undefined,\n): string | undefined {\n if (biddingType !== \"TARGET_CPC\" || channelType === undefined || channelType === \"DEMAND_GEN\") {\n return undefined;\n }\n return TARGET_CPC_DEMAND_GEN_MESSAGE;\n}\n\n/**\n * `campaign.geo_target_type_setting` — Google's \"Location options\": who a location targets.\n *\n * `PRESENCE_OR_INTEREST` is what Google applies when the setting is omitted on a create, so a\n * campaign staged without it goes live reaching people merely *interested* in the location.\n * `SEARCH_INTEREST` is in the proto but no longer settable (Google retired it in 2023), so it is\n * deliberately absent — offering it would stage an op that fails the whole atomic publish batch.\n */\nexport const POSITIVE_GEO_TARGET_TYPES = [\"PRESENCE_OR_INTEREST\", \"PRESENCE\"] as const;\nexport type GooglePositiveGeoTargetType = (typeof POSITIVE_GEO_TARGET_TYPES)[number];\n\n/** Exclusions: `PRESENCE` (Google's default) excludes only people in the location. */\nexport const NEGATIVE_GEO_TARGET_TYPES = [\"PRESENCE_OR_INTEREST\", \"PRESENCE\"] as const;\nexport type GoogleNegativeGeoTargetType = (typeof NEGATIVE_GEO_TARGET_TYPES)[number];\n\n/**\n * `STANDARD` alone. Google still STORES an `ACCELERATED` budget, but refuses to attach one to a\n * campaign — \"Cannot use accelerated delivery method on this budget\" on a real PAUSED Search create\n * (v25, 2026-10-08) — so it could only publish a budget nothing can spend, or fail the campaign\n * staged with it. A validateOnly request on the budget alone says yes, which is why it lasted.\n */\nexport const BUDGET_DELIVERY_METHODS = [\"STANDARD\"] as const;\nexport type GoogleBudgetDeliveryMethod = (typeof BUDGET_DELIVERY_METHODS)[number];\n\nexport const ACCELERATED_DELIVERY_MESSAGE =\n \"Google no longer runs accelerated delivery: a budget set to it cannot be attached to any campaign. Leave delivery at STANDARD (Google paces the budget across the day); to spend faster, raise the daily amount instead.\";\n\n/**\n * A zod `error` map for a retired enum value: the value's own explanation, or undefined to keep\n * zod's message for anything else. A retired value is answered with the route, not a bare\n * \"invalid option\", because the agent's next move depends on it.\n */\nexport function retiredChoiceError(retired: Readonly<Record<string, string>>) {\n return (issue: { input?: unknown }): string | undefined =>\n typeof issue.input === \"string\" ? retired[issue.input] : undefined;\n}\n\n/**\n * Mirrors v23's `AdGroupTypeEnum.AdGroupType`. Two values that were here are not in it:\n * `DEMAND_GEN_AD` and `VIDEO_OUTSTREAM`.\n *\n * `DEMAND_GEN_AD` was rejected live while publishing a Demand Gen video ad, with a request-level\n * `Invalid value at '…ad_group_operation.create.type'` — not a partial failure: it takes the WHOLE\n * mutate batch down, so the budget, campaign, asset and ad staged alongside it all failed with the\n * ad group's error. `VIDEO_OUTSTREAM` was never published, so it was confirmed the cheap way\n * instead — the API refuses a query filtering `ad_group.type = 'VIDEO_OUTSTREAM'` where\n * `'VIDEO_RESPONSIVE'` answers, and neither the name nor its old enum number is in v23.\n * `VIDEO_RESPONSIVE` and `VIDEO_EFFICIENT_REACH` are two v23 values Baker never offered.\n *\n * **A Demand Gen ad group has no type of its own**: the enum has no value for it, and Google derives\n * it from the campaign's channel when `type` is left unset — which is why `type` is now optional\n * rather than defaulted (see `adGroupCreateSchema`).\n */\nexport const AD_GROUP_TYPES = [\n \"SEARCH_STANDARD\",\n \"DISPLAY_STANDARD\",\n \"SHOPPING_PRODUCT_ADS\",\n \"VIDEO_BUMPER\",\n \"VIDEO_TRUE_VIEW_IN_STREAM\",\n \"VIDEO_TRUE_VIEW_IN_DISPLAY\",\n \"VIDEO_NON_SKIPPABLE_IN_STREAM\",\n \"VIDEO_RESPONSIVE\",\n \"VIDEO_EFFICIENT_REACH\",\n] as const;\nexport type GoogleAdGroupType = (typeof AD_GROUP_TYPES)[number];\n\nexport const SHARED_SET_TYPES = [\n \"NEGATIVE_KEYWORDS\",\n \"NEGATIVE_PLACEMENTS\",\n \"ACCOUNT_LEVEL_NEGATIVE_KEYWORDS\",\n \"BRANDS\",\n] as const;\nexport type GoogleSharedSetType = (typeof SHARED_SET_TYPES)[number];\n\nexport const AD_FORMATS = [\n \"responsiveSearch\",\n \"responsiveDisplay\",\n \"performanceMaxAssetGroup\",\n \"demandGen\",\n \"app\",\n \"video\",\n] as const;\nexport type GoogleAdFormat = (typeof AD_FORMATS)[number];\n\n/**\n * Google removed the call ad from the API — v25's `Ad` message has no `call_ad`, and a staged one is\n * answered `Unknown name \"callAd\"`: a request-level 400 that fails every change sent with it, not\n * just the ad. A call-only ad cannot be created or edited any more; the phone number now rides on a\n * call asset beside an ordinary responsive search ad.\n */\nexport const CALL_AD_RETIRED_MESSAGE =\n \"Google retired call ads: they can no longer be created or edited. To take phone calls from search, stage a responsive search ad and add the phone number as a call asset in Google Ads (Baker cannot stage call assets yet) — and tell the user that is the one manual step.\";\n\nexport const ENTITY_STATUSES = [\"ENABLED\", \"PAUSED\", \"REMOVED\"] as const;\nexport type GoogleEntityStatus = (typeof ENTITY_STATUSES)[number];\n\n/** Statuses a create op may carry — a create can't be born REMOVED. */\nexport const STAGEABLE_CREATE_STATUSES = [\"ENABLED\", \"PAUSED\"] as const;\n\nexport const PINNED_FIELDS = [\"HEADLINE_1\", \"HEADLINE_2\", \"HEADLINE_3\", \"DESCRIPTION_1\", \"DESCRIPTION_2\"] as const;\nexport type GooglePinnedField = (typeof PINNED_FIELDS)[number];\n\nexport const CONVERSION_ACTION_CATEGORIES = [\n \"DEFAULT\",\n \"PAGE_VIEW\",\n \"PURCHASE\",\n \"SIGNUP\",\n \"LEAD\",\n \"DOWNLOAD\",\n \"ADD_TO_CART\",\n \"BEGIN_CHECKOUT\",\n \"SUBSCRIBE_PAID\",\n \"PHONE_CALL_LEAD\",\n \"SUBMIT_LEAD_FORM\",\n \"BOOK_APPOINTMENT\",\n \"REQUEST_QUOTE\",\n \"CONTACT\",\n] as const;\n\n/**\n * Conversion action types the API can CREATE. `GOOGLE_ANALYTICS_4_CUSTOM` was here and Google answers\n * every create of it \"Creation of this conversion action type isn't supported by Google Ads API\" (v23\n * and v25): GA4 conversions come into Google Ads by importing the property's key events, not by\n * creating an action — see {@link GA4_CONVERSION_CREATE_MESSAGE}.\n */\nexport const CONVERSION_ACTION_TYPES = [\"WEBPAGE\", \"UPLOAD_CLICKS\", \"UPLOAD_CALLS\", \"WEBSITE_CALL\"] as const;\n\nexport const GA4_CONVERSION_CREATE_MESSAGE =\n \"Google Analytics conversions can't be created through Google's API — they are imported. Mark the event as a key event in Google Analytics, make sure the property is linked to Google Ads, and ask the user to import it in Google Ads (Goals → Conversions → New conversion action → Import → Google Analytics 4). To track it with a Google Ads tag instead, create a WEBPAGE conversion.\";\n\nexport const CONVERSION_COUNTING_TYPES = [\"ONE_PER_CLICK\", \"MANY_PER_CLICK\"] as const;\n\n/**\n * Google's `ConversionOrigin` — WHERE a conversion happens. Together with a `ConversionActionCategory`\n * it is the whole key of a `CustomerConversionGoal`, the account-level switch that decides whether a\n * conversion category counts toward automated bidding at all.\n *\n * `UNSPECIFIED` and `UNKNOWN` are deliberately absent. Google returns them, but never keys a real goal\n * on one, so an op carrying either could only address a goal that does not exist — and it would spend\n * a publish to find that out.\n */\nexport const CONVERSION_ORIGINS = [\n \"WEBSITE\",\n \"GOOGLE_HOSTED\",\n \"APP\",\n \"CALL_FROM_ADS\",\n \"STORE\",\n \"YOUTUBE_HOSTED\",\n] as const;\nexport type GoogleConversionOrigin = (typeof CONVERSION_ORIGINS)[number];\n\nexport const USER_LIST_TYPES = [\"CRM_BASED\", \"RULE_BASED\", \"LOGICAL\", \"BASIC\", \"LOOKALIKE\"] as const;\n\n/** Each kind of audience in a marketer's words — never Google's type code on a review or a summary. */\nexport const USER_LIST_TYPE_LABELS: Readonly<Record<(typeof USER_LIST_TYPES)[number], string>> = {\n CRM_BASED: \"Customer list\",\n RULE_BASED: \"Website visitors\",\n LOGICAL: \"Combined audience\",\n BASIC: \"People who converted\",\n LOOKALIKE: \"Lookalike audience\",\n};\n\nexport function userListTypeLabel(type: string): string | undefined {\n return (USER_LIST_TYPE_LABELS as Readonly<Record<string, string>>)[type];\n}\n\n/** v25 `UserListStringRuleItemOperator` — how a website-visitor rule compares a URL or parameter. */\nexport const USER_LIST_STRING_OPERATORS = [\n \"CONTAINS\",\n \"EQUALS\",\n \"STARTS_WITH\",\n \"ENDS_WITH\",\n \"NOT_EQUALS\",\n \"NOT_CONTAINS\",\n \"NOT_STARTS_WITH\",\n \"NOT_ENDS_WITH\",\n] as const;\n\n/** v25 `UserListNumberRuleItemOperator`, for a numeric custom parameter. */\nexport const USER_LIST_NUMBER_OPERATORS = [\n \"GREATER_THAN\",\n \"GREATER_THAN_OR_EQUAL\",\n \"EQUALS\",\n \"NOT_EQUALS\",\n \"LESS_THAN\",\n \"LESS_THAN_OR_EQUAL\",\n] as const;\n\n/** v25 `UserListLogicalRuleOperator`: a combined audience's rule takes ALL, ANY or NONE of its lists. */\nexport const USER_LIST_LOGICAL_OPERATORS = [\"ALL\", \"ANY\", \"NONE\"] as const;\n\n/** v25 `LookalikeExpansionLevel` — how far past the seed lists a lookalike reaches. */\nexport const LOOKALIKE_EXPANSION_LEVELS = [\"NARROW\", \"BALANCED\", \"BROAD\"] as const;\n\n/**\n * The targeting dimensions a `TargetingSetting.target_restrictions` row can name. Baker only ever\n * SETS the AUDIENCE one; the rest are here because a write replaces the whole repeated field, so\n * every dimension already on the account has to be readable in order to be sent back untouched.\n */\nexport const TARGETING_DIMENSIONS = [\n \"KEYWORD\",\n \"AUDIENCE\",\n \"TOPIC\",\n \"GENDER\",\n \"AGE_RANGE\",\n \"PLACEMENT\",\n \"PARENTAL_STATUS\",\n \"INCOME_RANGE\",\n] as const;\nexport type GoogleTargetingDimension = (typeof TARGETING_DIMENSIONS)[number];\n\nexport const ASSET_TYPES = [\n \"text\",\n \"image\",\n \"youtubeVideo\",\n \"sitelink\",\n \"callout\",\n \"structuredSnippet\",\n \"callToAction\",\n] as const;\nexport type GoogleAssetType = (typeof ASSET_TYPES)[number];\n\nexport const ASSET_FIELD_TYPES = [\n \"SITELINK\",\n \"CALLOUT\",\n \"STRUCTURED_SNIPPET\",\n \"CALL\",\n \"PRICE\",\n \"PROMOTION\",\n \"MOBILE_APP\",\n \"HEADLINE\",\n \"DESCRIPTION\",\n \"LOGO\",\n /**\n * Kept because a draft staged before {@link IMAGE_ASSET_LINK_MESSAGE} shipped may still carry one,\n * and because it is the field type an asset-group image occupies. It is refused on an\n * `assetLink.attach` — see that message for what Google actually does with it.\n */\n \"MARKETING_IMAGE\",\n \"BUSINESS_NAME\",\n /**\n * The one image link a Search campaign takes. It carries the advertiser's logo beside the ad and\n * is the only image field type that survives Google's field-type check at all — swept live on v23\n * and v25, campaign and customer level both answer `CUSTOMER_NOT_VERIFIED` (an account fact,\n * fixed by advertiser verification) rather than a field-type refusal. Ad group level is not a\n * level Google links it at — see {@link BUSINESS_LOGO_LEVEL_MESSAGE}.\n */\n \"BUSINESS_LOGO\",\n] as const;\n\n/** The levels Google links a `BUSINESS_LOGO` at: campaign and customer, never ad group. */\nexport const BUSINESS_LOGO_LEVELS = [\"campaign\", \"customer\"] as const;\n\nexport const BUSINESS_LOGO_LEVEL_MESSAGE =\n \"Google links a BUSINESS_LOGO at campaign or customer level only — an ad group link comes back \" +\n \"UNSUPPORTED_FIELD_TYPE. Attach it to the campaign instead.\";\n\n/**\n * The image field types an `assetLink.attach` can name. `AD_IMAGE` is the Search image extension and\n * is decided per account at stage time; the marketing-image ones are Performance Max asset-group\n * slots that no Search link takes.\n */\nconst IMAGE_ASSET_LINK_FIELD_TYPES = new Set([\n \"MARKETING_IMAGE\",\n \"SQUARE_MARKETING_IMAGE\",\n \"PORTRAIT_MARKETING_IMAGE\",\n \"AD_IMAGE\",\n]);\n\n/**\n * Google opens `AD_IMAGE` links (image extensions on Search) per advertiser account, and says so\n * nowhere a read can see. Checked live with `validate_only` on v25, Oct 2026:\n *\n * - Our harness account 3865083115 (no Search spend) answers `UNSUPPORTED_FIELD_TYPE` — \"not\n * supported to be added directly through asset links\" — at campaign, ad group and customer level,\n * on every campaign, on v23–v25. Google's v12 notes ship the field type \"for allowlisted\n * customers\"; the Help Center opens Search images to accounts with 60+ days of history and recent\n * Search spend.\n * - A client account with Search spend validates the very same six-image campaign link clean (200).\n *\n * So the stage asks Google (`adImageLinkVerdict`, `ads/google/writes/stage.ts`): accepted → the link\n * stages and applies at publish like a sitelink; refused → it is skipped with this message and Baker\n * stages the handover Task. `MARKETING_IMAGE` on a Search campaign is always refused\n * (`FIELD_TYPE_INCOMPATIBLE_WITH_CAMPAIGN_TYPE` — the six red rows of the production publish that\n * started this) and is sent back to `AD_IMAGE` with {@link SEARCH_IMAGE_FIELD_TYPE_MESSAGE}.\n *\n * **The upload half is never blocked, and saying otherwise costs the user real work.** In that\n * production publish all six uploads applied and only the links failed, while Baker told the\n * advertiser to upload the images. So a refusal ends in a handover, not a dead end.\n */\nexport const IMAGE_ASSET_LINK_MESSAGE =\n \"Google refuses the LINK, not the upload — so do not stop at this refusal, finish the handover. \" +\n \"Google opens image extensions on Search per advertiser account, and it answered that this account \" +\n \"does not take them through Baker. So stage the image assets anyway: `assets create` with an image \" +\n \"still publishes, and the image lands in the advertiser's Google Ads asset library. This link is skipped rather than \" +\n \"stored, so it costs nothing, and it is what records which images go on which campaign: Baker has \" +\n \"staged the handover Task from it, so do not stage a second one with `baker actions`. Tell the user \" +\n \"the images are already in their Google Ads account and only need adding to the campaign under \" +\n \"Assets — name them. Never tell them to upload the images; they are uploaded. The other image a \" +\n \"Search campaign takes through a link is the advertiser's logo — BUSINESS_LOGO at campaign or \" +\n \"customer level, on a verified account.\";\n\n/**\n * The `AD_IMAGE` link was not confirmed either way: Google's check failed for a reason that is not the\n * account gate, or could not be asked. The handover Task is still staged — a minute in Google Ads\n * beats images left off the campaign — but the agent is not told Google refuses, because it may not.\n */\nexport const IMAGE_LINK_UNCONFIRMED_MESSAGE =\n \"Not staged: Baker could not confirm with Google that this account takes image links on Search \" +\n \"(the check failed for a reason other than the account's own setting), so it staged the handover Task \" +\n \"instead — do not stage a second one with `baker actions`. The images are already in the advertiser's \" +\n \"Google Ads account; tell the user they only need adding to the campaign under Assets, and name them. \" +\n \"Do not tell them Google refuses images on their account — that was not established.\";\n\n/** A marketing-image field type on a campaign/ad group/customer link, which no Search campaign takes. */\nexport const SEARCH_IMAGE_FIELD_TYPE_MESSAGE =\n 'Not staged: a Search image extension links as AD_IMAGE — restage this link with \"fieldType\":\"AD_IMAGE\" in its --file payload. ' +\n \"MARKETING_IMAGE, SQUARE_MARKETING_IMAGE and PORTRAIT_MARKETING_IMAGE are Performance Max asset-group \" +\n \"slots (`asset-groups attach`); Google refuses them on a Search campaign.\";\n\n/** Whether this asset-link field type is an image slot Google refuses through an asset link. */\nexport function isImageAssetLinkFieldType(fieldType: string): boolean {\n return IMAGE_ASSET_LINK_FIELD_TYPES.has(fieldType);\n}\n\n/**\n * `AssetGroupAsset.AssetFieldType` — the field types an asset can occupy inside a Performance Max\n * asset group. A different enum from `ASSET_FIELD_TYPES` above, which types campaign/adGroup/customer\n * `AssetLink`s: this one carries the PMax-only ratios and LONG_HEADLINE, and drops the extension\n * field types (SITELINK/CALLOUT/PRICE/…) that cannot live on an asset group.\n */\nexport const ASSET_GROUP_ASSET_FIELD_TYPES = [\n \"MARKETING_IMAGE\",\n \"SQUARE_MARKETING_IMAGE\",\n \"PORTRAIT_MARKETING_IMAGE\",\n \"LOGO\",\n \"LANDSCAPE_LOGO\",\n \"YOUTUBE_VIDEO\",\n \"HEADLINE\",\n \"LONG_HEADLINE\",\n \"DESCRIPTION\",\n \"BUSINESS_NAME\",\n \"CALL_TO_ACTION_SELECTION\",\n] as const;\nexport type GoogleAssetGroupAssetFieldType = (typeof ASSET_GROUP_ASSET_FIELD_TYPES)[number];\n\nexport const DEVICE_TYPES = [\"MOBILE\", \"TABLET\", \"DESKTOP\", \"CONNECTED_TV\", \"OTHER\"] as const;\nexport const DAYS_OF_WEEK = [\"MONDAY\", \"TUESDAY\", \"WEDNESDAY\", \"THURSDAY\", \"FRIDAY\", \"SATURDAY\", \"SUNDAY\"] as const;\n\n/** Google Ads UI objective — advisory only (drives warnings, not an API field). */\nexport const CAMPAIGN_OBJECTIVES = [\n \"SALES\",\n \"LEADS\",\n \"WEBSITE_TRAFFIC\",\n \"PRODUCT_BRAND_CONSIDERATION\",\n \"BRAND_AWARENESS_REACH\",\n \"APP_PROMOTION\",\n \"LOCAL_STORE_VISITS\",\n] as const;\nexport type GoogleCampaignObjective = (typeof CAMPAIGN_OBJECTIVES)[number];\n\nexport const MICROS_PER_UNIT = 1_000_000;\n\nexport function toMicros(amount: number): number {\n return Math.round(amount * MICROS_PER_UNIT);\n}\n\nexport function fromMicros(micros: number): number {\n return micros / MICROS_PER_UNIT;\n}\n\n/** Indicative daily-budget floor (advisory warning; Google enforces real minimums at apply). */\nexport const PLAYBOOK_DAILY_BUDGET_FLOOR_MICROS = 10 * MICROS_PER_UNIT;\n\nexport const TEMP_REF_PREFIX = \"g_temp_\";\nexport const TEMP_REF_REGEX = /^g_temp_[A-Za-z0-9_-]{2,}$/;\nexport const NUMERIC_ID_REGEX = /^\\d+$/;\n/** A Google Ads resource name, e.g. customers/123/campaigns/456. */\nexport const RESOURCE_NAME_REGEX = /^customers\\/\\d+\\/[A-Za-z]+\\/[-\\w~]+$/;\nexport const GEO_TARGET_CONSTANT_REGEX = /^geoTargetConstants\\/\\d+$/;\nexport const LANGUAGE_CONSTANT_REGEX = /^languageConstants\\/\\d+$/;\n\nexport const SIMULATED_RESOURCE_PREFIX = \"simulated-\";\n\n/**\n * The only image shapes an App campaign ad accepts (`AppAdInfo.images`): landscape 1.91:1,\n * square 1:1, portrait 4:5. A 16:9 image is NOT a landscape App image — it is 7% off 1.91:1\n * and Google rejects the whole ad mutate with \"The aspect ratio of the image does not match\n * the expected aspect ratios provided in the asset spec\", naming nothing.\n */\nexport const APP_AD_IMAGE_ASPECT_RATIOS = [\n { label: \"1.91:1\", ratio: 1.91 },\n { label: \"1:1\", ratio: 1 },\n { label: \"4:5\", ratio: 0.8 },\n] as const;\n\n/**\n * The shapes an `AD_IMAGE` link (a Search image extension) takes: landscape and square. Narrower than\n * the App-ad set on purpose — a shape Google might also take costs a handover Task, a shape it refuses\n * costs a publish failure with the Task already withdrawn.\n */\nexport const SEARCH_IMAGE_ASPECT_RATIOS = [\n { label: \"1.91:1\", ratio: 1.91 },\n { label: \"1:1\", ratio: 1 },\n] as const;\n\n/** Relative tolerance Google allows around each accepted ratio — wide enough for rounding, narrow enough to reject 16:9. */\nexport const APP_AD_IMAGE_ASPECT_TOLERANCE = 0.02;\n","/**\n * Manual conversion upload — the contract for re-sending conversions Google never received.\n *\n * Every other staged Google op describes a change to the ACCOUNT's configuration and applies as a\n * `GoogleAdsService.Mutate` operation. This one describes measurement that already happened and\n * applies through Data Manager `events:ingest` — the same endpoint the server-side tag\n * (`sideEffects/googleAdsCapi`) posts to on every live conversion. It exists for the case that\n * endpoint failed: a connection that had lost the `datamanager` scope, an outage, a tag that was\n * misconfigured for a week. The conversions are real, the account simply never heard about them.\n *\n * Because a conversion is only ever uploaded to REPAIR a gap, the row's `orderId` is required and is\n * the same order id the original submission carried. Google recognises an upload it has already\n * recorded by that id, so a re-send of something that did land is a correction rather than a second\n * conversion — which is what makes a backfill safe to run when nobody is sure how much was lost.\n *\n * Identifiers are hashed before anything is stored: the staged draft, the publish request and the\n * write log all hold SHA-256 hex, never an address. See `writes/conversionUpload.ts`.\n */\nimport { z } from \"zod\";\nimport { NUMERIC_ID_REGEX, RESOURCE_NAME_REGEX } from \"./limits\";\n\n/**\n * Rows per staged op. Well under what `events:ingest` accepts in one request — the ceiling that\n * matters here is the review: a draft card nobody can read is not a change anybody approved, and a\n * backfill larger than this is several days' repair that should stage (and fail) day by day.\n */\nexport const CONVERSION_UPLOAD_MAX_ROWS = 200;\n\n/** A SHA-256 hex digest — what a hashed identifier looks like once `stageConversionUpload` is done with it. */\nexport const SHA256_HEX_REGEX = /^[0-9a-f]{64}$/i;\n\n/** The conversion action the rows are recorded against: a bare numeric id or its full resource name. */\nexport const conversionUploadActionSchema = z.union([\n z.string().regex(NUMERIC_ID_REGEX, \"expected the numeric conversion action id\"),\n z.string().regex(RESOURCE_NAME_REGEX, \"expected a customers/…/conversionActions/… resource name\"),\n]);\n\n/**\n * Google's click identifiers are URL-safe tokens. Validated by shape rather than by provider —\n * a `gclid` copied out of a spreadsheet routinely arrives wrapped in quotes or with a stray `?gclid=`\n * still attached, and both reach Google as an id it has never issued, where the upload is accepted\n * and attributed to nothing.\n */\nconst clickIdSchema = z\n .string()\n .min(1)\n .max(512)\n .regex(/^[A-Za-z0-9_.-]+$/, \"a click id is letters, digits, '-', '_' and '.' only — paste the id, not the URL\");\n\n/**\n * An instant, with its offset stated. A bare `2026-08-01T10:00:00` is refused on purpose: it reads as\n * local time to the person who typed it and as UTC to everything downstream, and a conversion filed\n * two hours from where it happened lands in the wrong day's reporting with nothing to show for it.\n */\nconst conversionDateTimeSchema = z\n .string()\n .regex(\n /^\\d{4}-\\d{2}-\\d{2}[T ]\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(Z|[+-]\\d{2}:\\d{2})$/,\n \"expected an ISO-8601 instant WITH a timezone, e.g. 2026-08-01T10:00:00Z or 2026-08-01T12:00:00+02:00\",\n )\n .refine((value) => Number.isFinite(Date.parse(value)), \"not a real date\");\n\n/** An email address, or the SHA-256 hex it is stored as once staged. */\nconst emailSchema = z\n .string()\n .min(3)\n .max(320)\n .refine(\n (value) => SHA256_HEX_REGEX.test(value) || /^[^@\\s]+@[^@\\s]+\\.[^@\\s]+$/.test(value),\n \"expected an email address\",\n );\n\n/**\n * A phone number in E.164, or the SHA-256 hex it is stored as once staged.\n *\n * The leading `+` and country code are required, not tidied up. A number stored the way a client's\n * CRM holds it — `600111222`, no country code — hashes to a different digest from the one Google\n * holds for that person, so the upload is accepted, reports as applied, and matches nobody. There is\n * no way to detect that afterwards from either end, and no way to guess the country from the digits.\n */\nconst phoneSchema = z\n .string()\n .min(4)\n .max(64)\n .refine(\n (value) => SHA256_HEX_REGEX.test(value) || /^\\+\\d[\\d\\s().-]{6,}$/.test(value),\n \"expected a phone number in E.164 with its country code, e.g. +34600111222 — a local number hashes to something Google cannot match\",\n );\n\n/**\n * A name, or the SHA-256 hex it is stored as. Google hashes given/family name after lowercasing and\n * stripping punctuation and whitespace, so what a CRM exports is normalized on the way in — the\n * caller sends \"Van Der Berg\" and Baker sends the digest of `vanderberg`.\n */\nconst nameSchema = z.string().min(1).max(120);\n\n/**\n * Google's address identifier requires all four of givenName, familyName, regionCode and postalCode\n * together — a partial address is not a weaker match, it is not a match at all, and Google rejects\n * the identifier rather than degrading it. City, region and street are optional refinements on top.\n */\nconst addressSchema = z\n .strictObject({\n givenName: nameSchema,\n familyName: nameSchema,\n /** ISO-3166-1 alpha-2, sent in the clear — it is not identifying on its own. */\n regionCode: z.string().regex(/^[A-Z]{2}$/, \"expected a 2-letter country code, e.g. ES\"),\n /** Sent in the clear, like the country: Google matches on it as a plain string. */\n postalCode: z.string().min(2).max(16),\n addressLine: z.string().min(1).max(200).optional(),\n city: z.string().min(1).max(100).optional(),\n /** State / province / region, whatever the country calls it. */\n administrativeArea: z.string().min(1).max(100).optional(),\n })\n .describe(\"advanced matching by name and address\");\n\n/**\n * How many conversions this one row stands for.\n *\n * Only meaningful on a conversion action whose counting type is EVERY — a lead action counts one per\n * click whatever is sent. Left unset it is one, which is what a repaired Form submission is; a\n * backfilled basket of three items sold in one order is three.\n */\nconst conversionCountSchema = z.number().int().positive().max(10_000);\n\n/**\n * Where the conversion happened. Defaults to WEB, which is what a repaired tag gap always is — the\n * others exist because a backfill of phone or in-store conversions arrives the same way and reads\n * wrong filed as web traffic.\n */\nexport const CONVERSION_EVENT_SOURCES = [\"WEB\", \"APP\", \"IN_STORE\", \"PHONE\", \"OTHER\"] as const;\n\nexport const conversionUploadRowSchema = z\n .strictObject({\n /**\n * The order id the original conversion carried — Baker's server-side tag sends the Form\n * submission id here, so a repair reuses that. Required: without it Google has no way to tell a\n * re-send from a new conversion, and the only way to find out is to double-count.\n */\n orderId: z.string().min(1).max(64),\n conversionDateTime: conversionDateTimeSchema,\n gclid: clickIdSchema.optional(),\n gbraid: clickIdSchema.optional(),\n wbraid: clickIdSchema.optional(),\n email: emailSchema.optional(),\n phone: phoneSchema.optional(),\n address: addressSchema.optional(),\n conversionCount: conversionCountSchema.optional(),\n eventSource: z.enum(CONVERSION_EVENT_SOURCES).optional(),\n value: z.number().nonnegative().optional(),\n currency: z\n .string()\n .regex(/^[A-Z]{3}$/, \"expected a 3-letter currency code, e.g. EUR\")\n .optional(),\n })\n .refine(\n (row) => Boolean(row.gclid ?? row.gbraid ?? row.wbraid ?? row.email ?? row.phone ?? row.address),\n \"every conversion needs something to match on: a click id (gclid / gbraid / wbraid), or a customer's email, phone or name+address\",\n )\n .refine(\n (row) => [row.gclid, row.gbraid, row.wbraid].filter(Boolean).length <= 1,\n \"pass at most one click id per conversion — gclid, gbraid and wbraid are three ways of naming the same click\",\n )\n // Currency is not optional next to a value: Google reads a value with no currency in the ACCOUNT's\n // currency, so a EUR order uploaded from a USD account silently changes what the campaign is worth.\n .refine(\n (row) => row.value === undefined || row.currency !== undefined,\n \"a conversion with a value needs its currency too\",\n )\n .refine((row) => row.currency === undefined || row.value !== undefined, \"currency was given with no value\");\nexport type ConversionUploadRow = z.infer<typeof conversionUploadRowSchema>;\n\nexport const conversionUploadSchema = z\n .strictObject({\n conversionAction: conversionUploadActionSchema,\n conversions: z.array(conversionUploadRowSchema).min(1).max(CONVERSION_UPLOAD_MAX_ROWS),\n })\n // Two rows with one order id are one conversion described twice — Google keeps one of them and\n // never says which, so the count the upload reports and the count the account records diverge.\n .refine((payload) => {\n const ids = payload.conversions.map((row) => row.orderId);\n return new Set(ids).size === ids.length;\n }, \"two conversions share an order id — each order id can appear once per upload\");\nexport type ConversionUpload = z.infer<typeof conversionUploadSchema>;\n\n/** The conversion action id an upload records against, whichever way it was named. */\nexport function conversionUploadActionId(payload: ConversionUpload): string {\n return payload.conversionAction.split(\"/\").pop() ?? payload.conversionAction;\n}\n\nexport interface ConversionUploadTotals {\n count: number;\n /** How many rows carry a value at all — the rest upload as a conversion with no revenue. */\n valued: number;\n /** Summed value, present only when every valued row agrees on one currency. */\n total?: { amount: number; currency: string };\n currencies: string[];\n}\n\n/**\n * Add money in minor units, then come back.\n *\n * Both call sites interpolate this straight into a label a reviewer reads as money, and a plain\n * float sum does not survive that: 12.10 + 3.30 is 15.399999999999999 in binary, and with up to\n * 200 decimal rows a set that sums exactly is the exception.\n */\nfunction sumMoney(values: number[]): number {\n return values.reduce((sum, value) => sum + Math.round(value * 100), 0) / 100;\n}\n\n/** What an upload adds up to, for the summary line and the review card. */\nexport function conversionUploadTotals(payload: ConversionUpload): ConversionUploadTotals {\n const valuedRows = payload.conversions.filter((row) => row.value !== undefined);\n const currencies = [...new Set(valuedRows.map((row) => row.currency ?? \"\"))].filter(Boolean).sort();\n const only = currencies.length === 1 ? currencies[0] : undefined;\n return {\n count: payload.conversions.length,\n valued: valuedRows.length,\n // Mixed currencies deliberately produce no total: adding EUR to USD gives a number that is wrong\n // in both, and this line is read as money.\n ...(only ? { total: { amount: sumMoney(valuedRows.map((row) => row.value ?? 0)), currency: only } } : {}),\n currencies,\n };\n}\n\n/** Order ids dated in the future — a conversion that has not happened yet is a typo, not a backfill. */\nexport function futureConversionRows(payload: ConversionUpload, nowMs: number): string[] {\n return payload.conversions.filter((row) => Date.parse(row.conversionDateTime) > nowMs).map((row) => row.orderId);\n}\n\nconst MS_PER_DAY = 24 * 60 * 60 * 1000;\n\n/**\n * Order ids older than the conversion action's own click-through window. Google attributes an upload\n * to the click it names only while that click is still inside the window the action is configured\n * for, so anything past it is accepted and then counted against nothing. The number comes off the\n * account, never off a constant here — the window is a per-action setting the client can change.\n */\nexport function staleConversionRows(payload: ConversionUpload, lookbackDays: number, nowMs: number): string[] {\n const cutoff = nowMs - lookbackDays * MS_PER_DAY;\n return payload.conversions.filter((row) => Date.parse(row.conversionDateTime) < cutoff).map((row) => row.orderId);\n}\n\n/** How many rows match on a click id versus on a hashed customer identifier — stated on the review card. */\nexport function conversionUploadMatchCounts(payload: ConversionUpload): { byClick: number; byCustomer: number } {\n let byClick = 0;\n let byCustomer = 0;\n for (const row of payload.conversions) {\n if (row.gclid ?? row.gbraid ?? row.wbraid) {\n byClick += 1;\n } else {\n // Email, phone and name+address all reach Google as customer details under the same terms, so\n // they count as one kind here — the per-row table is where WHICH of them is stated.\n byCustomer += 1;\n }\n }\n return { byClick, byCustomer };\n}\n\nconst MONTHS = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"] as const;\n\n/**\n * One instant as a date a marketer reads. Hand-rolled rather than `Intl`, because this string is\n * built once at stage time and then stored on the draft and shown back unchanged — a value that\n * varied with the runtime's locale would make the same upload read differently in the chat, in\n * History and in a test.\n *\n * UTC, and the clock time is dropped: an upload covers a period, and \"2026-08-20T10:14:00Z\" tells\n * the person approving it nothing that \"20 Aug 2026\" does not.\n */\nfunction conversionUploadDay(instant: string): string {\n const date = new Date(instant);\n if (Number.isNaN(date.getTime())) {\n return instant;\n }\n return `${date.getUTCDate()} ${MONTHS[date.getUTCMonth()]} ${date.getUTCFullYear()}`;\n}\n\n/**\n * One instant as a date and time a person reads, in UTC.\n *\n * UTC and said so at the column header, rather than each row's own offset: a backfill routinely\n * mixes `Z` rows exported from one system with `+02:00` rows typed by hand, and a table that renders\n * each in its own zone cannot be scanned for the out-of-order row that is the whole point of reading\n * it. Same hand-rolled formatting as the range label, for the same reason.\n */\nexport function conversionUploadInstantLabel(instant: string): string {\n const date = new Date(instant);\n if (Number.isNaN(date.getTime())) {\n return instant;\n }\n const hh = String(date.getUTCHours()).padStart(2, \"0\");\n const mm = String(date.getUTCMinutes()).padStart(2, \"0\");\n return `${date.getUTCDate()} ${MONTHS[date.getUTCMonth()]} ${date.getUTCFullYear()}, ${hh}:${mm}`;\n}\n\n/**\n * The two days the upload runs between, as the label renders them.\n *\n * One definition of \"which day is this row on\", shared by the label and by the multi-day check, so\n * the phrase and the decision to show it cannot disagree: a warning that says \"Covers conversions\n * dated 1 Sep 2026\" is one that decided a one-day window spans several.\n */\nfunction conversionUploadDayEnds(payload: ConversionUpload): { start: string; end: string } {\n const { from, to } = conversionUploadRange(payload);\n return { start: conversionUploadDay(from), end: conversionUploadDay(to) };\n}\n\n/** The window an upload covers, as one phrase: \"20 Aug 2026 – 28 Aug 2026\", or one date if it is all one day. */\nexport function conversionUploadRangeLabel(payload: ConversionUpload): string {\n const { start, end } = conversionUploadDayEnds(payload);\n return start === end ? start : `${start} – ${end}`;\n}\n\n/**\n * Whether the upload really covers more than one day.\n *\n * The days, never the instants. Comparing the two ends of the range as timestamps answers \"are these\n * two rows the same moment\", which is a different question and is false for almost every upload —\n * a single afternoon's repair has rows at 10:00 and 15:45. Read that way, the multi-day heads-up\n * fired on everything with two rows in it and said \"Covers conversions dated 1 Sep 2026\", warning\n * about a window that is one day wide.\n */\nexport function conversionUploadSpansSeveralDays(payload: ConversionUpload): boolean {\n const { start, end } = conversionUploadDayEnds(payload);\n return start !== end;\n}\n\n/**\n * A conversion's value as money, with its cents kept: \"89.90 EUR\", never \"89.9 EUR\".\n *\n * These numbers are read straight off the client's own export and checked against it row by row, so\n * a trailing zero that JavaScript drops turns €89.90 into something that does not match the line the\n * reviewer is comparing it to. Two decimals for every currency: a zero-decimal one (JPY) reads a\n * little odd, which is a much smaller cost than a euro amount that looks like a different number.\n */\nexport function conversionValueLabel(amount: number, currency: string | undefined): string {\n return currency ? `${amount.toFixed(2)} ${currency}` : amount.toFixed(2);\n}\n\n/** The window an upload covers, as the earliest and latest instant in it. */\nexport function conversionUploadRange(payload: ConversionUpload): { from: string; to: string } {\n const sorted = [...payload.conversions].sort(\n (a, b) => Date.parse(a.conversionDateTime) - Date.parse(b.conversionDateTime),\n );\n const from = sorted[0]?.conversionDateTime ?? \"\";\n const to = sorted[sorted.length - 1]?.conversionDateTime ?? \"\";\n return { from, to };\n}\n\n/** Which identifiers a row actually carries, in the order Google prefers them. Never their values. */\nexport function conversionRowIdentifiers(row: ConversionUploadRow): string[] {\n const carried: string[] = [];\n if (row.gclid) carried.push(\"gclid\");\n if (row.gbraid) carried.push(\"gbraid\");\n if (row.wbraid) carried.push(\"wbraid\");\n if (row.email) carried.push(\"email\");\n if (row.phone) carried.push(\"phone\");\n if (row.address) carried.push(\"name + address\");\n return carried;\n}\n","/**\n * Which bidding Google takes on which campaign type — channel (× sub-type) → strategies.\n *\n * Every row is what Google ANSWERED, not what its docs imply: each pair was sent as a validateOnly\n * campaign create on v25 against 3865083115 (2026-10-08, `scripts/dev/google-ads-matrix`\n * `bidding-matrix` fixture), and a strategy is listed only if Google accepted it. Where the docs and\n * the API disagree the API wins — Google's \"Bidding strategy types\" page\n * (developers.google.com/google-ads/api/docs/campaigns/bidding/strategy-types) lists Maximize\n * conversions as a portfolio strategy for Performance Max, and attaching one is\n * `CANNOT_ATTACH_TO_BIDDING_STRATEGY`.\n *\n * Refusals Google gave and this table encodes: Manual CPM / CPV and Percent CPC are\n * `OPERATION_NOT_PERMITTED_FOR_CONTEXT` on every creatable channel but Display (Manual CPM);\n * Target impression share on anything but Search; Maximize clicks on Performance Max; a standalone\n * Target CPA / ROAS on Search and Performance Max (the target rides inside Maximize conversions /\n * conversion value there); any portfolio strategy on Performance Max or Demand Gen; Maximize\n * conversions / conversion value portfolios on Display. \"Customer does not have enough conversions\"\n * is an eligibility answer about the ACCOUNT, not the pair, so those pairs stay allowed.\n *\n * A channel with no row (Video, Shopping, App… — Baker does not create them) refuses nothing: an\n * update to such a campaign falls through to publish, where the humanized error is the backstop.\n * Blocking a change that would have worked is worse than failing one.\n */\nimport type { GoogleBiddingStrategyType } from \"./limits\";\n\ntype Strategies = readonly GoogleBiddingStrategyType[];\n\n/** Inline (standard) bidding a campaign of this type takes. `CHANNEL/SUB_TYPE` rows override the channel's. */\nexport const STANDARD_BIDDING_BY_CHANNEL: Readonly<Record<string, Strategies>> = {\n SEARCH: [\n \"MANUAL_CPC\",\n \"MAXIMIZE_CONVERSIONS\",\n \"MAXIMIZE_CONVERSION_VALUE\",\n \"TARGET_SPEND\",\n \"TARGET_IMPRESSION_SHARE\",\n ],\n DISPLAY: [\n \"MANUAL_CPC\",\n \"MAXIMIZE_CONVERSIONS\",\n \"MAXIMIZE_CONVERSION_VALUE\",\n \"TARGET_SPEND\",\n \"TARGET_CPA\",\n \"TARGET_ROAS\",\n \"MANUAL_CPM\",\n ],\n // Accepted with Manual CPC; Maximize conversions was OPERATION_NOT_PERMITTED_FOR_CONTEXT. Nothing\n // else was tried, so nothing else is claimed.\n \"DISPLAY/DISPLAY_MOBILE_APP\": [\"MANUAL_CPC\"],\n // Target ROAS answered \"not enough conversions\" — eligibility, so it stays.\n SHOPPING: [\"MANUAL_CPC\", \"TARGET_SPEND\", \"TARGET_ROAS\", \"MAXIMIZE_CONVERSION_VALUE\"],\n // Which one depends on the App goal (`APP_CAMPAIGN_GOALS`, channel-settings.ts); Manual CPC and\n // the rest were OPERATION_NOT_PERMITTED_FOR_CONTEXT.\n MULTI_CHANNEL: [\"TARGET_CPA\", \"MAXIMIZE_CONVERSIONS\", \"TARGET_ROAS\"],\n // With a target ROAS inside (required). Manual CPC, Maximize clicks, Target ROAS / CPA, Maximize\n // conversions and Percent CPC were all OPERATION_NOT_PERMITTED_FOR_CONTEXT. Hotel has no row: the\n // account cannot create one, so nothing was answered.\n TRAVEL: [\"MAXIMIZE_CONVERSION_VALUE\"],\n PERFORMANCE_MAX: [\"MAXIMIZE_CONVERSIONS\", \"MAXIMIZE_CONVERSION_VALUE\"],\n DEMAND_GEN: [\n \"MAXIMIZE_CONVERSIONS\",\n \"MAXIMIZE_CONVERSION_VALUE\",\n \"TARGET_SPEND\",\n \"TARGET_CPA\",\n \"TARGET_ROAS\",\n \"TARGET_CPC\",\n ],\n};\n\n/** Portfolio strategies a campaign of this type can be attached to. Empty = none at all. */\nexport const PORTFOLIO_BIDDING_BY_CHANNEL: Readonly<Record<string, Strategies>> = {\n SEARCH: [\n \"MAXIMIZE_CONVERSIONS\",\n \"MAXIMIZE_CONVERSION_VALUE\",\n \"TARGET_CPA\",\n \"TARGET_ROAS\",\n \"TARGET_SPEND\",\n \"TARGET_IMPRESSION_SHARE\",\n ],\n DISPLAY: [\"TARGET_CPA\", \"TARGET_ROAS\", \"TARGET_SPEND\"],\n SHOPPING: [\"MAXIMIZE_CONVERSION_VALUE\", \"TARGET_ROAS\", \"TARGET_SPEND\"],\n MULTI_CHANNEL: [],\n PERFORMANCE_MAX: [],\n DEMAND_GEN: [],\n};\n\n/**\n * The strategy types a portfolio (`BiddingStrategy`) can BE. Manual CPM, Manual CPV and Percent CPC\n * have no field on that resource at all — staging one sent `manualCpm` to Google, which answered\n * \"Unknown name\" and refused the whole request, every op in its window with it. Manual CPC and\n * Target CPC are refused with their own sentences in `biddingStrategyCreateSchema`.\n */\nexport const PORTFOLIO_STRATEGY_TYPES: Strategies = [\n \"MAXIMIZE_CONVERSIONS\",\n \"MAXIMIZE_CONVERSION_VALUE\",\n \"TARGET_CPA\",\n \"TARGET_ROAS\",\n \"TARGET_SPEND\",\n \"TARGET_IMPRESSION_SHARE\",\n];\n\n/** A strategy as the Google Ads interface names it, with the value to pass so the agent can act on it. */\nexport const BIDDING_STRATEGY_LABELS: Readonly<Record<GoogleBiddingStrategyType, string>> = {\n MANUAL_CPC: \"Manual CPC (MANUAL_CPC)\",\n MAXIMIZE_CONVERSIONS: \"Maximize conversions (MAXIMIZE_CONVERSIONS)\",\n MAXIMIZE_CONVERSION_VALUE: \"Maximize conversion value (MAXIMIZE_CONVERSION_VALUE)\",\n TARGET_SPEND: \"Maximize clicks (TARGET_SPEND)\",\n TARGET_CPA: \"Target CPA (TARGET_CPA)\",\n TARGET_ROAS: \"Target ROAS (TARGET_ROAS)\",\n TARGET_IMPRESSION_SHARE: \"Target impression share (TARGET_IMPRESSION_SHARE)\",\n MANUAL_CPM: \"Manual CPM (MANUAL_CPM)\",\n MANUAL_CPV: \"Manual CPV (MANUAL_CPV)\",\n PERCENT_CPC: \"Percent CPC (PERCENT_CPC)\",\n TARGET_CPC: \"Target CPC (TARGET_CPC)\",\n};\n\nconst CHANNEL_LABELS: Readonly<Record<string, string>> = {\n SEARCH: \"Search\",\n DISPLAY: \"Display\",\n PERFORMANCE_MAX: \"Performance Max\",\n DEMAND_GEN: \"Demand Gen\",\n SHOPPING: \"Shopping\",\n MULTI_CHANNEL: \"App\",\n TRAVEL: \"Travel\",\n HOTEL: \"Hotel\",\n};\n\nfunction labelOf(strategy: string): string {\n return BIDDING_STRATEGY_LABELS[strategy as GoogleBiddingStrategyType] ?? strategy;\n}\n\nfunction rowFor(\n table: Readonly<Record<string, Strategies>>,\n channelType: string,\n channelSubType: string | undefined,\n): Strategies | undefined {\n return (channelSubType ? table[`${channelType}/${channelSubType}`] : undefined) ?? table[channelType];\n}\n\n/**\n * Which targets a channel refuses INSIDE Maximize conversions (`cpa`) / conversion value (`roas`) —\n * there the target is a strategy of its own. Each was OPERATION_NOT_PERMITTED_FOR_CONTEXT at the\n * embedded field on a validateOnly create: Shopping at `maximize_conversion_value.target_roas`;\n * Display at `maximize_conversions.target_cpa_micros` (it took a target ROAS inside Maximize\n * conversion value) and Demand Gen at `maximize_conversion_value.target_roas` (v25, 2026-10-09).\n * Demand Gen's target CPA has its own rule (`embeddedTargetOnDemandGenRefusal`). A channel with no\n * row lets it through.\n */\nconst EMBEDDED_TARGETS_REFUSED: Readonly<Record<string, ReadonlyArray<\"cpa\" | \"roas\">>> = {\n SHOPPING: [\"cpa\", \"roas\"],\n MULTI_CHANNEL: [\"cpa\", \"roas\"],\n DISPLAY: [\"cpa\"],\n DEMAND_GEN: [\"roas\"],\n};\n\n/** Why this campaign type refuses a target inside Maximize conversions / conversion value, or undefined. */\nexport function embeddedTargetRefusal(\n channelType: string | undefined,\n bidding: { type: string; targetCpaMicros?: number; targetRoas?: number } | undefined,\n): string | undefined {\n const refused = channelType ? EMBEDDED_TARGETS_REFUSED[channelType] : undefined;\n if (!channelType || !bidding || !refused) {\n return undefined;\n }\n const channel = CHANNEL_LABELS[channelType] ?? channelType;\n const standalone = (strategy: GoogleBiddingStrategyType) =>\n STANDARD_BIDDING_BY_CHANNEL[channelType]?.includes(strategy)\n ? ` — choose ${labelOf(strategy)} with the same target instead.`\n : \".\";\n if (bidding.type === \"MAXIMIZE_CONVERSION_VALUE\" && bidding.targetRoas !== undefined && refused.includes(\"roas\")) {\n return `Google doesn't take a target ROAS inside Maximize conversion value on ${channel} campaigns${standalone(\"TARGET_ROAS\")}`;\n }\n if (bidding.type === \"MAXIMIZE_CONVERSIONS\" && bidding.targetCpaMicros !== undefined && refused.includes(\"cpa\")) {\n return `Google doesn't take a target CPA inside Maximize conversions on ${channel} campaigns${standalone(\"TARGET_CPA\")}`;\n }\n return undefined;\n}\n\nexport interface BiddingMatrixQuery {\n channelType: string | undefined;\n channelSubType?: string | undefined;\n strategy: string | undefined;\n /** `portfolio` asks about attaching the campaign to a portfolio strategy of this type. */\n portfolio?: boolean;\n}\n\n/**\n * Why Google will not take this bidding on this campaign type, or undefined to let it through.\n * An unread channel, a channel with no row and an absent strategy all let it through.\n */\nexport function biddingMatrixRefusal(query: BiddingMatrixQuery): string | undefined {\n const { channelType, channelSubType, strategy, portfolio = false } = query;\n if (!channelType || !strategy) {\n return undefined;\n }\n const row = rowFor(\n portfolio ? PORTFOLIO_BIDDING_BY_CHANNEL : STANDARD_BIDDING_BY_CHANNEL,\n channelType,\n channelSubType,\n );\n if (!row || row.includes(strategy as GoogleBiddingStrategyType)) {\n return undefined;\n }\n const channel = CHANNEL_LABELS[channelType] ?? channelType;\n if (portfolio && row.length === 0) {\n const own = rowFor(STANDARD_BIDDING_BY_CHANNEL, channelType, channelSubType) ?? [];\n return `Google doesn't let a ${channel} campaign use a portfolio bid strategy. Give it its own bidding instead: ${own.map(labelOf).join(\", \")}.`;\n }\n const kind = portfolio ? \"portfolio strategy\" : \"bidding\";\n return `Google doesn't accept ${labelOf(strategy)} as ${kind} on a ${channel} campaign. It takes: ${row.map(labelOf).join(\", \")}.`;\n}\n","/**\n * The settings a campaign type cannot be created without, and the per-channel settings Google takes\n * only on some campaign types — each with the rule that says where it belongs.\n *\n * Every rule here is what Google ANSWERED to a validateOnly campaign create on v25 against\n * 3865083115 (2026-10-08), not what its docs imply. The account-level half (is the Merchant Center\n * linked, is there a travel link, is Hotel available) needs a live read and lives in the backend's\n * stage-time precheck (`writes/channelLinks.ts`).\n */\nimport { z } from \"zod\";\nimport { NUMERIC_ID_REGEX, RESOURCE_NAME_REGEX } from \"./limits\";\n\n/** Merchant Center ids are int64 in Google's API; carried as digit strings so nothing rounds them. */\nconst int64IdSchema = (what: string) => z.string().regex(NUMERIC_ID_REGEX, `${what} must be the bare numeric id`);\n\n/**\n * Shopping priority — \"Low\" (0), \"Medium\" (1), \"High\" (2). Google requires one on a Shopping create;\n * a create that leaves it out is sent as Low, Google Ads' own default in its interface.\n */\nexport const SHOPPING_CAMPAIGN_PRIORITIES = [0, 1, 2] as const;\nexport const SHOPPING_PRIORITY_LABELS: Readonly<Record<number, string>> = { 0: \"Low\", 1: \"Medium\", 2: \"High\" };\n\n/**\n * `campaign.shopping_setting` on a create. `merchantId` is the Merchant Center account whose products\n * the campaign advertises (it must be linked to this Google Ads account — checked at staging);\n * `feedLabel` narrows it to one feed (a country code or a label set in Merchant Center).\n */\nexport const shoppingSettingSchema = z.strictObject({\n merchantId: int64IdSchema(\"merchantId\"),\n feedLabel: z.string().trim().min(1).max(20).optional(),\n /** Shopping only. Which Shopping campaign wins when several advertise the same product. */\n campaignPriority: z\n .number()\n .int()\n .refine(\n (value) => (SHOPPING_CAMPAIGN_PRIORITIES as readonly number[]).includes(value),\n \"campaignPriority is 0, 1 or 2\",\n )\n .optional(),\n /** Shopping only. Local inventory ads — products in nearby stores. Only `true` is ever sent. */\n enableLocal: z.boolean().optional(),\n});\nexport type ShoppingSetting = z.infer<typeof shoppingSettingSchema>;\n\n/**\n * `shopping_setting` on an existing campaign. The Merchant Center account is fixed at creation; the\n * feed label (`\"\"` clears it), and on Shopping the priority and local inventory, can change.\n */\nexport const shoppingSettingUpdateSchema = z\n .strictObject({\n feedLabel: z.union([z.string().trim().min(1).max(20), z.literal(\"\")]).optional(),\n campaignPriority: shoppingSettingSchema.shape.campaignPriority,\n enableLocal: z.boolean().optional(),\n })\n .refine((p) => Object.values(p).some((v) => v !== undefined), \"shoppingSetting needs a field to change\");\nexport type ShoppingSettingUpdate = z.infer<typeof shoppingSettingUpdateSchema>;\n\nexport const APP_STORES = [\"GOOGLE_APP_STORE\", \"APPLE_APP_STORE\"] as const;\n\n/**\n * What an App campaign optimizes for, and the one bidding strategy Google pairs with each — any other\n * pair is `INCOMPATIBLE_BIDDING_STRATEGY_AND_BIDDING_STRATEGY_GOAL_TYPE`. The in-app and value goals\n * also need the app's conversion actions (`AT_LEAST_ONE_CONVERSION_MUST_BE_SELECTED` without them).\n * Pre-registration is left out: it needs an app open for pre-registration and goal settings Baker\n * does not stage.\n */\nexport const APP_CAMPAIGN_GOALS = {\n OPTIMIZE_INSTALLS_TARGET_INSTALL_COST: { strategy: \"TARGET_CPA\", needsConversions: false },\n OPTIMIZE_INSTALLS_WITHOUT_TARGET_INSTALL_COST: { strategy: \"MAXIMIZE_CONVERSIONS\", needsConversions: false },\n OPTIMIZE_IN_APP_CONVERSIONS_TARGET_INSTALL_COST: { strategy: \"TARGET_CPA\", needsConversions: true },\n OPTIMIZE_IN_APP_CONVERSIONS_TARGET_CONVERSION_COST: { strategy: \"TARGET_CPA\", needsConversions: true },\n OPTIMIZE_RETURN_ON_ADVERTISING_SPEND: { strategy: \"TARGET_ROAS\", needsConversions: true },\n} as const;\nexport type AppCampaignGoal = keyof typeof APP_CAMPAIGN_GOALS;\nconst APP_CAMPAIGN_GOAL_TYPES = Object.keys(APP_CAMPAIGN_GOALS) as [AppCampaignGoal, ...AppCampaignGoal[]];\n\n/** An App campaign's app — fixed at creation — and what it optimizes for. */\nexport const appCampaignSettingSchema = z.strictObject({\n /** Android package name (`com.example.app`) or the App Store's numeric id. */\n appId: z.string().trim().min(1).max(200),\n appStore: z.enum(APP_STORES),\n biddingStrategyGoalType: z.enum(APP_CAMPAIGN_GOAL_TYPES),\n});\nexport type AppCampaignSetting = z.infer<typeof appCampaignSettingSchema>;\n\n/** The app's conversion actions an in-app or value goal optimizes toward. Existing ids only. */\nexport const selectiveOptimizationSchema = z.strictObject({\n conversionActions: z\n .array(\n z.union([z.string().regex(RESOURCE_NAME_REGEX), z.string().regex(NUMERIC_ID_REGEX)], {\n error: \"conversionActions are the app's existing conversion actions — an id or resource name\",\n }),\n )\n .min(1),\n});\nexport type SelectiveOptimization = z.infer<typeof selectiveOptimizationSchema>;\n\n/** App sub-types Google still creates: installs (and their in-app follow-ons) and engagement. */\nconst APP_SUB_TYPES = new Set([\"APP_CAMPAIGN\", \"APP_CAMPAIGN_FOR_ENGAGEMENT\"]);\n\nexport const APP_SETTING_REQUIRED_MESSAGE =\n \"An App campaign (MULTI_CHANNEL) needs appCampaignSetting — appId, appStore (GOOGLE_APP_STORE | APPLE_APP_STORE) and biddingStrategyGoalType — and channelSubType APP_CAMPAIGN (installs) or APP_CAMPAIGN_FOR_ENGAGEMENT.\";\nexport const APP_SETTING_CHANNEL_MESSAGE =\n \"appCampaignSetting and selectiveOptimization belong to an App campaign (MULTI_CHANNEL) only.\";\nexport const APP_CONVERSIONS_REQUIRED_MESSAGE =\n \"This App goal optimizes toward in-app conversions — list the app's conversion actions in selectiveOptimization.conversionActions (Google refuses the campaign without them).\";\nexport const APP_ENGAGEMENT_GOAL_MESSAGE =\n \"An engagement App campaign (APP_CAMPAIGN_FOR_ENGAGEMENT) optimizes toward in-app actions — use an in-app or return-on-ad-spend goal, not an installs goal.\";\n\nfunction appGoalBiddingMessage(goal: AppCampaignGoal): string {\n return `The App goal ${goal} bids with ${APP_CAMPAIGN_GOALS[goal].strategy} only — Google refuses any other strategy with it.`;\n}\n\n/** A Travel campaign's travel account (Things to do). It must be linked to this Google Ads account. */\nexport const travelCampaignSettingsSchema = z.strictObject({ travelAccountId: int64IdSchema(\"travelAccountId\") });\n/** A Hotel campaign's Hotel Center account. The Google Ads account must be linked to Hotel Center. */\nexport const hotelSettingSchema = z.strictObject({ hotelCenterId: int64IdSchema(\"hotelCenterId\") });\n\nexport const TRAVEL_SETTING_REQUIRED_MESSAGE =\n \"A Travel campaign needs travelCampaignSettings.travelAccountId — the travel account linked to this Google Ads account.\";\nexport const HOTEL_SETTING_REQUIRED_MESSAGE =\n \"A Hotel campaign needs hotelSetting.hotelCenterId — the Hotel Center account linked to this Google Ads account.\";\nexport const TRAVEL_HOTEL_CHANNEL_MESSAGE =\n \"travelCampaignSettings belongs to a Travel campaign and hotelSetting to a Hotel campaign only.\";\nexport const TRAVEL_TARGET_ROAS_MESSAGE =\n \"A Travel campaign bids with Maximize conversion value at a target ROAS — set bidding.targetRoas (Google requires it).\";\n\n/**\n * `campaign.dynamic_search_ads_setting` — the site a Search campaign's dynamic ads are built from.\n * The domain is a bare host (no scheme, no path: \"withbaker.com/\" is\n * DYNAMIC_SEARCH_ADS_SETTING_CONTAINS_INVALID_DOMAIN_NAME); the language is Google's lowercase code,\n * with an underscore region where it has one (\"en\", \"zh_CN\" — \"pt-BR\" and \"EN\" were refused).\n */\nexport const dynamicSearchAdsSettingSchema = z.strictObject({\n domainName: z\n .string()\n .trim()\n .regex(\n /^(?!-)[A-Za-z0-9-]+(\\.[A-Za-z0-9-]+)+$/,\n \"domainName is the site's bare domain (withbaker.com) — no https://, no path\",\n ),\n languageCode: z\n .string()\n .regex(\n /^[a-z]{2,3}(_[A-Z]{2})?$/,\n 'languageCode is Google\\'s language code in lowercase (\"en\", \"es\"; \"zh_CN\" with a region)',\n ),\n /** Build ads only from the pages a page feed lists, not the whole site. */\n useSuppliedUrlsOnly: z.boolean().optional(),\n});\nexport type DynamicSearchAdsSetting = z.infer<typeof dynamicSearchAdsSettingSchema>;\n\n/**\n * The DSA setting on an existing Search campaign: each field changes on its own (leaf masks were\n * accepted live). It cannot be removed — masking domain and language empty is FieldError.REQUIRED.\n */\nexport const dynamicSearchAdsSettingUpdateSchema = dynamicSearchAdsSettingSchema\n .partial()\n .refine((p) => Object.values(p).some((v) => v !== undefined), \"dynamicSearchAdsSetting needs a field to change\");\n\nexport const FREQUENCY_CAP_LEVELS = [\"CAMPAIGN\", \"AD_GROUP\", \"AD_GROUP_AD\"] as const;\nexport const FREQUENCY_CAP_EVENTS = [\"IMPRESSION\", \"VIDEO_VIEW\"] as const;\nexport const FREQUENCY_CAP_TIME_UNITS = [\"DAY\", \"WEEK\", \"MONTH\"] as const;\n\n/**\n * `campaign.frequency_caps` — at most `cap` events per person per day, week or month, counted at the\n * campaign, per ad group or per ad. Google takes only a period of one unit (time_length 2 was\n * RangeError.TOO_HIGH) and one cap per level × event × period (a second is DUPLICATE_VALUES). The list\n * REPLACES the campaign's; `[]` on an update removes every cap.\n */\nexport const frequencyCapsSchema = z\n .array(\n z.strictObject({\n level: z.enum(FREQUENCY_CAP_LEVELS),\n eventType: z.enum(FREQUENCY_CAP_EVENTS),\n timeUnit: z.enum(FREQUENCY_CAP_TIME_UNITS),\n cap: z.number().int().min(1),\n }),\n )\n .refine(\n (caps) => new Set(caps.map((c) => `${c.level}/${c.eventType}/${c.timeUnit}`)).size === caps.length,\n \"one cap per level, event and period — Google refuses a second (DUPLICATE_VALUES)\",\n );\nexport type FrequencyCaps = z.infer<typeof frequencyCapsSchema>;\n\nexport const DSA_CHANNEL_MESSAGE = \"dynamicSearchAdsSetting belongs to a Search campaign only.\";\n/**\n * Display and (existing) Video campaigns. Demand Gen refuses caps (OPERATION_NOT_PERMITTED_FOR_CONTEXT);\n * Search, Shopping and Performance Max accept them in a dry run but serve nothing they cap.\n */\nconst FREQUENCY_CAP_CHANNELS = new Set([\"DISPLAY\", \"VIDEO\"]);\nexport const FREQUENCY_CAPS_CHANNEL_MESSAGE =\n \"Frequency caps work on Display (and existing Video) campaigns only — Demand Gen refuses them, and Search, Shopping and Performance Max ads are not frequency-capped.\";\n\n/**\n * What Google may generate or change for a Performance Max campaign — each switch is one of Google's\n * `AssetAutomationType`s (`ASSET_AUTOMATION_TYPES` maps them), true = opted in. A switch left out keeps\n * the campaign's value (Google's default on a new campaign). On Search the text and URL-expansion\n * switches are AI Max's (`aiMax`); Display and Demand Gen take none.\n */\nexport const assetAutomationSchema = z\n .strictObject({\n /** Text Google writes from the landing page and the assets (TEXT_ASSET_AUTOMATION). */\n textAssets: z.boolean().optional(),\n /** Send traffic to the most relevant page of the site (FINAL_URL_EXPANSION_TEXT_ASSET_AUTOMATION). */\n finalUrlExpansion: z.boolean().optional(),\n /** Enhanced versions of the campaign's YouTube videos (GENERATE_ENHANCED_YOUTUBE_VIDEOS). */\n videoEnhancement: z.boolean().optional(),\n /** Enhanced versions of the campaign's images (GENERATE_IMAGE_ENHANCEMENT). */\n imageEnhancement: z.boolean().optional(),\n /** Images taken from the landing page (GENERATE_IMAGE_EXTRACTION). */\n imageExtraction: z.boolean().optional(),\n /** New designs made from the campaign's images (GENERATE_DESIGN_VERSIONS_FOR_IMAGES). */\n imageDesignVersions: z.boolean().optional(),\n })\n .refine((p) => Object.values(p).some((v) => v !== undefined), \"assetAutomation needs at least one switch\");\nexport type AssetAutomation = z.infer<typeof assetAutomationSchema>;\n\n/** Each switch's Google `AssetAutomationType`. */\nexport const ASSET_AUTOMATION_TYPES: Readonly<Record<keyof AssetAutomation, string>> = {\n textAssets: \"TEXT_ASSET_AUTOMATION\",\n finalUrlExpansion: \"FINAL_URL_EXPANSION_TEXT_ASSET_AUTOMATION\",\n videoEnhancement: \"GENERATE_ENHANCED_YOUTUBE_VIDEOS\",\n imageEnhancement: \"GENERATE_IMAGE_ENHANCEMENT\",\n imageExtraction: \"GENERATE_IMAGE_EXTRACTION\",\n imageDesignVersions: \"GENERATE_DESIGN_VERSIONS_FOR_IMAGES\",\n};\n\nexport const ASSET_AUTOMATION_CHANNEL_MESSAGE =\n \"assetAutomation switches what Google generates for a Performance Max campaign only — on Search use AI Max (`aiMax`: text customization, final URL expansion); Display and Demand Gen take none.\";\nexport const TEXT_ASSETS_NEED_URL_EXPANSION_OFF_MESSAGE =\n \"Google refuses turning generated text off while final URL expansion is on — set finalUrlExpansion: false (`--url-expansion=false`) in the same change.\";\n\n/**\n * Why this asset automation state is one Google refuses, given the switches it ends up with.\n * `finalUrlExpansion` undefined means unknown/default-on: text off then needs an explicit URL expansion off.\n */\nexport function assetAutomationStateIssue(state: AssetAutomation): string | undefined {\n return state.textAssets === false && state.finalUrlExpansion !== false\n ? TEXT_ASSETS_NEED_URL_EXPANSION_OFF_MESSAGE\n : undefined;\n}\n\nconst hexColorSchema = z.string().regex(/^#[0-9A-Fa-f]{6}$/, \"colors are #RRGGBB hex codes\");\n\n/** Brand colors and font, the parts of a campaign's brand guidelines it can carry. Both colors or neither. */\nconst brandStyleShape = {\n mainColor: hexColorSchema.optional(),\n accentColor: hexColorSchema.optional(),\n /** One of Google's predefined fonts, e.g. \"Roboto\". */\n fontFamily: z.string().trim().min(1).max(50).optional(),\n};\n\nexport const BRAND_COLORS_PAIR_MESSAGE =\n \"Google needs both brand colors together — set mainColor and accentColor, or neither.\";\nexport const BRAND_GUIDELINES_OFF_MESSAGE =\n \"Brand colors and font only apply with brand guidelines on — set enabled: true, or leave them out.\";\nexport const BRAND_GUIDELINES_CHANNEL_MESSAGE = \"Brand guidelines belong to Performance Max campaigns only.\";\n\nfunction colorsPaired(p: { mainColor?: string; accentColor?: string }): boolean {\n return (p.mainColor === undefined) === (p.accentColor === undefined);\n}\n\n/**\n * Brand guidelines on a new Performance Max campaign: Google keeps the business name and logo as\n * campaign assets (it refuses the create without a BUSINESS_NAME and a LOGO campaign link in the same\n * publish — `REQUIRED_BUSINESS_NAME_ASSET_NOT_LINKED`) and uses the colors and font for what it\n * generates. Off by default (Baker opts every new PMax campaign out unless this turns it on).\n */\nexport const brandGuidelinesCreateSchema = z\n .strictObject({ enabled: z.boolean(), ...brandStyleShape })\n .superRefine((p, ctx) => {\n if (!colorsPaired(p)) {\n ctx.addIssue({ code: \"custom\", message: BRAND_COLORS_PAIR_MESSAGE });\n }\n if (!p.enabled && (p.mainColor !== undefined || p.fontFamily !== undefined)) {\n ctx.addIssue({ code: \"custom\", message: BRAND_GUIDELINES_OFF_MESSAGE });\n }\n });\nexport type BrandGuidelinesCreate = z.infer<typeof brandGuidelinesCreateSchema>;\n\n/**\n * Colors and font on a campaign that already has brand guidelines on. Each changes on its own — a\n * single color was accepted live (the campaign keeps the other); the font must be a Google Font\n * supported for brand guidelines (BRAND_GUIDELINES_UNSUPPORTED_FONT_FAMILY otherwise).\n */\nexport const brandGuidelinesUpdateSchema = z\n .strictObject(brandStyleShape)\n .refine((p) => Object.values(p).some((v) => v !== undefined), \"brandGuidelines needs a color or a font\");\nexport type BrandGuidelinesUpdate = z.infer<typeof brandGuidelinesUpdateSchema>;\n\nconst existingAssetSchema = z.union([z.string().regex(RESOURCE_NAME_REGEX), z.string().regex(NUMERIC_ID_REGEX)], {\n error: \"brand assets are assets already in the account — an id or resource name\",\n});\n\nexport const ENABLE_BRAND_ASSETS_MESSAGE =\n \"Name the business name asset and at least one square logo asset (businessNameAsset, logoAssets), or set autoPopulateBrandAssets: true to let Google take them from the campaign's asset groups.\";\n\n/**\n * `CampaignService.EnablePMaxBrandGuidelines` for one existing Performance Max campaign — the only\n * way to turn brand guidelines on after creation (`brand_guidelines_enabled` is IMMUTABLE_FIELD on\n * update). Google either takes the business name and logos from the campaign's asset groups\n * (auto-populate) or links the ones named here as campaign assets.\n */\nexport const campaignEnableBrandGuidelinesSchema = z\n .strictObject({\n autoPopulateBrandAssets: z.boolean().optional(),\n businessNameAsset: existingAssetSchema.optional(),\n logoAssets: z.array(existingAssetSchema).min(1).max(5).optional(),\n landscapeLogoAssets: z.array(existingAssetSchema).max(5).optional(),\n /** The site's domain (withbaker.com) — required by Google with explicit assets. */\n finalUriDomain: z.string().trim().min(1).optional(),\n ...brandStyleShape,\n })\n .superRefine((p, ctx) => {\n if (p.autoPopulateBrandAssets !== true && (!p.businessNameAsset || !p.logoAssets)) {\n ctx.addIssue({ code: \"custom\", message: ENABLE_BRAND_ASSETS_MESSAGE });\n }\n if (!colorsPaired(p)) {\n ctx.addIssue({ code: \"custom\", message: BRAND_COLORS_PAIR_MESSAGE });\n }\n });\nexport type CampaignEnableBrandGuidelines = z.infer<typeof campaignEnableBrandGuidelinesSchema>;\n\nexport const TEXT_GUIDELINES_CREATE_CHANNEL_MESSAGE =\n \"Text guidelines apply where Google writes the ad text: Performance Max, and Search with AI Max and its text customization on. This campaign type doesn't take them.\";\nexport const TEXT_GUIDELINES_CREATE_AI_MAX_MESSAGE =\n \"Text guidelines on a Search campaign need AI Max with text customization on — add aiMax {enabled: true, textCustomization: true} (`--ai-max --ai-max-text`) to the same create, or leave the guidelines out.\";\n\nexport const SHOPPING_SETTING_REQUIRED_MESSAGE =\n \"A Shopping campaign needs shoppingSetting.merchantId — the Merchant Center account whose products it advertises. Read the linked ones with `baker ads google merchant-center list`.\";\nexport const SHOPPING_SETTING_CHANNEL_MESSAGE =\n \"shoppingSetting belongs to a Shopping or Performance Max campaign only.\";\nexport const PMAX_SHOPPING_ONLY_FIELDS_MESSAGE =\n \"On Performance Max, shoppingSetting takes only merchantId and feedLabel — campaignPriority and enableLocal are Shopping-campaign settings.\";\n\n/** One issue a campaign create carries against its channel, located for zod. */\nexport interface ChannelIssue {\n path: string[];\n message: string;\n}\n\n/** The parts of a campaign create the channel rules read. */\nexport interface ChannelSettingsCreate {\n channelType: string;\n channelSubType?: string;\n bidding?: { type: string; targetRoas?: number };\n shoppingSetting?: ShoppingSetting;\n appCampaignSetting?: AppCampaignSetting;\n selectiveOptimization?: SelectiveOptimization;\n travelCampaignSettings?: { travelAccountId: string };\n hotelSetting?: { hotelCenterId: string };\n dynamicSearchAdsSetting?: DynamicSearchAdsSetting;\n frequencyCaps?: FrequencyCaps;\n textGuidelines?: unknown;\n aiMax?: { enabled?: boolean; textCustomization?: boolean };\n assetAutomation?: AssetAutomation;\n brandGuidelines?: unknown;\n}\n\n/**\n * Text guidelines on a new campaign: Performance Max, or Search with AI Max and text customization on\n * in the same create (the rule an update is held to against the live campaign). Display and Demand\n * Gen were OPERATION_NOT_PERMITTED_FOR_CONTEXT.\n */\nfunction textGuidelinesCreateIssue(p: ChannelSettingsCreate): string | undefined {\n if (p.textGuidelines === undefined || p.channelType === \"PERFORMANCE_MAX\") {\n return undefined;\n }\n if (p.channelType !== \"SEARCH\") {\n return TEXT_GUIDELINES_CREATE_CHANNEL_MESSAGE;\n }\n return p.aiMax?.enabled === true && p.aiMax.textCustomization === true\n ? undefined\n : TEXT_GUIDELINES_CREATE_AI_MAX_MESSAGE;\n}\n\n/** Settings that only one family of campaign types serves — on create and (with the live channel) update. */\nfunction servingSettingIssues(\n channelType: string,\n p: {\n dynamicSearchAdsSetting?: unknown;\n frequencyCaps?: unknown;\n assetAutomation?: unknown;\n brandGuidelines?: unknown;\n },\n): ChannelIssue[] {\n const issues: ChannelIssue[] = [];\n if (p.brandGuidelines !== undefined && channelType !== \"PERFORMANCE_MAX\") {\n issues.push({ path: [\"brandGuidelines\"], message: BRAND_GUIDELINES_CHANNEL_MESSAGE });\n }\n if (p.assetAutomation !== undefined && channelType !== \"PERFORMANCE_MAX\") {\n issues.push({ path: [\"assetAutomation\"], message: ASSET_AUTOMATION_CHANNEL_MESSAGE });\n }\n if (p.dynamicSearchAdsSetting !== undefined && channelType !== \"SEARCH\") {\n issues.push({ path: [\"dynamicSearchAdsSetting\"], message: DSA_CHANNEL_MESSAGE });\n }\n if (p.frequencyCaps !== undefined && !FREQUENCY_CAP_CHANNELS.has(channelType)) {\n issues.push({ path: [\"frequencyCaps\"], message: FREQUENCY_CAPS_CHANNEL_MESSAGE });\n }\n return issues;\n}\n\nfunction travelHotelCreateIssues(\n p: ChannelSettingsCreate & { bidding?: { type: string; targetRoas?: number } },\n): ChannelIssue[] {\n const issues: ChannelIssue[] = [];\n if (p.channelType === \"TRAVEL\" && !p.travelCampaignSettings) {\n issues.push({ path: [\"travelCampaignSettings\"], message: TRAVEL_SETTING_REQUIRED_MESSAGE });\n }\n if (\n p.channelType === \"TRAVEL\" &&\n p.bidding?.type === \"MAXIMIZE_CONVERSION_VALUE\" &&\n p.bidding.targetRoas === undefined\n ) {\n issues.push({ path: [\"bidding\", \"targetRoas\"], message: TRAVEL_TARGET_ROAS_MESSAGE });\n }\n if (p.channelType === \"HOTEL\" && !p.hotelSetting) {\n issues.push({ path: [\"hotelSetting\"], message: HOTEL_SETTING_REQUIRED_MESSAGE });\n }\n if ((p.travelCampaignSettings && p.channelType !== \"TRAVEL\") || (p.hotelSetting && p.channelType !== \"HOTEL\")) {\n issues.push({\n path: [p.hotelSetting ? \"hotelSetting\" : \"travelCampaignSettings\"],\n message: TRAVEL_HOTEL_CHANNEL_MESSAGE,\n });\n }\n return issues;\n}\n\nfunction appCreateIssues(p: ChannelSettingsCreate): ChannelIssue[] {\n if (p.channelType !== \"MULTI_CHANNEL\") {\n return p.appCampaignSetting || p.selectiveOptimization\n ? [{ path: [\"appCampaignSetting\"], message: APP_SETTING_CHANNEL_MESSAGE }]\n : [];\n }\n const setting = p.appCampaignSetting;\n if (!setting || !p.channelSubType || !APP_SUB_TYPES.has(p.channelSubType)) {\n return [{ path: [\"appCampaignSetting\"], message: APP_SETTING_REQUIRED_MESSAGE }];\n }\n const goal = APP_CAMPAIGN_GOALS[setting.biddingStrategyGoalType];\n const issues: ChannelIssue[] = [];\n if (p.bidding && p.bidding.type !== goal.strategy) {\n issues.push({ path: [\"bidding\"], message: appGoalBiddingMessage(setting.biddingStrategyGoalType) });\n }\n if (goal.needsConversions && !p.selectiveOptimization) {\n issues.push({ path: [\"selectiveOptimization\"], message: APP_CONVERSIONS_REQUIRED_MESSAGE });\n }\n if (p.channelSubType === \"APP_CAMPAIGN_FOR_ENGAGEMENT\" && !goal.needsConversions) {\n issues.push({ path: [\"appCampaignSetting\", \"biddingStrategyGoalType\"], message: APP_ENGAGEMENT_GOAL_MESSAGE });\n }\n return issues;\n}\n\nfunction shoppingChannelIssue(\n channelType: string,\n setting: { campaignPriority?: number; enableLocal?: boolean } | undefined,\n): string | undefined {\n if (!setting) {\n return undefined;\n }\n if (channelType !== \"SHOPPING\" && channelType !== \"PERFORMANCE_MAX\") {\n return SHOPPING_SETTING_CHANNEL_MESSAGE;\n }\n return channelType === \"PERFORMANCE_MAX\" &&\n (setting.campaignPriority !== undefined || setting.enableLocal !== undefined)\n ? PMAX_SHOPPING_ONLY_FIELDS_MESSAGE\n : undefined;\n}\n\n/** What a campaign create states that its channel refuses, or needs and leaves out. */\nexport function channelSettingsCreateIssues(p: ChannelSettingsCreate): ChannelIssue[] {\n const issues: ChannelIssue[] = [];\n if (p.channelType === \"SHOPPING\" && !p.shoppingSetting) {\n issues.push({ path: [\"shoppingSetting\"], message: SHOPPING_SETTING_REQUIRED_MESSAGE });\n }\n const shopping = shoppingChannelIssue(p.channelType, p.shoppingSetting);\n if (shopping) {\n issues.push({ path: [\"shoppingSetting\"], message: shopping });\n }\n issues.push(...appCreateIssues(p), ...travelHotelCreateIssues(p), ...servingSettingIssues(p.channelType, p));\n const guidelines = textGuidelinesCreateIssue(p);\n if (guidelines) {\n issues.push({ path: [\"textGuidelines\"], message: guidelines });\n }\n const automation = p.assetAutomation && assetAutomationStateIssue(p.assetAutomation);\n if (automation) {\n issues.push({ path: [\"assetAutomation\"], message: automation });\n }\n return issues;\n}\n\n/** The parts of a campaign update the channel rules read. */\nexport interface ChannelSettingsUpdate {\n shoppingSetting?: ShoppingSettingUpdate;\n dynamicSearchAdsSetting?: Partial<DynamicSearchAdsSetting>;\n frequencyCaps?: FrequencyCaps;\n assetAutomation?: AssetAutomation;\n brandGuidelines?: BrandGuidelinesUpdate;\n}\n\n/**\n * Why the live campaign's type refuses this update's channel settings, or undefined to stage it.\n * An unread channel refuses nothing — publish's humanized error is the backstop.\n */\nexport function channelSettingsUpdateRefusal(\n channelType: string | undefined,\n p: ChannelSettingsUpdate,\n): string | undefined {\n if (!channelType) {\n return undefined;\n }\n return shoppingChannelIssue(channelType, p.shoppingSetting) ?? servingSettingIssues(channelType, p)[0]?.message;\n}\n","/**\n * Google's country geo-target constants and language constants, id → display name.\n *\n * These ids are global and stable across accounts, so a staged location or language\n * criterion reads \"Poland\" / \"Polish\" on the review card without a live lookup. Both\n * lists are complete as published by Google — a partial list is what previously made\n * most of a multi-market campaign's targeting render as \"Location 2616\".\n *\n * Generated — refresh with `pnpm --filter @baker/api geo-constants`:\n * - countries: https://developers.google.com/google-ads/api/data/geotargets (246 active top-level targets)\n * - languages: https://developers.google.com/google-ads/api/data/codes-formats#languages (51 languages)\n *\n * \"Country\" here means every target Google lists with no parent — 219 typed Country plus the 27 it\n * types Region (Taiwan, Hong Kong, Puerto Rico, Kosovo, …), which are ordinary targeting choices.\n *\n * Sub-country targets (regions, cities, postal codes) number in the hundreds of thousands\n * and are resolved live at stage time instead — see `withConstantName` in stage.ts.\n */\n\nexport const GEO_TARGET_COUNTRIES: Record<string, string> = {\n \"2004\": \"Afghanistan\",\n \"2008\": \"Albania\",\n \"2010\": \"Antarctica\",\n \"2012\": \"Algeria\",\n \"2016\": \"American Samoa\",\n \"2020\": \"Andorra\",\n \"2024\": \"Angola\",\n \"2028\": \"Antigua and Barbuda\",\n \"2031\": \"Azerbaijan\",\n \"2032\": \"Argentina\",\n \"2036\": \"Australia\",\n \"2040\": \"Austria\",\n \"2044\": \"The Bahamas\",\n \"2048\": \"Bahrain\",\n \"2050\": \"Bangladesh\",\n \"2051\": \"Armenia\",\n \"2052\": \"Barbados\",\n \"2056\": \"Belgium\",\n \"2060\": \"Bermuda\",\n \"2064\": \"Bhutan\",\n \"2068\": \"Bolivia\",\n \"2070\": \"Bosnia and Herzegovina\",\n \"2072\": \"Botswana\",\n \"2074\": \"Bouvet Island\",\n \"2076\": \"Brazil\",\n \"2084\": \"Belize\",\n \"2086\": \"British Indian Ocean Territory\",\n \"2090\": \"Solomon Islands\",\n \"2092\": \"British Virgin Islands\",\n \"2096\": \"Brunei\",\n \"2100\": \"Bulgaria\",\n \"2104\": \"Myanmar (Burma)\",\n \"2108\": \"Burundi\",\n \"2112\": \"Belarus\",\n \"2116\": \"Cambodia\",\n \"2120\": \"Cameroon\",\n \"2124\": \"Canada\",\n \"2132\": \"Cabo Verde\",\n \"2136\": \"Cayman Islands\",\n \"2140\": \"Central African Republic\",\n \"2144\": \"Sri Lanka\",\n \"2148\": \"Chad\",\n \"2152\": \"Chile\",\n \"2156\": \"China\",\n \"2158\": \"Taiwan\",\n \"2162\": \"Christmas Island\",\n \"2166\": \"Cocos (Keeling) Islands\",\n \"2170\": \"Colombia\",\n \"2174\": \"Comoros\",\n \"2175\": \"Mayotte\",\n \"2178\": \"Republic of the Congo\",\n \"2180\": \"Democratic Republic of the Congo\",\n \"2184\": \"Cook Islands\",\n \"2188\": \"Costa Rica\",\n \"2191\": \"Croatia\",\n \"2196\": \"Cyprus\",\n \"2203\": \"Czechia\",\n \"2204\": \"Benin\",\n \"2208\": \"Denmark\",\n \"2212\": \"Dominica\",\n \"2214\": \"Dominican Republic\",\n \"2218\": \"Ecuador\",\n \"2222\": \"El Salvador\",\n \"2226\": \"Equatorial Guinea\",\n \"2231\": \"Ethiopia\",\n \"2232\": \"Eritrea\",\n \"2233\": \"Estonia\",\n \"2234\": \"Faroe Islands\",\n \"2238\": \"Falkland Islands (Islas Malvinas)\",\n \"2239\": \"South Georgia and the South Sandwich Islands\",\n \"2242\": \"Fiji\",\n \"2246\": \"Finland\",\n \"2250\": \"France\",\n \"2254\": \"French Guiana\",\n \"2258\": \"French Polynesia\",\n \"2260\": \"French Southern and Antarctic Lands\",\n \"2262\": \"Djibouti\",\n \"2266\": \"Gabon\",\n \"2268\": \"Georgia\",\n \"2270\": \"The Gambia\",\n \"2275\": \"Palestine\",\n \"2276\": \"Germany\",\n \"2288\": \"Ghana\",\n \"2292\": \"Gibraltar\",\n \"2296\": \"Kiribati\",\n \"2300\": \"Greece\",\n \"2304\": \"Greenland\",\n \"2308\": \"Grenada\",\n \"2312\": \"Guadeloupe\",\n \"2316\": \"Guam\",\n \"2320\": \"Guatemala\",\n \"2324\": \"Guinea\",\n \"2328\": \"Guyana\",\n \"2332\": \"Haiti\",\n \"2334\": \"Heard Island and McDonald Islands\",\n \"2336\": \"Vatican City\",\n \"2340\": \"Honduras\",\n \"2344\": \"Hong Kong\",\n \"2348\": \"Hungary\",\n \"2352\": \"Iceland\",\n \"2356\": \"India\",\n \"2360\": \"Indonesia\",\n \"2368\": \"Iraq\",\n \"2372\": \"Ireland\",\n \"2376\": \"Israel\",\n \"2380\": \"Italy\",\n \"2384\": \"Cote d'Ivoire\",\n \"2388\": \"Jamaica\",\n \"2392\": \"Japan\",\n \"2398\": \"Kazakhstan\",\n \"2400\": \"Jordan\",\n \"2404\": \"Kenya\",\n \"2410\": \"South Korea\",\n \"2414\": \"Kuwait\",\n \"2417\": \"Kyrgyzstan\",\n \"2418\": \"Laos\",\n \"2422\": \"Lebanon\",\n \"2426\": \"Lesotho\",\n \"2428\": \"Latvia\",\n \"2430\": \"Liberia\",\n \"2434\": \"Libya\",\n \"2438\": \"Liechtenstein\",\n \"2440\": \"Lithuania\",\n \"2442\": \"Luxembourg\",\n \"2446\": \"Macao\",\n \"2450\": \"Madagascar\",\n \"2454\": \"Malawi\",\n \"2458\": \"Malaysia\",\n \"2462\": \"Maldives\",\n \"2466\": \"Mali\",\n \"2470\": \"Malta\",\n \"2474\": \"Martinique\",\n \"2478\": \"Mauritania\",\n \"2480\": \"Mauritius\",\n \"2484\": \"Mexico\",\n \"2492\": \"Monaco\",\n \"2496\": \"Mongolia\",\n \"2498\": \"Moldova\",\n \"2499\": \"Montenegro\",\n \"2500\": \"Montserrat\",\n \"2504\": \"Morocco\",\n \"2508\": \"Mozambique\",\n \"2512\": \"Oman\",\n \"2516\": \"Namibia\",\n \"2520\": \"Nauru\",\n \"2524\": \"Nepal\",\n \"2528\": \"Netherlands\",\n \"2531\": \"Curacao\",\n \"2533\": \"Aruba\",\n \"2534\": \"Sint Maarten\",\n \"2535\": \"Caribbean Netherlands\",\n \"2540\": \"New Caledonia\",\n \"2548\": \"Vanuatu\",\n \"2554\": \"New Zealand\",\n \"2558\": \"Nicaragua\",\n \"2562\": \"Niger\",\n \"2566\": \"Nigeria\",\n \"2570\": \"Niue\",\n \"2574\": \"Norfolk Island\",\n \"2578\": \"Norway\",\n \"2580\": \"Northern Mariana Islands\",\n \"2581\": \"United States Minor Outlying Islands\",\n \"2583\": \"Micronesia\",\n \"2584\": \"Marshall Islands\",\n \"2585\": \"Palau\",\n \"2586\": \"Pakistan\",\n \"2591\": \"Panama\",\n \"2598\": \"Papua New Guinea\",\n \"2600\": \"Paraguay\",\n \"2604\": \"Peru\",\n \"2608\": \"Philippines\",\n \"2612\": \"Pitcairn Islands\",\n \"2616\": \"Poland\",\n \"2620\": \"Portugal\",\n \"2624\": \"Guinea-Bissau\",\n \"2626\": \"Timor-Leste\",\n \"2630\": \"Puerto Rico\",\n \"2634\": \"Qatar\",\n \"2638\": \"Reunion\",\n \"2642\": \"Romania\",\n \"2643\": \"Russia\",\n \"2646\": \"Rwanda\",\n \"2652\": \"Saint Barthelemy\",\n \"2654\": \"Saint Helena, Ascension and Tristan da Cunha\",\n \"2659\": \"Saint Kitts and Nevis\",\n \"2660\": \"Anguilla\",\n \"2662\": \"Saint Lucia\",\n \"2663\": \"Saint Martin\",\n \"2666\": \"Saint Pierre and Miquelon\",\n \"2670\": \"Saint Vincent and the Grenadines\",\n \"2674\": \"San Marino\",\n \"2678\": \"Sao Tome and Principe\",\n \"2682\": \"Saudi Arabia\",\n \"2686\": \"Senegal\",\n \"2688\": \"Serbia\",\n \"2690\": \"Seychelles\",\n \"2694\": \"Sierra Leone\",\n \"2702\": \"Singapore\",\n \"2703\": \"Slovakia\",\n \"2704\": \"Vietnam\",\n \"2705\": \"Slovenia\",\n \"2706\": \"Somalia\",\n \"2710\": \"South Africa\",\n \"2716\": \"Zimbabwe\",\n \"2724\": \"Spain\",\n \"2728\": \"South Sudan\",\n \"2732\": \"Western Sahara\",\n \"2736\": \"Sudan\",\n \"2740\": \"Suriname\",\n \"2744\": \"Svalbard and Jan Mayen\",\n \"2748\": \"Eswatini\",\n \"2752\": \"Sweden\",\n \"2756\": \"Switzerland\",\n \"2760\": \"Syria\",\n \"2762\": \"Tajikistan\",\n \"2764\": \"Thailand\",\n \"2768\": \"Togo\",\n \"2772\": \"Tokelau\",\n \"2776\": \"Tonga\",\n \"2780\": \"Trinidad and Tobago\",\n \"2784\": \"United Arab Emirates\",\n \"2788\": \"Tunisia\",\n \"2792\": \"Turkiye\",\n \"2795\": \"Turkmenistan\",\n \"2796\": \"Turks and Caicos Islands\",\n \"2798\": \"Tuvalu\",\n \"2800\": \"Uganda\",\n \"2804\": \"Ukraine\",\n \"2807\": \"North Macedonia\",\n \"2818\": \"Egypt\",\n \"2826\": \"United Kingdom\",\n \"2831\": \"Guernsey\",\n \"2832\": \"Jersey\",\n \"2833\": \"Isle of Man\",\n \"2834\": \"Tanzania\",\n \"2840\": \"United States\",\n \"2850\": \"U.S. Virgin Islands\",\n \"2854\": \"Burkina Faso\",\n \"2858\": \"Uruguay\",\n \"2860\": \"Uzbekistan\",\n \"2862\": \"Venezuela\",\n \"2876\": \"Wallis and Futuna\",\n \"2882\": \"Samoa\",\n \"2887\": \"Yemen\",\n \"2894\": \"Zambia\",\n \"2900\": \"Kosovo\",\n};\n\nexport const LANGUAGE_CONSTANTS: Record<string, string> = {\n \"1000\": \"English\",\n \"1001\": \"German\",\n \"1002\": \"French\",\n \"1003\": \"Spanish\",\n \"1004\": \"Italian\",\n \"1005\": \"Japanese\",\n \"1009\": \"Danish\",\n \"1010\": \"Dutch\",\n \"1011\": \"Finnish\",\n \"1012\": \"Korean\",\n \"1013\": \"Norwegian\",\n \"1014\": \"Portuguese\",\n \"1015\": \"Swedish\",\n \"1017\": \"Chinese (simplified)\",\n \"1018\": \"Chinese (traditional)\",\n \"1019\": \"Arabic\",\n \"1020\": \"Bulgarian\",\n \"1021\": \"Czech\",\n \"1022\": \"Greek\",\n \"1023\": \"Hindi\",\n \"1024\": \"Hungarian\",\n \"1025\": \"Indonesian\",\n \"1026\": \"Icelandic\",\n \"1027\": \"Hebrew\",\n \"1028\": \"Latvian\",\n \"1029\": \"Lithuanian\",\n \"1030\": \"Polish\",\n \"1031\": \"Russian\",\n \"1032\": \"Romanian\",\n \"1033\": \"Slovak\",\n \"1034\": \"Slovenian\",\n \"1035\": \"Serbian\",\n \"1036\": \"Ukrainian\",\n \"1037\": \"Turkish\",\n \"1038\": \"Catalan\",\n \"1039\": \"Croatian\",\n \"1040\": \"Vietnamese\",\n \"1041\": \"Urdu\",\n \"1042\": \"Filipino\",\n \"1043\": \"Estonian\",\n \"1044\": \"Thai\",\n \"1056\": \"Bengali\",\n \"1064\": \"Persian\",\n \"1072\": \"Gujarati\",\n \"1086\": \"Kannada\",\n \"1098\": \"Malayalam\",\n \"1101\": \"Marathi\",\n \"1102\": \"Malay\",\n \"1110\": \"Punjabi\",\n \"1130\": \"Tamil\",\n \"1131\": \"Telugu\",\n};\n","import { IOptions } from './options';\n\n/**\n * Check if `vhost` is a valid suffix of `hostname` (top-domain)\n *\n * It means that `vhost` needs to be a suffix of `hostname` and we then need to\n * make sure that: either they are equal, or the character preceding `vhost` in\n * `hostname` is a '.' (it should not be a partial label).\n *\n * * hostname = 'not.evil.com' and vhost = 'vil.com' => not ok\n * * hostname = 'not.evil.com' and vhost = 'evil.com' => ok\n * * hostname = 'not.evil.com' and vhost = 'not.evil.com' => ok\n */\nfunction shareSameDomainSuffix(hostname: string, vhost: string): boolean {\n if (hostname.endsWith(vhost)) {\n return (\n hostname.length === vhost.length ||\n hostname[hostname.length - vhost.length - 1] === '.'\n );\n }\n\n return false;\n}\n\n/**\n * Given a hostname and its public suffix, extract the general domain.\n */\nfunction extractDomainWithSuffix(\n hostname: string,\n publicSuffix: string,\n): string {\n // Locate the index of the last '.' in the part of the `hostname` preceding\n // the public suffix.\n //\n // examples:\n // 1. not.evil.co.uk => evil.co.uk\n // ^ ^\n // | | start of public suffix\n // | index of the last dot\n //\n // 2. example.co.uk => example.co.uk\n // ^ ^\n // | | start of public suffix\n // |\n // | (-1) no dot found before the public suffix\n const publicSuffixIndex = hostname.length - publicSuffix.length - 2;\n const lastDotBeforeSuffixIndex = hostname.lastIndexOf('.', publicSuffixIndex);\n\n // No '.' found, then `hostname` is the general domain (no sub-domain)\n if (lastDotBeforeSuffixIndex === -1) {\n return hostname;\n }\n\n // Extract the part between the last '.'\n return hostname.slice(lastDotBeforeSuffixIndex + 1);\n}\n\n/**\n * Detects the domain based on rules and upon and a host string\n */\nexport default function getDomain(\n suffix: string,\n hostname: string,\n options: IOptions,\n): string | null {\n // Check if `hostname` ends with a member of `validHosts`.\n if (options.validHosts !== null) {\n const validHosts = options.validHosts;\n for (const vhost of validHosts) {\n if (/*@__INLINE__*/ shareSameDomainSuffix(hostname, vhost)) {\n return vhost;\n }\n }\n }\n\n let numberOfLeadingDots = 0;\n if (hostname.startsWith('.')) {\n while (\n numberOfLeadingDots < hostname.length &&\n hostname[numberOfLeadingDots] === '.'\n ) {\n numberOfLeadingDots += 1;\n }\n }\n\n // If `hostname` is a valid public suffix, then there is no domain to return.\n // Since we already know that `getPublicSuffix` returns a suffix of `hostname`\n // there is no need to perform a string comparison and we only compare the\n // size.\n if (suffix.length === hostname.length - numberOfLeadingDots) {\n return null;\n }\n\n // To extract the general domain, we start by identifying the public suffix\n // (if any), then consider the domain to be the public suffix with one added\n // level of depth. (e.g.: if hostname is `not.evil.co.uk` and public suffix:\n // `co.uk`, then we take one more level: `evil`, giving the final result:\n // `evil.co.uk`).\n return /*@__INLINE__*/ extractDomainWithSuffix(hostname, suffix);\n}\n","/**\n * Return the part of domain without suffix.\n *\n * Example: for domain 'foo.com', the result would be 'foo'.\n */\nexport default function getDomainWithoutSuffix(\n domain: string,\n suffix: string,\n): string {\n // Note: here `domain` and `suffix` cannot have the same length because in\n // this case we set `domain` to `null` instead. It is thus safe to assume\n // that `suffix` is shorter than `domain`.\n return domain.slice(0, -suffix.length - 1);\n}\n","/**\n * Matches an ASCII tab (U+0009) or newline (U+000A / U+000D). The WHATWG URL\n * parser strips these before parsing; we only allocate a cleaned copy (and\n * re-parse) on the rare input that actually contains one.\n */\nconst CONTROL_CHARS = /[\\t\\n\\r]/g;\n\n// Set by `extractHostname` (a module-scope flag, read synchronously by\n// `parseImpl` right after the call — same pattern as the reused RESULT object).\n// `true` ONLY when extraction validated the returned host inline (a confirmed-\n// valid, \"simple\" authority) so `parseImpl` can skip the separate\n// `isValidHostname` pass. `false` in every other case (validation disabled, a\n// complex authority — userinfo/port/brackets/trailing-dot/control — an invalid\n// host, or a non-main return path); `parseImpl` then validates as usual. The\n// fast path can only ever SKIP a redundant scan for hosts already known valid,\n// never accept an invalid one.\nexport let extractedHostnameValidated = false;\n\n/**\n * True if char `code` is a valid hostname character. This is the per-char half\n * of `is-valid.ts`'s `isValidAscii` (a-z, 0-9, > U+007F) PLUS three additions:\n * A-Z (the host is lowercased before validation, so uppercase ≡ a valid\n * lowercase letter) and '-' / '_' (valid inside a label). KEEP IN SYNC with\n * `is-valid.ts`: these rules are deliberately duplicated to validate during\n * extraction, so any change to the accepted character set there must be\n * mirrored here (and vice-versa).\n */\nfunction isValidHostnameChar(code: number): boolean {\n return (\n (code >= 97 && code <= 122) || // a-z\n (code >= 48 && code <= 57) || // 0-9\n code > 127 || // non-ASCII (accepted, not punycode-checked)\n (code >= 65 && code <= 90) || // A-Z (becomes valid once lowercased)\n code === 45 || // '-'\n code === 95 // '_'\n );\n}\n\n/**\n * Classify scheme `url.slice(schemeStart, colonIndex)` as a WHATWG special\n * scheme without allocating a substring (case-insensitive via `| 32`).\n * Special schemes: ftp, file, http, https, ws, wss\n * (https://url.spec.whatwg.org/#special-scheme).\n *\n * @returns 0 = not special, 1 = special, 2 = file (its host sits only between\n * \"//\" and the next slash).\n */\nfunction getSpecialScheme(\n url: string,\n schemeStart: number,\n colonIndex: number,\n): number {\n const length = colonIndex - schemeStart;\n const c0 = url.charCodeAt(schemeStart) | 32;\n if (length === 2) {\n return c0 === 119 && (url.charCodeAt(schemeStart + 1) | 32) === 115 ? 1 : 0; // ws\n } else if (length === 3) {\n const c1 = url.charCodeAt(schemeStart + 1) | 32;\n const c2 = url.charCodeAt(schemeStart + 2) | 32;\n if (c0 === 119 && c1 === 115 && c2 === 115) return 1; // wss\n if (c0 === 102 && c1 === 116 && c2 === 112) return 1; // ftp\n return 0;\n } else if (length === 4) {\n const c1 = url.charCodeAt(schemeStart + 1) | 32;\n const c2 = url.charCodeAt(schemeStart + 2) | 32;\n const c3 = url.charCodeAt(schemeStart + 3) | 32;\n if (c0 === 104 && c1 === 116 && c2 === 116 && c3 === 112) return 1; // http\n if (c0 === 102 && c1 === 105 && c2 === 108 && c3 === 101) return 2; // file\n return 0;\n } else if (length === 5) {\n return c0 === 104 &&\n (url.charCodeAt(schemeStart + 1) | 32) === 116 &&\n (url.charCodeAt(schemeStart + 2) | 32) === 116 &&\n (url.charCodeAt(schemeStart + 3) | 32) === 112 &&\n (url.charCodeAt(schemeStart + 4) | 32) === 115\n ? 1\n : 0; // https\n }\n return 0;\n}\n\n/**\n * Extract a hostname from `url`, matching a WHATWG URL parser's host-boundary\n * behaviour (https://url.spec.whatwg.org/#concept-basic-url-parser) for tldts'\n * scope. It deliberately does NOT normalise the host (no IDNA/punycode or IPv4\n * canonicalisation; IPv6 brackets are stripped, not compressed), strips trailing\n * dots, and stays lenient where a strict parser rejects (bare host:port,\n * out-of-range port, user@host) — all documented deviations.\n *\n * @param urlIsValidHostname - when true, `url` is already a valid hostname and is\n * returned by the same reference (factory.ts skips re-validation on that\n * identity), keeping the common path allocation-free.\n * @param validate - when true, validate the host inline during the authority\n * scan and publish the verdict via `extractedHostnameValidated` so `parseImpl`\n * can skip the redundant `isValidHostname` pass for simple authorities.\n */\nexport default function extractHostname(\n url: string,\n urlIsValidHostname: boolean,\n validate = false,\n): string | null {\n let start = 0;\n let end: number = url.length;\n let hasUpper = false;\n let isSpecial = false;\n extractedHostnameValidated = false;\n\n if (!urlIsValidHostname) {\n // Data URLs never carry a host (and may be huge — short-circuit them).\n if (url.startsWith('data:')) {\n return null;\n }\n\n // WHATWG step 1: trim leading/trailing C0 control or space (<= U+0020).\n // Tab/newline elsewhere are handled lazily below.\n while (start < url.length && url.charCodeAt(start) <= 32) {\n start += 1;\n }\n while (end > start + 1 && url.charCodeAt(end - 1) <= 32) {\n end -= 1;\n }\n\n if (\n url.charCodeAt(start) === 47 /* '/' */ &&\n url.charCodeAt(start + 1) === 47 /* '/' */\n ) {\n // Scheme-relative reference (\"//host/path\").\n start += 2;\n } else {\n const indexOfProtocol = url.indexOf(':/', start);\n if (indexOfProtocol !== -1) {\n // \"scheme://…\". Classify the scheme, then position `start` at the host.\n const special = getSpecialScheme(url, start, indexOfProtocol);\n if (special === 1) {\n // Special scheme: skip the run of '/' and '\\' after it\n // (special-authority-(ignore-)slashes states; '\\' acts as '/').\n isSpecial = true;\n start = indexOfProtocol + 2;\n while (\n url.charCodeAt(start) === 47 /* '/' */ ||\n url.charCodeAt(start) === 92 /* '\\' */\n ) {\n start += 1;\n }\n } else if (special === 2) {\n // file: the host is only what sits between \"//\" and the next slash, so\n // \"file://h/x\" => \"h\" but \"file:///x\" / \"file:/x\" => no host.\n isSpecial = true;\n start = indexOfProtocol + 1;\n let slashes = 0;\n while (\n (url.charCodeAt(start) === 47 || url.charCodeAt(start) === 92) &&\n slashes < 2\n ) {\n start += 1;\n slashes += 1;\n }\n if (slashes < 2) {\n return null;\n }\n } else {\n // Unknown scheme: validate the WHATWG scheme grammar [A-Za-z0-9+.-];\n // a control char means it was split by a tab/newline (strip + re-parse).\n for (let i = start; i < indexOfProtocol; i += 1) {\n const code = url.charCodeAt(i) | 32;\n if (\n !(\n (\n (code >= 97 && code <= 122) || // [a, z]\n (code >= 48 && code <= 57) || // [0, 9]\n code === 46 || // '.'\n code === 45 || // '-'\n code === 43\n ) // '+'\n )\n ) {\n const raw = url.charCodeAt(i);\n if (raw === 9 || raw === 10 || raw === 13) {\n return extractHostname(\n url.replace(CONTROL_CHARS, ''),\n urlIsValidHostname,\n validate,\n );\n }\n return null;\n }\n }\n // A non-special scheme has an authority only after \"//\" (else it is an\n // opaque path with no host). `indexOf(':/')` already gave the first '/'.\n if (url.charCodeAt(indexOfProtocol + 2) === 47 /* '/' */) {\n start = indexOfProtocol + 3;\n } else {\n return null;\n }\n }\n } else if (url.charCodeAt(start) !== 91 /* '[' */) {\n // Cold path: no scheme \"://\", and not a bare IPv6 literal (whose first\n // ':' would otherwise look like a scheme separator; \"[…]\" falls through\n // to the ipv6 handling below). May be a bare host, a host:port, a\n // user@host, a slash-less special scheme (\"https:host\"), or an opaque\n // URI (\"mailto:\", \"tel:\", \"urn:…\").\n let indexOfColon = -1;\n for (let i = start; i < end; i += 1) {\n const code = url.charCodeAt(i);\n if (code === 9 || code === 10 || code === 13) {\n return extractHostname(\n url.replace(CONTROL_CHARS, ''),\n urlIsValidHostname,\n validate,\n );\n }\n if (code === 58 /* ':' */) {\n indexOfColon = i;\n break;\n }\n if (code === 47 || code === 92 || code === 63 || code === 35) {\n break;\n }\n }\n\n if (indexOfColon !== -1) {\n // An '@' before the next delimiter => the ':' is userinfo, not a\n // scheme (\"user:pass@host\", \"mailto:a@b\"): keep the whole authority.\n let hasIdentifier = false;\n for (let i = indexOfColon + 1; i < end; i += 1) {\n const code = url.charCodeAt(i);\n if (code === 47 || code === 92 || code === 63 || code === 35) {\n break;\n }\n if (code === 64 /* '@' */) {\n hasIdentifier = true;\n break;\n }\n }\n\n if (!hasIdentifier) {\n // All-digits after ':' => a bare \"host:port\" (tldts accepts\n // hostnames too); keep `start` and let the port handling trim it.\n let allDigits = true;\n let i = indexOfColon + 1;\n for (; i < end; i += 1) {\n const code = url.charCodeAt(i);\n if (code === 47 || code === 92 || code === 63 || code === 35) {\n break;\n }\n if (code < 48 /* '0' */ || code > 57 /* '9' */) {\n allDigits = false;\n break;\n }\n }\n if (i === indexOfColon + 1) {\n allDigits = false; // nothing after ':' => not a port\n }\n\n if (!allDigits) {\n const special = getSpecialScheme(url, start, indexOfColon);\n if (special === 0) {\n // No \"://\" anywhere on the cold path and not a special scheme.\n // A second ':' before the host's end marks a bare, unbracketed\n // IPv6 literal (\"2a01:e35::1\"): fall through and let the host\n // loop + isIp classify it. Without one this is an opaque path\n // with no host (\"mailto:x\", \"foo:bar\").\n let isBareIpv6 = false;\n for (let j = indexOfColon + 1; j < end; j += 1) {\n const code = url.charCodeAt(j);\n if (\n code === 47 ||\n code === 92 ||\n code === 63 ||\n code === 35\n ) {\n break;\n }\n if (code === 58 /* ':' */) {\n isBareIpv6 = true;\n break;\n }\n }\n if (!isBareIpv6) {\n return null;\n }\n } else {\n isSpecial = true;\n start = indexOfColon + 1;\n if (special === 2) {\n // file (e.g. \"file:\\\\host\"): host only between \"//\" and next slash.\n let slashes = 0;\n while (\n (url.charCodeAt(start) === 47 ||\n url.charCodeAt(start) === 92) &&\n slashes < 2\n ) {\n start += 1;\n slashes += 1;\n }\n if (slashes < 2) {\n return null;\n }\n } else {\n while (\n url.charCodeAt(start) === 47 ||\n url.charCodeAt(start) === 92\n ) {\n start += 1;\n }\n }\n }\n }\n }\n }\n }\n }\n\n // Find the host's end: first '/', '?' or '#' (and '\\' for special URLs,\n // which WHATWG treats like '/'). Track the last '@', ']' and ':' for\n // userinfo, ipv6 and port, plus the first ':' of the host (reset at each\n // '@') to tell a bare IPv6 (>= 2 colons) from a host:port (exactly one);\n // flag uppercase and a stray tab/newline. The loop is split on `code < 64`\n // so common host characters take fewer comparisons.\n //\n // When `validate`, also accumulate `is-valid.ts`'s checks over the scanned\n // run so a simple authority's host can be validated in this single pass.\n // `vValid` only stays meaningful for a \"simple\" authority (no userinfo, port,\n // brackets, control or trailing dot); those cases clear it / are rejected by\n // the guard below, falling back to `isValidHostname`.\n let indexOfIdentifier = -1;\n let indexOfClosingBracket = -1;\n let indexOfPort = -1;\n let indexOfFirstColon = -1;\n let hasControl = false;\n let vValid = validate; // seeded true when validating; cleared on the first invalid char\n let vLastDot = start - 1; // mirrors is-valid.ts `lastDotIndex = -1` at host start\n let vLastCode = -1;\n if (validate && start < end) {\n // First-char rule: must be a valid host char, '.', or '_' (NOT '-').\n const c0 = url.charCodeAt(start);\n if (\n !(\n /*@__INLINE__*/ (\n isValidHostnameChar(c0) ||\n c0 === 46 /* '.' */ ||\n c0 === 95 /* '_' */\n )\n ) ||\n c0 === 45 /* '-' (isValidHostnameChar allows it mid-label, not first) */\n ) {\n vValid = false;\n }\n }\n for (let i = start; i < end; i += 1) {\n const code: number = url.charCodeAt(i);\n if (code < 64) {\n if (code === 47 || code === 35 || code === 63) {\n end = i;\n break;\n } else if (code === 58 /* ':' */) {\n if (indexOfFirstColon === -1) {\n indexOfFirstColon = i;\n }\n indexOfPort = i;\n } else if (code === 9 || code === 10 || code === 13) {\n hasControl = true;\n } else if (validate) {\n if (code === 46 /* '.' */) {\n if (i - vLastDot > 64 || vLastCode === 46 || vLastCode === 45) {\n vValid = false;\n }\n vLastDot = i;\n } else if (code < 48 || code > 57) {\n // < 64 and not a delimiter/dot/digit => only '-' (45) is a valid\n // host char here; everything else (space, %, !, etc.) is invalid.\n // A '-' must also not START a label (the byte right after a '.') —\n // mirrors is-valid.ts; the first label is covered by the first-char\n // rule above. (RFC 1034 §3.5 / RFC 1035 §2.3.1 LDH.)\n if (code !== 45 || vLastCode === 46 /* label-leading '-' */) {\n vValid = false;\n }\n }\n }\n } else if (isSpecial && code === 92 /* '\\' */) {\n end = i;\n break;\n } else if (code === 64 /* '@' */) {\n indexOfIdentifier = i;\n indexOfFirstColon = -1; // colons before '@' are userinfo, not the host\n } else if (code === 93 /* ']' */) {\n indexOfClosingBracket = i;\n } else if (code >= 65 && code <= 90) {\n hasUpper = true;\n } else if (validate && !(/*@__INLINE__*/ isValidHostnameChar(code))) {\n // >= 64, not '@'/']'/upper: valid only if a-z, '_', or non-ASCII.\n vValid = false;\n }\n if (validate) {\n vLastCode = code;\n }\n }\n\n // A tab/newline inside the authority: strip everything and re-parse (rare).\n if (hasControl) {\n return extractHostname(\n url.replace(CONTROL_CHARS, ''),\n urlIsValidHostname,\n validate,\n );\n }\n\n // Skip userinfo. '>= start' so an empty userinfo (\"http://@host\") works too.\n if (\n indexOfIdentifier !== -1 &&\n indexOfIdentifier >= start &&\n indexOfIdentifier < end\n ) {\n start = indexOfIdentifier + 1;\n }\n\n if (url.charCodeAt(start) === 91 /* '[' */) {\n // ipv6 address: return what is between the brackets, or null if unclosed.\n if (indexOfClosingBracket !== -1) {\n return url.slice(start + 1, indexOfClosingBracket).toLowerCase();\n }\n return null;\n } else if (\n indexOfPort !== -1 &&\n indexOfPort > start &&\n indexOfPort < end &&\n // A host:port has exactly one ':' in the host (so its first ':' is its\n // last); a bare, unbracketed IPv6 literal (\"2a01:e35::1\") has >= 2, so\n // its first ':' precedes the last. Only the former has a ':port' to trim.\n indexOfFirstColon === indexOfPort\n ) {\n end = indexOfPort; // trim ':port'\n }\n\n // Empty authority (\"http://\", \"file:///path\", \"//\"); only reachable here via\n // extraction — a bare valid hostname never lands here.\n if (start >= end) {\n return null;\n }\n\n // Publish the inline-validation verdict — but only for a \"simple\" authority,\n // where the scanned run equals the final host: no userinfo skip, no port\n // trim, no brackets, no trailing dot (trimmed below), and length within RFC\n // limits. Anything else leaves it `false` so `parseImpl` re-validates.\n //\n // Every clause below is load-bearing for CORRECTNESS, not just speed: the\n // loop accumulates `vValid` over the whole scanned run (it does not stop at\n // ':' or '@', so any port/userinfo bytes are included), so the verdict is\n // only sound when that run equals the final host. Do not drop a clause as\n // \"redundant\" — e.g. without `indexOfPort === -1`, `host:8080` would be\n // wrongly accepted.\n if (\n validate &&\n vValid &&\n indexOfIdentifier === -1 &&\n indexOfPort === -1 &&\n indexOfClosingBracket === -1 &&\n url.charCodeAt(end - 1) !== 46 /* no trailing dot */ &&\n end - start <= 255 && // total length\n end - vLastDot - 1 <= 63 && // last label length\n vLastCode !== 45 /* last char not '-' */\n ) {\n extractedHostnameValidated = true;\n }\n }\n\n // Trim trailing dots\n while (end > start + 1 && url.charCodeAt(end - 1) === 46 /* '.' */) {\n end -= 1;\n }\n\n const hostname: string =\n start !== 0 || end !== url.length ? url.slice(start, end) : url;\n\n if (hasUpper) {\n return hostname.toLowerCase();\n }\n\n return hostname;\n}\n","/**\n * Check if a hostname is an IP. You should be aware that this only works\n * because `hostname` is already garanteed to be a valid hostname!\n */\nfunction isProbablyIpv4(hostname: string): boolean {\n // Cannot be shorted than 1.1.1.1\n if (hostname.length < 7) {\n return false;\n }\n\n // Cannot be longer than: 255.255.255.255\n if (hostname.length > 15) {\n return false;\n }\n\n let numberOfDots = 0;\n\n for (let i = 0; i < hostname.length; i += 1) {\n const code = hostname.charCodeAt(i);\n\n if (code === 46 /* '.' */) {\n numberOfDots += 1;\n } else if (code < 48 /* '0' */ || code > 57 /* '9' */) {\n return false;\n }\n }\n\n return (\n numberOfDots === 3 &&\n hostname.charCodeAt(0) !== 46 /* '.' */ &&\n hostname.charCodeAt(hostname.length - 1) !== 46 /* '.' */\n );\n}\n\n/**\n * Similar to isProbablyIpv4.\n */\nfunction isProbablyIpv6(hostname: string): boolean {\n if (hostname.length < 3) {\n return false;\n }\n\n let start = hostname.startsWith('[') ? 1 : 0;\n let end = hostname.length;\n\n if (hostname[end - 1] === ']') {\n end -= 1;\n }\n\n // We only consider the maximum size of a normal IPV6. Note that this will\n // fail on so-called \"IPv4 mapped IPv6 addresses\" but this is a corner-case\n // and a proper validation library should be used for these.\n if (end - start > 39) {\n return false;\n }\n\n let hasColon = false;\n\n for (; start < end; start += 1) {\n const code = hostname.charCodeAt(start);\n\n if (code === 58 /* ':' */) {\n hasColon = true;\n } else if (\n !(\n (\n (code >= 48 && code <= 57) || // 0-9\n (code >= 97 && code <= 102) || // a-f\n (code >= 65 && code <= 70)\n ) // A-F (RFC 4291 §2.2: an IPv6 hextet is hex digits only)\n )\n ) {\n return false;\n }\n }\n\n return hasColon;\n}\n\n/**\n * Check if `hostname` is *probably* a valid ip addr (either ipv6 or ipv4).\n * This *will not* work on any string. We need `hostname` to be a valid\n * hostname.\n */\nexport default function isIp(hostname: string): boolean {\n return isProbablyIpv6(hostname) || isProbablyIpv4(hostname);\n}\n","/**\n * Special-use domain names from the IANA \"Special-Use Domain Names\" registry:\n * the authoritative list, created by RFC 6761 and maintained as new RFCs add to\n * it: https://www.iana.org/assignments/special-use-domain-names/\n * Snapshot: 2026-05-24. (RFC 6761 is not obsoleted; draft-hoffman-rfc6761bis\n * proposes to retire its prose but keep this registry, so the registry is the\n * source of truth; re-sync this list against it.)\n *\n * These names never correspond to a public registration, yet neither\n * `isIcann` nor `isPrivate` marks one as special-use: most are absent from the\n * Public Suffix List (so `a.test` looks like a registrable domain), and the\n * few that are listed (`onion`, `home.arpa`) appear there as ordinary ICANN\n * suffixes. `isSpecialUse` is the single signal that covers them all.\n *\n * Per the registry and RFC 6761 (\"and any names falling within these domains\"),\n * the designation covers each listed name AND all of its sub-domains. DNS labels\n * are case-insensitive (RFC 4343); `hostname` is expected to be already\n * lower-cased and trailing-dot-stripped, as produced by `extractHostname`, the\n * same normalization the Public-Suffix-List lookup relies on.\n *\n * Two groups of registry entries are intentionally excluded: the numeric\n * reverse-DNS delegation zones (`10.in-addr.arpa`, the `*.ip6.arpa` ranges, …),\n * which are reverse-DNS PTR zones rather than hostnames and whose parents\n * (`in-addr.arpa`/`ip6.arpa`) are already in the Public Suffix List; and the\n * deprecated `eap-noob.arpa` entry.\n */\nconst SPECIAL_USE_DOMAINS: readonly string[] = [\n 'test', // RFC 6761\n 'localhost', // RFC 6761\n 'invalid', // RFC 6761\n 'example', // RFC 6761\n 'example.com', // RFC 6761\n 'example.net', // RFC 6761\n 'example.org', // RFC 6761\n 'local', // RFC 6762 (mDNS)\n 'onion', // RFC 7686 (Tor)\n 'alt', // RFC 9476\n 'home.arpa', // RFC 8375\n 'ipv4only.arpa', // RFC 8880\n 'resolver.arpa', // RFC 9462\n 'service.arpa', // RFC 9665\n '6tisch.arpa', // RFC 9031\n 'eap.arpa', // RFC 9965\n];\n\n/**\n * Return `true` if `hostname` is, or is a sub-domain of, a special-use domain\n * (see the registry note above). Expects an already-normalized `hostname`.\n */\nexport default function isSpecialUse(hostname: string): boolean {\n for (const name of SPECIAL_USE_DOMAINS) {\n // Match on a label boundary: `hostname` is either exactly `name` or ends\n // with `.name` (so `latest` is not matched by `test`, nor `myexample.com`\n // by `example.com`).\n if (\n hostname.endsWith(name) &&\n (hostname.length === name.length ||\n hostname.charCodeAt(hostname.length - name.length - 1) === 46) /* '.' */\n ) {\n return true;\n }\n }\n\n return false;\n}\n","/**\n * Implements fast shallow verification of hostnames. This does not perform a\n * struct check on the content of labels (classes of Unicode characters, etc.)\n * but instead check that the structure is valid (number of labels, length of\n * labels, etc.).\n *\n * If you need stricter validation, consider using an external library.\n */\n\n// KEEP IN SYNC with `extract-hostname.ts` `isValidHostnameChar` + its inline\n// scan/verdict, which duplicate these structural rules to validate during\n// extraction (a perf fusion). That copy additionally accepts A-Z (the host is\n// not yet lowercased there) and folds in '-' / '_'. Any change to the accepted\n// character set or the label/length rules here must be mirrored there.\nfunction isValidAscii(code: number): boolean {\n return (\n (code >= 97 && code <= 122) || (code >= 48 && code <= 57) || code > 127\n );\n}\n\n/**\n * Check if a hostname string is valid. It's usually a preliminary check before\n * trying to use getDomain or anything else.\n *\n * Beware: it does not check if the TLD exists.\n */\nexport default function (hostname: string): boolean {\n if (hostname.length > 255) {\n return false;\n }\n\n if (hostname.length === 0) {\n return false;\n }\n\n if (\n /*@__INLINE__*/ !isValidAscii(hostname.charCodeAt(0)) &&\n hostname.charCodeAt(0) !== 46 && // '.' (dot)\n hostname.charCodeAt(0) !== 95 // '_' (underscore)\n ) {\n return false;\n }\n\n // Validate hostname according to RFC\n let lastDotIndex = -1;\n let lastCharCode = -1;\n const len = hostname.length;\n\n for (let i = 0; i < len; i += 1) {\n const code = hostname.charCodeAt(i);\n if (code === 46 /* '.' */) {\n if (\n // Check that previous label is < 63 bytes long (64 = 63 + '.')\n i - lastDotIndex > 64 ||\n // Check that previous character was not already a '.'\n lastCharCode === 46 ||\n // Check that the previous label does not end with '-' (RFC 1035 §2.3.1 LDH).\n // '_' is intentionally NOT restricted: DNS allows any octet (RFC 2181 §11) and\n // WHATWG URL does not treat '_' as a forbidden host code point.\n lastCharCode === 45\n ) {\n return false;\n }\n\n lastDotIndex = i;\n } else if (\n // A forbidden character in the label...\n !(/*@__INLINE__*/ (isValidAscii(code) || code === 45 || code === 95)) ||\n // ...or a '-' starting a label (the byte right after a '.'). A label must\n // not begin with a hyphen (RFC 1034 §3.5 / RFC 1035 §2.3.1 LDH, as amended\n // by RFC 1123 §2.1; cf. UTS #46 CheckHyphens). The first label is covered by\n // the leading-character guard above; mirrors the trailing-'-' rule below.\n (code === 45 && lastCharCode === 46)\n ) {\n return false;\n }\n\n lastCharCode = code;\n }\n\n return (\n // Check that last label is shorter than 63 chars\n len - lastDotIndex - 1 <= 63 &&\n // Check that the last character is an allowed trailing label character.\n // Since we already checked that the char is a valid hostname character,\n // we only need to check that it's different from '-'.\n lastCharCode !== 45\n );\n}\n","export interface IOptions {\n allowIcannDomains: boolean;\n allowPrivateDomains: boolean;\n detectIp: boolean;\n // Detect RFC 6761 / IANA special-use domains and expose the result as\n // `isSpecialUse` on `parse()`. Off by default so the common path stays\n // allocation-free with no extra work; enable it to populate the field.\n detectSpecialUse: boolean;\n extractHostname: boolean;\n mixedInputs: boolean;\n validHosts: string[] | null;\n validateHostname: boolean;\n}\n\nfunction setDefaultsImpl({\n allowIcannDomains = true,\n allowPrivateDomains = false,\n detectIp = true,\n detectSpecialUse = false,\n extractHostname = true,\n mixedInputs = true,\n validHosts = null,\n validateHostname = true,\n}: Partial<IOptions>): IOptions {\n return {\n allowIcannDomains,\n allowPrivateDomains,\n detectIp,\n detectSpecialUse,\n extractHostname,\n mixedInputs,\n validHosts,\n validateHostname,\n };\n}\n\nconst DEFAULT_OPTIONS = /*@__INLINE__*/ setDefaultsImpl({});\n\nexport function setDefaults(options?: Partial<IOptions>): IOptions {\n if (options === undefined) {\n return DEFAULT_OPTIONS;\n }\n\n return /*@__INLINE__*/ setDefaultsImpl(options);\n}\n","/**\n * Returns the subdomain of a hostname string\n */\nexport default function getSubdomain(hostname: string, domain: string): string {\n // If `hostname` and `domain` are the same, then there is no sub-domain\n if (domain.length === hostname.length) {\n return '';\n }\n\n return hostname.slice(0, -domain.length - 1);\n}\n","/**\n * Implement a factory allowing to plug different implementations of suffix\n * lookup (e.g.: using a trie or the packed hashes datastructures). This is used\n * and exposed in `tldts.ts` and `tldts-experimental.ts` bundle entrypoints.\n */\n\nimport getDomain from './domain';\nimport getDomainWithoutSuffix from './domain-without-suffix';\nimport extractHostname, {\n extractedHostnameValidated,\n} from './extract-hostname';\nimport isIp from './is-ip';\nimport isSpecialUse from './is-special-use';\nimport isValidHostname from './is-valid';\nimport { IPublicSuffix, ISuffixLookupOptions } from './lookup/interface';\nimport { IOptions, setDefaults } from './options';\nimport getSubdomain from './subdomain';\n\nexport interface IResult {\n // `hostname` is either a registered name (including but not limited to a\n // hostname), or an IP address, directly extracted from the input URL. IPv4\n // addresses are in dot-decimal notation. IPv6 is returned without its\n // surrounding brackets; both bracketed (in URLs, e.g. `http://[::1]/`) and\n // bare unbracketed (e.g. `2a01:e35::1`) IPv6 literals are accepted.\n hostname: string | null;\n\n // Is `hostname` an IP? (IPv4 or IPv6)\n isIp: boolean | null;\n\n // `hostname` split between subdomain, domain and its public suffix (if any)\n subdomain: string | null;\n domain: string | null;\n publicSuffix: string | null;\n domainWithoutSuffix: string | null;\n\n // Specifies if `publicSuffix` comes from the ICANN or PRIVATE section of the list\n isIcann: boolean | null;\n isPrivate: boolean | null;\n\n // Is `hostname` a special-use domain from the IANA registry (RFC 6761 et al.:\n // e.g. `localhost`, `*.test`, `*.local`, `*.onion`, `home.arpa`)? `isIcann`/\n // `isPrivate` do not identify these (most are not in the Public Suffix List;\n // the few that are appear as ordinary ICANN suffixes). `null` unless the\n // `detectSpecialUse` option is enabled (see is-special-use.ts).\n isSpecialUse: boolean | null;\n}\n\nexport function getEmptyResult(): IResult {\n return {\n domain: null,\n domainWithoutSuffix: null,\n hostname: null,\n isIcann: null,\n isIp: null,\n isPrivate: null,\n isSpecialUse: null,\n publicSuffix: null,\n subdomain: null,\n };\n}\n\nexport function resetResult(result: IResult): void {\n result.domain = null;\n result.domainWithoutSuffix = null;\n result.hostname = null;\n result.isIcann = null;\n result.isIp = null;\n result.isPrivate = null;\n result.isSpecialUse = null;\n result.publicSuffix = null;\n result.subdomain = null;\n}\n\n// Flags representing steps in the `parse` function. They are used to implement\n// an early stop mechanism (simulating some form of laziness) to avoid doing\n// more work than necessary to perform a given action (e.g.: we don't need to\n// extract the domain and subdomain if we are only interested in public suffix).\nexport const enum FLAG {\n HOSTNAME,\n IS_VALID,\n PUBLIC_SUFFIX,\n DOMAIN,\n SUB_DOMAIN,\n ALL,\n}\n\nexport function parseImpl(\n url: string,\n step: FLAG,\n suffixLookup: (\n _1: string,\n _2: ISuffixLookupOptions,\n _3: IPublicSuffix,\n ) => void,\n partialOptions: Partial<IOptions> | undefined,\n result: IResult,\n): IResult {\n const options: IOptions = /*@__INLINE__*/ setDefaults(partialOptions);\n\n // Very fast approximate check to make sure `url` is a string. This is needed\n // because the library will not necessarily be used in a typed setup and\n // values of arbitrary types might be given as argument.\n if (typeof url !== 'string') {\n return result;\n }\n\n // Extract hostname from `url` only if needed. This can be made optional\n // using `options.extractHostname`. This option will typically be used\n // whenever we are sure the inputs to `parse` are already hostnames and not\n // arbitrary URLs.\n //\n // `mixedInput` allows to specify if we expect a mix of URLs and hostnames\n // as input. If only hostnames are expected then `extractHostname` can be\n // set to `false` to speed-up parsing. If only URLs are expected then\n // `mixedInputs` can be set to `false`. The `mixedInputs` is only a hint\n // and will not change the behavior of the library.\n // Whether `url` itself was already a valid hostname (only computed on the\n // mixedInputs path). Lets us skip the post-extraction validation below when\n // extractHostname returned `url` unchanged (same reference).\n let urlIsValid = false;\n if (!options.extractHostname) {\n result.hostname = url;\n } else if (options.mixedInputs) {\n urlIsValid = isValidHostname(url);\n result.hostname = extractHostname(\n url,\n urlIsValid,\n options.validateHostname,\n );\n } else {\n result.hostname = extractHostname(url, false, options.validateHostname);\n }\n\n // Check if `hostname` is a valid ip address\n if (options.detectIp && result.hostname !== null) {\n result.isIp = isIp(result.hostname);\n if (result.isIp) {\n return result;\n }\n }\n\n // Perform hostname validation if enabled. If hostname is not valid, no need to\n // go further as there will be no valid domain or sub-domain. This validation\n // is applied before any early returns to ensure consistent behavior across\n // all API methods including getHostname().\n if (\n options.validateHostname &&\n options.extractHostname &&\n result.hostname !== null &&\n // Skip the re-scan when `url` was already validated and extractHostname\n // returned it unchanged (same reference => identical string, still valid).\n !(urlIsValid && result.hostname === url) &&\n // Skip the re-scan when extractHostname already validated the host inline\n // (a confirmed-valid simple authority — see extract-hostname.ts).\n !extractedHostnameValidated &&\n !isValidHostname(result.hostname)\n ) {\n result.hostname = null;\n return result;\n }\n\n if (step === FLAG.HOSTNAME || result.hostname === null) {\n return result;\n }\n\n // Flag special-use domains, only when opted in (`detectSpecialUse`) and only\n // for the full `parse()` result (FLAG.ALL). Computed here, before the\n // public-suffix/domain early-returns below, so single-label names like\n // `localhost` (which have no registrable domain) are still flagged.\n if (step === FLAG.ALL && options.detectSpecialUse) {\n result.isSpecialUse = isSpecialUse(result.hostname);\n }\n\n // Extract public suffix\n suffixLookup(result.hostname, options, result);\n if (step === FLAG.PUBLIC_SUFFIX || result.publicSuffix === null) {\n return result;\n }\n\n // Extract domain\n result.domain = getDomain(result.publicSuffix, result.hostname, options);\n if (step === FLAG.DOMAIN || result.domain === null) {\n return result;\n }\n\n // Extract subdomain\n result.subdomain = getSubdomain(result.hostname, result.domain);\n if (step === FLAG.SUB_DOMAIN) {\n return result;\n }\n\n // Extract domain without suffix\n result.domainWithoutSuffix = getDomainWithoutSuffix(\n result.domain,\n result.publicSuffix,\n );\n\n return result;\n}\n","import { IPublicSuffix, ISuffixLookupOptions } from './interface';\n\nexport default function (\n hostname: string,\n options: ISuffixLookupOptions,\n out: IPublicSuffix,\n): boolean {\n // Fast path for very popular suffixes; this allows to by-pass lookup\n // completely as well as any extra allocation or string manipulation.\n if (!options.allowPrivateDomains && hostname.length > 3) {\n const last: number = hostname.length - 1;\n const c3: number = hostname.charCodeAt(last);\n const c2: number = hostname.charCodeAt(last - 1);\n const c1: number = hostname.charCodeAt(last - 2);\n const c0: number = hostname.charCodeAt(last - 3);\n\n if (\n c3 === 109 /* 'm' */ &&\n c2 === 111 /* 'o' */ &&\n c1 === 99 /* 'c' */ &&\n c0 === 46 /* '.' */\n ) {\n out.isIcann = true;\n out.isPrivate = false;\n out.publicSuffix = 'com';\n return true;\n } else if (\n c3 === 103 /* 'g' */ &&\n c2 === 114 /* 'r' */ &&\n c1 === 111 /* 'o' */ &&\n c0 === 46 /* '.' */\n ) {\n out.isIcann = true;\n out.isPrivate = false;\n out.publicSuffix = 'org';\n return true;\n } else if (\n c3 === 117 /* 'u' */ &&\n c2 === 100 /* 'd' */ &&\n c1 === 101 /* 'e' */ &&\n c0 === 46 /* '.' */\n ) {\n out.isIcann = true;\n out.isPrivate = false;\n out.publicSuffix = 'edu';\n return true;\n } else if (\n c3 === 118 /* 'v' */ &&\n c2 === 111 /* 'o' */ &&\n c1 === 103 /* 'g' */ &&\n c0 === 46 /* '.' */\n ) {\n out.isIcann = true;\n out.isPrivate = false;\n out.publicSuffix = 'gov';\n return true;\n } else if (\n c3 === 116 /* 't' */ &&\n c2 === 101 /* 'e' */ &&\n c1 === 110 /* 'n' */ &&\n c0 === 46 /* '.' */\n ) {\n out.isIcann = true;\n out.isPrivate = false;\n out.publicSuffix = 'net';\n return true;\n } else if (\n c3 === 101 /* 'e' */ &&\n c2 === 100 /* 'd' */ &&\n c1 === 46 /* '.' */\n ) {\n out.isIcann = true;\n out.isPrivate = false;\n out.publicSuffix = 'de';\n return true;\n }\n }\n\n return false;\n}\n","// Auto-generated flat public-suffix trie. Do not edit.\nexport const nodeFlags = /*#__PURE__*/ new Uint8Array([1,2,1,1,1,1,1,1,1,1,1,1,0,2,2,2,0,2,2,0,2,0,0,1,0,0,2,1,1,1,1,1,1,0,0,0,1,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,0,0,0,0,0,0,1,1,1,0,2,0,0,0,0,0,0,0,2,0,2,2,0,0,2,2,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,2,1,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,2,2,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0,2,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,2,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,0,1,0,2,2,0,0,0,2,0,1,1,0,2,0,2,2,0,1,1,1,1,1,1,1,1,0,1,1,1,0,1,1,1,1,0,0,0,0,1,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,2,2,0,2,2,0,0,0,0,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,2,2,0,2,2,2,2,0,0,0,0,2,0,0,0,0,0,0,0,2,2,0,0,0,2,2,1,1,1,1,1,2,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,2,2,0,0,2,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2,2,1,2,1,1,1,2,1,1,1,1,1,0,1,1,1,1,2,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,2,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,0,0,0,0,0]);\nexport const edgeStart = /*#__PURE__*/ new Uint16Array([0,0,0,10,11,18,106,111,117,124,130,136,145,146,147,148,149,150,151,153,154,155,157,159,226,239,241,242,243,258,265,266,269,270,271,274,276,295,296,298,307,312,329,330,333,335,336,338,372,373,375,378,379,383,385,389,392,424,427,440,441,449,450,452,462,476,477,478,487,488,525,530,546,566,572,614,615,642,669,670,818,824,827,828,829,834,839,848,870,871,872,873,874,875,876,894,896,897,900,902,903,905,907,922,937,942,943,945,946,947,948,949,951,954,959,960,961,963,964,967,970,971,972,985,987,999,1010,1018,1020,1061,1064,1068,1069,1071,1074,1085,1087,1097,1099,1105,1107,1108,1110,1113,1114,1115,1168,1170,1172,1192,1193,1194,1195,1197,1208,1239,1250,1262,1271,1278,1283,1296,1307,1320,1321,1332,1366,1367,1368,1383,1398,1470,1471,1473,1474,1508,1509,1510,1511,1514,1518,1521,1523,1552,1553,1561,1562,1563,1564,1566,1568,1569,1571,1572,1573,1584,1585,1586,1587,1588,1589,1590,1591,1592,1593,1594,1595,1596,1597,1599,1600,1601,2055,2058,2059,2061,2068,2075,2085,2089,2100,2101,2102,2114,2115,2117,2119,2120,2127,2128,2130,2131,2133,2134,2135,2136,2137,2211,2213,2234,2235,2236,2238,2264,2265,2316,2317,2319,2326,2332,2342,2352,2405,2406,2407,2417,2431,2432,2435,2442,2443,2451,2452,2453,2454,2455,2466,2467,2468,2470,2471,2472,2481,2493,2499,2531,2535,2537,2538,2540,2541,2552,2553,2555,2563,2570,2576,2581,2582,2588,2591,2597,2604,2605,2612,2620,2621,2622,2660,2666,2681,2682,2687,2705,2736,2754,2756,2759,2767,2769,2776,2828,2852,2853,2854,2855,2856,2857,2858,2865,2866,2867,2868,2869,2870,2872,2873,2877,2957,2970,2971,3408,3412,3426,3478,3506,3528,3586,3608,3623,3686,3737,3775,3811,3836,3978,4024,4075,4094,4128,4143,4163,4193,4224,4247,4278,4308,4340,4367,4442,4464,4502,4512,4546,4565,4591,4633,4683,4709,4778,4779,4781,4804,4827,4863,4894,4911,4968,4981,5005,5034,5036,5070,5086,5114,5419,5428,5437,5444,5461,5465,5471,5510,5512,5519,5526,5535,5542,5543,5544,5556,5559,5574,5575,5584,5585,5594,5603,5609,5611,5612,5613,5650,5651,5653,5661,5668,5681,5685,5687,5688,5694,5701,5715,5725,5730,5738,5746,5752,5753,5757,5759,5760,5772,5844,5845,5846,5847,5849,5850,5853,5855,5858,5862,5863,5864,5870,5871,5872,5874,5876,5878,5879,5880,5883,5885,5888,5889,5891,6089,6096,6097,6098,6108,6113,6130,6144,6153,6154,6155,6159,6160,6162,6164,6170,6171,6174,6175,6177,6178,6179,7079,7082,7086,7104,7113,7116,7123,7124,7126,7127,7128,7130,7182,7183,7186,7187,7304,7305,7316,7327,7334,7337,7346,7347,7348,7363,7418,7609,7611,7612,7614,7619,7632,7647,7654,7663,7666,7669,7676,7684,7688,7689,7690,7704,7708,7717,7718,7719,7723,7758,7759,7777,7784,7792,7793,7798,7806,7850,7851,7857,7860,7872,7877,7878,7881,7883,7918,7919,7925,7932,7933,7942,7951,7966,7970,7971,8023,8024,8029,8031,8034,8036,8037,8038,8047,8061,8069,8083,8095,8096,8098,8100,8122,8133,8139,8140,8152,8164,8251,8263,8271,8274,8280,8305,8308,8309,8310,8311,8313,8316,8319,8330,8332,8334,8362,8437,8444,8448,8449,8458,8480,8481,8486,8487,8566,8568,8570,8579,8583,8589,8595,8601,8611,8616,8617,8635,8646,8651,8656,8666,8672,8676,8682,8688,10297,10298,10299,10306,10308]);\nexport const edgeLength = /*#__PURE__*/ new Uint8Array([3,3,3,3,3,3,3,3,5,8,8,2,2,3,3,3,3,3,8,5,5,5,5,5,3,3,5,5,9,12,19,8,19,8,11,9,9,8,7,7,6,8,9,16,10,7,7,11,8,6,6,9,7,11,7,14,4,4,4,4,4,4,10,7,6,6,6,6,10,10,6,10,10,22,11,9,10,10,10,9,10,8,7,7,7,8,21,13,11,11,9,10,9,13,10,8,8,9,12,9,7,10,7,7,13,7,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,8,6,3,3,3,3,3,3,2,5,3,3,3,7,2,2,2,2,2,2,3,3,3,1,1,7,8,5,2,2,7,2,2,1,4,1,11,9,9,5,5,8,5,5,5,5,5,5,5,3,3,3,3,3,5,11,9,9,13,7,14,7,6,6,6,7,6,6,6,6,6,10,7,11,9,4,4,4,4,4,6,6,6,6,13,6,8,7,10,9,9,9,8,9,8,7,10,6,9,8,10,10,7,8,1,9,10,12,12,12,10,9,9,10,10,9,9,1,1,5,3,3,3,3,3,3,3,3,3,3,3,3,6,6,6,4,3,3,3,7,4,4,4,3,3,6,7,3,4,1,2,2,2,6,1,2,2,2,2,2,12,5,3,8,9,13,4,4,13,9,9,11,7,3,12,9,2,2,2,3,3,3,3,3,8,2,2,3,3,3,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,4,3,7,10,15,7,15,15,20,15,9,10,10,12,14,14,14,12,12,12,12,12,14,14,10,10,10,10,14,9,9,9,10,14,14,14,13,13,9,9,9,9,9,9,7,8,6,8,8,6,8,13,8,8,6,13,8,11,13,8,6,13,8,6,9,10,10,12,14,14,14,12,12,12,12,14,14,10,10,10,10,9,9,9,10,14,14,11,13,13,9,9,9,9,9,9,2,6,9,2,2,3,3,3,3,3,3,3,3,3,4,4,4,2,3,3,3,3,3,3,7,7,2,3,2,2,5,3,3,3,3,3,3,4,2,2,2,2,2,2,3,3,3,3,3,3,3,4,5,7,2,2,12,8,10,8,10,7,18,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,2,2,3,3,3,5,5,3,8,8,6,8,6,6,4,6,7,7,7,10,11,2,5,5,3,3,3,3,3,3,5,5,6,11,10,7,7,7,4,4,4,2,3,3,3,3,3,2,2,7,5,5,3,3,3,3,3,3,3,3,7,7,7,11,7,6,9,6,6,8,10,8,6,8,13,4,4,4,4,4,10,8,11,8,8,8,10,10,7,10,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,2,2,2,2,2,2,5,5,5,5,5,5,5,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,7,10,13,7,8,7,11,8,8,6,9,8,8,6,6,6,8,8,6,6,6,6,6,9,7,6,4,4,4,4,4,4,4,6,6,6,9,7,8,10,8,8,2,3,3,3,3,3,2,8,9,9,2,2,2,3,3,3,2,3,3,3,9,2,2,3,3,3,3,3,3,5,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,12,5,5,3,5,4,2,3,2,4,3,9,2,2,2,2,2,5,5,3,8,8,13,6,10,9,4,7,9,11,2,3,7,3,3,4,1,3,4,2,9,3,3,12,5,3,7,10,10,7,4,4,6,14,7,9,7,13,2,2,2,2,2,2,3,3,3,3,3,8,15,4,4,2,3,3,3,7,4,9,9,2,3,3,3,5,3,2,2,7,2,7,6,6,7,2,4,2,2,2,2,2,2,8,8,8,9,5,2,3,3,3,3,3,3,10,7,4,4,4,4,3,4,2,3,3,3,3,3,10,7,4,4,4,4,2,3,3,3,3,10,7,4,4,4,4,3,9,6,6,6,9,13,9,2,2,2,8,7,9,5,3,3,3,5,5,13,12,9,10,7,8,7,6,8,6,11,12,7,9,10,4,4,7,8,11,6,7,9,8,7,10,8,9,15,7,8,5,4,7,2,3,3,3,2,14,10,2,14,10,2,14,3,9,13,13,10,14,16,17,11,2,14,2,14,3,9,13,10,14,16,17,11,14,10,14,2,7,3,10,7,14,10,2,14,10,9,9,17,6,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,10,10,10,12,9,4,10,10,11,8,8,8,7,9,5,3,3,3,3,3,3,3,3,5,8,4,4,4,4,4,4,6,16,3,3,14,3,14,2,14,9,13,10,10,14,16,17,11,6,9,10,10,12,14,14,14,12,12,12,12,14,14,10,10,10,10,14,9,9,9,10,14,14,14,9,9,9,9,9,9,2,14,9,13,10,10,14,16,17,11,6,2,14,9,17,13,10,10,14,16,17,11,6,2,14,9,13,10,14,16,17,11,2,14,9,13,10,16,11,2,14,10,19,7,2,14,9,13,10,19,10,7,14,16,17,11,6,2,14,9,13,10,19,7,14,16,17,11,2,14,9,13,17,13,10,10,14,16,17,11,6,3,2,14,9,13,10,10,14,16,17,11,6,9,10,12,14,14,14,12,12,12,12,12,14,14,14,10,10,10,14,9,9,9,9,14,14,14,13,13,14,9,9,9,9,9,9,4,11,2,14,9,13,17,13,10,19,10,7,14,16,17,11,6,2,14,9,13,17,13,10,19,10,7,14,16,17,11,6,2,9,10,10,7,17,3,3,12,12,16,15,15,12,14,14,14,20,20,13,12,12,12,12,12,12,20,25,14,14,12,12,10,10,10,10,9,9,9,25,4,9,17,10,7,14,16,21,13,13,14,20,14,13,17,24,9,12,13,25,13,21,20,17,9,9,9,9,9,9,12,17,4,4,9,9,9,10,10,12,14,14,14,12,12,12,12,12,14,14,10,10,10,10,14,9,9,9,10,14,14,14,13,13,9,9,9,9,9,9,1,5,8,7,11,11,1,3,3,3,5,3,3,4,8,9,10,14,14,12,12,12,12,14,14,10,10,10,10,14,9,9,9,10,14,14,14,13,13,9,9,9,9,9,7,4,4,4,4,4,4,4,4,4,7,4,9,12,6,14,4,12,7,2,2,1,2,7,6,4,4,4,6,8,8,7,4,5,6,3,3,3,3,4,16,8,5,4,3,3,3,5,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11,12,7,7,13,9,10,17,12,8,9,7,8,5,12,10,13,14,5,5,5,13,5,5,5,3,3,3,5,16,5,5,5,5,7,12,14,8,12,8,10,12,9,11,7,9,7,10,7,13,9,7,12,8,17,7,7,16,10,13,13,8,10,10,14,17,7,16,16,15,8,10,10,12,17,17,7,17,14,7,10,17,8,7,7,7,8,15,15,7,14,10,10,10,11,11,7,7,13,8,10,7,16,7,8,7,14,17,12,10,11,21,8,9,7,13,9,8,13,6,12,7,6,13,10,10,10,8,18,9,17,13,10,12,6,13,6,11,8,13,10,13,18,13,11,13,8,16,7,10,8,16,12,10,8,8,14,11,8,15,8,8,7,7,12,7,8,9,14,15,8,9,10,9,15,7,8,8,12,13,9,10,15,13,7,10,10,20,7,6,9,6,6,14,11,14,11,12,9,10,16,16,12,7,11,28,8,11,10,7,21,8,7,9,4,4,4,17,7,8,6,9,6,6,13,6,6,6,6,18,20,14,8,11,12,9,10,13,15,15,19,8,9,12,7,10,16,12,9,9,9,14,12,11,9,12,11,18,9,9,9,10,7,7,16,8,9,7,13,12,10,14,18,7,8,11,7,7,8,8,13,7,7,7,11,15,13,11,7,8,15,11,7,8,18,14,13,18,15,10,12,12,9,7,11,11,8,7,10,8,14,12,10,18,7,10,9,7,8,13,10,14,10,8,8,23,7,7,11,12,12,17,7,7,11,11,17,16,16,7,8,11,14,14,8,10,7,7,16,16,13,9,11,9,15,15,11,11,7,7,14,7,9,7,7,16,10,13,10,11,14,7,11,10,11,7,11,10,11,15,11,15,10,12,10,14,13,11,11,12,13,10,7,13,10,16,12,21,9,10,10,7,11,14,17,7,7,8,11,12,8,15,14,14,8,17,12,10,10,7,9,11,7,10,7,11,18,7,11,7,12,11,8,8,14,12,7,8,15,3,7,7,5,2,9,2,2,2,2,2,2,2,3,3,3,3,3,3,3,2,5,3,3,3,3,3,3,4,4,3,3,3,3,3,3,5,11,6,4,7,10,7,7,11,1,10,2,2,3,3,3,3,3,3,3,3,5,7,3,5,6,3,3,5,2,2,5,3,4,13,11,3,3,6,3,5,14,2,2,3,8,2,2,12,5,18,5,3,3,3,16,5,5,5,10,7,13,12,13,9,12,14,19,9,9,21,9,9,10,6,9,6,15,10,6,12,8,6,10,15,4,4,6,6,9,9,12,16,14,23,7,7,7,14,9,7,7,11,14,10,7,10,10,10,12,6,11,10,13,11,15,11,7,12,10,3,7,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,4,3,7,2,5,5,3,3,5,5,5,5,7,6,6,6,4,4,4,4,4,4,6,6,6,6,6,7,10,2,2,2,5,5,5,5,3,3,3,3,3,5,5,10,9,11,8,7,12,8,9,7,6,13,11,6,13,7,9,9,4,4,4,4,4,6,10,7,8,13,8,8,9,14,7,8,10,7,7,7,9,6,9,7,2,12,5,3,3,13,4,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,4,5,5,5,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,8,4,4,4,4,4,4,4,4,4,4,4,4,9,3,3,3,3,3,3,3,3,3,3,4,2,2,2,5,3,3,3,3,3,3,3,3,4,4,1,7,6,4,12,3,3,3,3,3,8,7,3,3,3,3,3,3,4,4,11,14,2,8,3,5,5,8,10,8,6,4,7,17,7,4,5,2,6,3,2,2,12,5,5,3,15,13,8,11,2,2,3,3,3,3,3,3,3,3,4,4,5,3,3,3,3,4,18,2,12,5,3,3,3,3,3,5,16,8,8,9,6,6,4,4,4,4,31,6,6,10,11,21,10,9,7,10,7,7,2,4,4,4,4,6,5,3,3,4,3,3,3,3,3,3,3,3,3,6,6,6,2,2,2,5,3,3,3,7,7,4,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,8,2,3,3,3,3,3,5,9,11,3,3,3,3,4,4,3,3,3,3,3,5,10,9,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,11,10,10,10,10,10,11,10,11,10,11,10,9,9,11,3,3,3,3,3,3,5,3,7,8,8,7,6,6,11,4,4,4,7,8,9,9,2,3,7,4,4,2,5,5,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,2,2,5,5,5,5,5,3,3,5,5,5,7,7,6,6,6,4,4,4,4,4,4,4,4,4,4,6,6,8,8,1,2,2,2,2,2,2,3,3,3,3,3,3,3,4,4,6,9,12,3,7,10,7,2,2,3,3,3,3,3,4,3,3,2,2,2,2,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,5,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,5,5,8,8,6,6,8,6,7,4,4,4,4,4,4,6,7,5,5,20,19,8,10,9,7,10,6,8,11,6,6,6,6,13,12,8,6,7,14,11,9,2,5,3,6,2,3,2,2,2,2,2,2,2,5,4,3,7,6,4,7,4,3,6,4,7,2,7,7,7,5,5,5,5,3,3,3,3,3,3,3,3,3,5,9,10,10,11,7,8,20,7,8,9,8,12,6,6,6,8,9,8,12,6,6,8,13,10,12,6,6,7,7,9,6,4,4,4,4,4,4,10,6,6,6,7,14,11,10,7,8,10,8,11,14,11,11,9,7,9,8,11,9,17,10,9,2,2,2,9,3,3,3,3,15,14,9,5,5,2,8,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,15,12,22,19,17,18,18,19,21,7,16,16,5,5,5,5,5,5,5,5,5,5,5,7,5,5,5,5,5,5,5,5,5,5,5,9,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,5,7,16,11,11,7,7,7,7,17,7,8,12,15,9,19,7,19,8,21,11,12,19,14,22,7,7,7,7,7,7,7,7,7,7,7,16,16,19,24,12,7,14,7,12,7,8,10,10,13,7,12,12,7,7,10,18,15,12,16,7,14,12,17,10,16,17,12,17,25,7,7,7,13,6,9,6,9,18,6,6,11,20,10,6,6,6,6,6,6,17,6,6,6,15,6,6,6,6,6,8,14,11,12,11,15,13,19,17,21,7,18,8,13,13,8,12,8,6,6,13,6,15,15,16,6,6,16,6,6,6,14,6,18,6,6,6,17,18,9,13,15,8,19,8,15,15,18,14,16,4,4,4,4,4,4,4,4,4,4,4,4,6,11,10,11,6,21,23,12,17,12,11,14,13,22,15,15,11,12,14,12,7,12,8,12,14,12,18,10,8,16,19,17,12,14,15,8,19,17,12,13,13,15,18,13,23,24,23,21,17,24,8,21,8,14,14,16,20,14,8,8,15,20,8,19,21,9,8,13,12,13,15,11,8,11,9,9,8,11,8,21,14,21,15,15,13,7,19,7,7,7,7,7,7,16,12,17,18,7,7,11,11,7,9,9,2,2,3,3,2,2,2,3,3,3,3,3,3,3,3,3,3,4,5,5,5,5,5,5,5,5,3,3,10,10,7,9,7,7,7,6,8,6,6,6,6,6,6,6,7,6,8,6,6,9,7,7,7,4,4,4,4,4,4,4,4,8,9,8,7,8,7,8,10,7,5,5,5,5,5,5,3,9,7,7,8,6,6,6,6,6,6,6,6,9,6,6,9,11,13,7,8,9,9,5,5,5,7,8,6,6,6,6,6,6,6,7,8,9,7,10,9,10,7,8,5,5,5,5,5,5,7,7,9,8,7,7,6,6,6,6,6,6,10,6,6,6,6,6,6,6,6,6,6,6,9,10,4,4,4,4,8,7,7,10,10,9,8,8,15,9,8,8,8,8,8,9,10,9,10,7,8,13,5,5,5,5,5,3,3,7,7,8,6,6,6,4,4,11,9,7,8,9,10,7,5,5,5,5,5,3,3,7,6,6,13,7,9,8,7,5,5,5,5,5,5,5,5,3,3,3,3,7,8,7,8,13,6,6,6,6,6,6,6,6,6,6,6,6,6,6,8,8,6,6,6,6,7,6,7,6,6,9,7,4,4,4,4,4,4,4,7,8,7,8,9,8,8,8,7,10,7,8,5,5,5,5,5,5,5,5,3,7,7,7,7,9,7,10,9,6,6,6,6,6,8,8,6,6,6,7,6,6,6,9,9,4,4,13,7,10,9,9,12,7,8,8,10,8,8,8,8,8,8,5,5,5,5,3,7,7,11,7,9,8,8,6,6,10,6,8,8,8,6,7,6,6,12,4,4,4,4,4,4,4,4,4,9,8,8,16,8,9,8,7,5,5,5,5,5,3,3,7,7,7,10,15,8,9,8,9,9,6,6,6,6,6,6,7,4,8,7,8,8,7,8,11,8,5,5,5,5,5,3,7,7,6,11,16,7,6,4,4,4,4,9,9,8,8,8,13,12,8,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,11,7,8,8,9,13,7,7,7,9,8,8,9,12,7,12,7,12,8,7,10,12,9,9,6,6,8,8,6,6,6,6,6,6,6,9,8,9,11,8,6,6,6,6,6,12,7,6,6,6,9,7,7,6,6,6,6,6,11,9,6,6,6,6,6,7,9,4,4,4,4,4,4,4,4,9,9,9,9,7,7,7,7,7,11,7,7,8,8,8,8,8,8,9,8,9,9,7,7,11,11,7,12,8,8,8,8,8,7,8,8,8,8,8,13,12,8,8,8,8,7,7,7,9,5,5,5,5,5,5,5,3,3,7,7,11,7,8,8,8,6,6,6,6,6,6,6,6,6,6,6,10,11,6,7,9,4,4,4,4,4,4,9,9,8,9,8,8,8,7,7,5,5,5,5,5,5,5,5,5,5,3,3,11,7,7,7,9,6,6,11,8,10,6,6,6,12,8,8,7,6,6,8,7,4,4,4,4,4,4,4,4,9,10,9,9,8,10,9,11,8,5,5,5,7,6,6,8,7,4,4,4,4,8,7,7,8,7,8,8,5,5,5,5,7,7,8,8,8,6,6,6,6,6,10,8,9,13,6,7,6,6,8,7,8,4,4,4,4,11,8,8,8,10,5,5,8,7,8,13,8,7,6,8,6,9,7,8,7,5,5,5,5,5,5,3,3,7,8,9,6,4,8,10,10,8,12,9,13,2,7,5,5,5,5,5,7,7,10,6,6,6,6,6,6,6,8,4,4,9,8,8,8,14,8,8,8,9,8,5,5,5,5,5,3,3,9,6,6,6,6,10,12,6,6,6,6,6,6,6,4,4,4,4,11,8,7,8,8,8,5,5,3,3,3,3,7,7,6,8,6,8,11,7,6,6,6,7,4,8,11,9,10,5,5,5,3,3,3,7,7,8,9,8,15,9,6,6,6,6,6,6,11,11,4,4,4,4,4,7,9,9,10,8,7,5,5,5,5,5,5,3,3,8,6,6,6,6,6,6,6,6,6,9,7,4,4,4,4,4,9,9,8,8,10,13,5,5,5,3,17,7,7,7,7,7,8,6,8,13,6,6,6,6,6,6,6,6,4,4,4,9,10,8,8,8,5,5,5,5,3,7,7,7,8,8,6,6,6,8,8,8,9,10,8,4,8,10,9,8,8,8,9,13,10,5,5,5,5,5,5,5,5,5,5,3,3,7,8,9,9,7,7,7,10,9,9,8,9,8,8,8,6,6,6,6,6,6,6,6,6,6,6,6,6,8,12,6,6,6,6,6,6,6,6,6,12,4,4,4,4,4,4,4,4,4,4,4,11,8,8,9,9,10,8,9,7,7,5,5,5,5,5,5,3,7,8,7,6,6,8,6,6,10,4,7,8,9,12,8,7,7,5,5,5,5,5,5,3,3,7,14,7,9,8,8,6,6,8,12,12,6,6,7,7,10,4,4,4,4,4,9,9,14,9,13,8,7,5,5,5,6,6,6,7,4,8,7,5,5,5,5,5,5,5,5,3,3,7,7,7,8,6,6,6,6,6,6,12,6,6,6,6,4,4,9,9,8,8,11,7,7,7,5,5,5,3,9,8,6,6,7,4,4,4,4,4,4,8,8,11,5,5,5,7,7,7,9,6,6,6,6,6,6,9,8,4,4,4,4,7,12,9,8,8,8,7,10,10,5,5,5,5,5,5,5,3,11,14,8,7,8,8,6,6,6,6,6,8,7,6,6,6,7,6,8,9,4,4,4,7,8,9,7,9,7,7,9,8,5,5,5,5,5,5,5,5,5,11,3,9,7,7,12,14,8,6,6,12,11,8,6,6,6,6,6,6,6,6,6,15,7,4,4,4,16,9,9,9,8,9,9,9,9,9,8,8,8,13,11,8,5,5,5,5,3,7,6,6,8,8,8,6,6,7,10,7,4,4,4,4,9,7,8,7,7,7,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,3,7,7,7,9,6,6,6,6,6,8,8,7,7,9,6,6,6,7,6,6,6,6,6,15,4,4,4,4,4,8,8,7,8,12,9,8,8,8,8,8,9,8,8,10,8,8,8,8,16,9,10,2,5,5,5,5,5,5,5,9,7,6,8,9,4,4,4,4,4,7,8,8,8,9,8,11,10,5,5,5,5,3,7,8,6,6,6,6,6,8,6,6,6,6,4,12,10,12,7,7,7,7,7,7,7,5,5,5,5,3,3,7,7,10,8,9,7,6,10,7,6,6,4,4,8,9,7,9,9,9,9,8,8,8,8,10,5,5,5,5,5,5,8,7,6,6,6,10,6,7,10,7,4,4,4,4,4,4,4,12,9,10,7,7,10,8,10,5,12,9,6,6,6,6,6,7,6,4,4,4,10,9,9,8,7,7,5,5,5,5,5,5,3,3,13,7,7,9,7,7,7,8,9,9,7,8,6,6,6,6,6,6,6,6,6,6,6,6,6,7,13,9,15,15,4,4,4,4,4,10,10,9,8,9,8,8,9,7,8,7,8,5,5,7,6,6,6,4,4,4,7,8,11,8,5,5,5,5,5,5,5,7,6,6,6,6,6,6,9,11,10,7,4,4,4,9,8,8,5,5,5,5,5,9,9,6,6,6,6,6,6,6,9,9,4,4,4,4,8,8,8,9,9,8,8,8,13,2,4,2,7,5,5,5,5,5,5,9,9,6,6,6,6,10,8,8,8,6,6,6,4,4,9,8,10,8,9,8,8,8,9,8,8,5,3,3,3,11,6,6,6,7,6,6,6,4,4,9,8,5,5,5,5,5,3,11,8,6,6,6,6,6,9,7,4,4,14,10,9,8,12,8,8,8,11,15,8,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,10,10,7,7,3,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,5,5,5,5,5,5,5,5,5,5,3,3,3,7,11,7,7,11,11,7,8,9,10,7,7,9,9,9,9,7,7,10,8,13,8,8,8,8,11,10,6,6,8,10,11,14,14,6,6,6,6,6,6,9,11,7,7,6,8,12,11,11,6,6,10,6,6,6,6,6,10,7,7,6,6,11,6,6,6,11,8,9,7,6,10,11,9,10,11,7,11,8,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,8,6,6,8,9,10,9,6,6,6,10,6,6,6,6,11,10,11,10,9,8,7,7,7,7,11,14,8,10,9,9,8,8,7,11,8,8,8,11,11,10,10,9,10,8,11,10,8,11,9,12,8,10,8,11,8,9,9,11,11,10,11,13,8,7,8,8,9,7,8,8,8,8,7,8,2,2,2,2,2,2,2,4,4,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,4,2,3,3,3,3,3,3,3,3,8,6,4,4,4,11,7,11,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,5,5,5,5,3,3,3,3,8,7,7,8,8,4,8,7,7,7,9,7,8,9,8,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,6,3,3,3,3,3,3,3,3,4,2,2,3,3,3,3,3,3,4,5,5,3,3,8,8,6,9,4,4,10,7,3,3,3,2,5,3,3,3,3,3,3,3,3,3,3,3,3,4,3,2,2,2,3,3,3,3,3,4,10,2,3,3,3,3,3,3,3,4,2,3,3,3,3,3,3,3,3,2,2,3,3,3,5,2,4,2,6,2,2,9,5,5,3,3,3,3,3,3,3,5,5,5,9,8,7,9,6,6,11,4,4,4,4,4,4,4,4,6,6,7,7,11,8,8,6,5,11,2,3,3,3,3,3,3,3,3,3,3,3,3,3,4,2,2,3,3,3,3,3,3,6,4,4,4,4,3,3,3,3,5,7,2,3,3,3,3,3,8,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,6,4,4,4,4,2,2,3,3,3,3,3,3,3,4,3,3,3,3,3,3,3,3,3,3,3,3,4,2,2,3,3,3,3,3,3,2,3,3,3,3,3,6,3,3,8,10,3,4,4,1,1,1,1,1,1,1,8,9,10,7,7,1,14,18,13,18,13,10,10,16,13,18,16,13,16,18,13,22,16,16,16,14,21,16,9,14,16,9,9,14,10,10,14,12,14,19,12,11,18,13,17,15,15,15,15,16,14,13,19,18,15,19,18,12,18,12,11,20,14,15,10,17,17,16,19,20,21,15,13,16,15,15,15,1,1,3,8,7,7,8,8,8,1,6,1,1,6,3,3,4,7,3,3,5,5,4,4,4,4,4,2,7,7,8,12,3,4,5,1,3,4,4,10,4,3,3,3,8,7,7,2,2,2,2,2,2,2,2,2,12,9,20,7,5,5,5,9,13,5,5,5,5,5,3,3,3,16,5,5,5,13,7,8,8,11,8,7,9,7,11,12,9,9,8,8,11,10,14,7,12,10,11,13,7,9,11,17,17,14,13,7,8,7,10,10,7,16,13,7,8,17,12,9,8,6,7,10,6,6,12,6,8,10,8,8,8,6,8,6,14,6,6,6,13,6,10,6,6,7,14,8,6,6,10,11,10,9,9,7,7,6,6,6,9,9,7,9,10,9,13,12,4,4,4,4,4,4,4,4,4,4,6,6,6,8,8,6,8,9,10,9,7,10,10,8,7,8,7,10,12,9,8,15,8,7,8,8,7,7,15,13,7,10,9,14,18,16,7,24,7,8,10,11,16,8,14,7,9,9,9,13,19,14,15,14,11,7,13,9,10,7,13,9,10,11,12,8,9,2,3,5,8,7,4,4,15,10,5,3,3,3,3,3,5,4,4,4,2,2,2,2,2,1,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,2,2,2,3,3,3,3,3,3,3,3,3,3,4,2,12,5,3,8,10,15,6,7,2,3,2,5,5,12,2,5,5,5,5,2,2,5,5,12,9,5,2,2,9,5,5,12,12,5,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,9,12,5,8,8,9,5,5,5,8,19,7,16,15,14,9,9,9,9,7,11,11,11,7,14,10,10,5,5,5,5,5,5,5,5,5,15,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,9,9,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,14,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,15,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,5,5,5,5,5,5,5,12,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,9,9,12,9,9,12,12,12,15,7,11,7,14,11,18,13,8,18,15,18,12,14,12,8,8,8,8,9,9,9,12,7,10,10,8,8,12,12,12,7,12,12,9,7,7,7,7,7,8,15,12,9,10,10,7,10,10,13,11,10,9,22,11,9,8,8,8,8,8,13,18,13,9,15,19,9,7,7,10,7,7,7,11,8,13,17,7,7,10,10,10,7,20,16,7,7,7,7,7,7,11,21,12,12,13,11,14,16,8,8,13,11,7,7,13,7,7,14,15,15,6,6,6,6,6,6,6,6,6,6,13,10,18,6,6,6,6,6,6,6,6,6,11,8,8,12,12,11,11,8,12,9,9,9,13,13,9,9,9,9,9,9,6,10,12,6,6,6,6,17,11,7,7,7,7,14,14,12,6,7,7,6,6,15,10,13,10,6,8,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,13,9,9,15,13,6,12,12,6,19,11,10,7,7,16,8,19,17,9,9,9,9,9,6,6,6,10,8,16,8,6,6,9,6,6,6,6,6,6,6,6,8,8,8,6,7,6,6,6,6,6,6,6,6,6,6,6,14,6,6,6,6,20,6,9,6,14,9,9,9,6,9,8,8,12,9,8,8,8,8,7,8,12,7,8,8,8,6,8,6,6,6,6,6,6,6,9,8,8,6,6,13,9,12,13,12,14,13,12,11,11,6,8,8,8,6,13,12,11,11,12,6,11,12,11,13,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,15,6,6,6,6,6,6,6,13,6,6,6,6,6,6,6,6,6,6,6,6,6,8,8,8,8,6,18,6,12,13,13,13,9,10,15,9,12,6,6,6,6,6,6,6,6,9,15,10,9,10,13,9,19,8,18,17,10,10,8,8,6,6,6,6,6,6,10,14,8,16,16,9,8,15,8,8,10,12,14,7,7,8,8,7,7,7,7,8,13,13,11,9,9,9,12,10,17,8,11,9,7,7,14,8,14,14,7,7,7,7,7,7,14,7,7,7,7,7,10,10,8,14,7,7,7,7,8,8,8,8,8,17,9,7,15,7,8,12,7,9,14,7,7,7,9,13,8,14,7,16,18,13,15,14,12,13,10,15,9,7,7,7,10,13,15,15,9,9,9,9,19,11,7,11,11,13,8,8,8,8,7,12,19,17,9,9,13,7,7,7,9,7,7,7,12,13,15,10,8,8,14,15,12,13,13,8,12,14,7,11,7,14,15,13,12,8,8,8,8,11,13,15,15,8,13,12,8,8,8,13,10,16,14,11,8,8,12,12,9,15,15,12,12,13,8,8,9,12,13,9,8,8,8,8,8,8,8,8,8,8,8,11,12,11,7,14,7,13,13,13,12,18,16,7,12,11,10,10,15,9,9,9,21,7,7,7,11,16,8,8,11,11,7,7,7,7,7,19,7,7,7,7,7,7,7,7,7,12,8,9,12,14,11,9,9,9,22,12,3,3,4,8,8,15,4,2,2,5,5,3,3,3,3,3,3,6,6,4,4,4,12,7,10,2,3,3,3,3,3,3,3,6,7,3,7,5,14,4,4,7,8,10,4,1,3,3,6,2,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,4,2,2,5,3,4,2,2,2,2,2,2,11,5,5,5,11,5,5,3,5,5,5,5,11,14,13,9,11,9,12,8,11,11,8,11,16,9,9,7,10,9,12,8,15,6,7,6,6,13,10,8,11,8,6,6,6,12,16,6,11,7,8,9,18,6,6,9,4,4,6,13,6,6,6,6,8,8,9,16,7,7,14,7,8,8,8,7,7,7,7,7,7,15,13,7,10,7,7,10,12,16,15,7,9,9,14,11,11,10,9,10,8,12,7,8,7,7,10,12,7,12,8,7,2,3,3,3,3,3,3,3,3,3,3,5,3,3,5,5,5,10,4,8,7,10,3,3,3,3,3,3,3,3,3,3,1,3,3,3,3,3,3,3,7,4,5,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,5,5,5,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,5,6,6,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,9,8,2,2,2,8,12,7,7,5,5,5,5,5,5,5,5,5,5,5,5,8,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,5,5,5,7,11,9,8,8,8,7,8,9,7,7,9,7,7,7,10,7,7,10,9,10,6,6,6,6,6,6,15,7,8,9,9,8,6,6,10,9,6,8,13,9,7,6,6,6,6,6,6,12,6,6,7,6,7,6,6,6,10,10,7,6,6,6,4,4,4,4,4,4,4,4,4,4,4,4,4,4,6,14,6,6,7,7,9,6,6,6,6,9,9,8,9,10,9,8,9,12,7,7,7,8,7,10,12,11,9,10,7,7,7,9,10,10,8,12,9,7,7,9,8,8,8,10,7,7,8,9,9,7,7,7,8,2,4,6,3,4,2,3,3,3,3,2,3,3,3,3,3,3,3,3,4,4,4,4,5,5,3,3,3,3,3,3,3,3,5,8,6,4,7,3,3,3,3,3,3,3,12,3,3,3,3,3,3,4,4,2,3,5,3,4,7,3,3,3,3,3,3,4,3,3,3,3,3,3,3,4,3,3,6,4,3,4,2,2,2,5,3,3,3,3,3,5,4,4,4,4,7,6,8,9,2,2,2,2,3,3,3,5,7,2,3,3,8,7,7,2,2,8,5,3,3,3,3,3,3,3,3,3,3,3,3,3,5,5,8,8,7,7,6,10,6,9,7,11,4,6,8,8,7,8,4,5,5,5,5,3,3,11,8,9,6,6,8,7,4,4,7,8,7,2,2,3,3,3,3,4,3,3,3,3,3,3,3,3,7,2,2,5,3,3,2,3,3,3,3,3,3,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,12,5,5,3,3,3,5,10,12,6,15,4,6,6,7,14,9,3,3,3,3,3,8,2,2,3,5,5,3,3,3,3,3,3,8,8,8,7,5,8,4,6,11,2,2,6,7,3,3,2,9,8,5,5,3,3,3,5,5,7,7,6,6,10,6,8,6,8,9,7,4,4,4,4,7,6,6,7,7,10,9,8,11,8,3,3,3,3,3,4,4,2,3,3,3,3,3,7,6,2,5,6,7,6,4,8,9,11,2,2,3,3,3,3,3,3,3,2,2,5,3,3,3,3,3,9,9,6,4,8,7,7,5,9,8,6,2,8,7,8,5,5,5,5,5,3,3,3,16,8,7,7,7,8,7,7,7,7,9,6,9,6,10,7,7,7,6,10,8,9,11,11,8,4,4,10,8,8,6,9,6,11,8,8,8,15,7,8,9,5,3,3,3,3,3,5,11,2,2,3,8,9,10,3,2,2,2,2,2,2,3,6,4,2,2,3,3,3,3,3,3,3,3,3,3,4,4,2,3,3,3,3,3,3,3,11,5,3,3,3,3,3,3,3,3,6,7,4,4,2,3,3,3,3,3,3,3,3,12,7,4,12,4,6,5,4,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,2,3,3,3,3,3,3,3,3,4,4,11,10,6,4,6,10,8,3,3,3,3,3,3,3,3,5,4,4,4,2,2,2,2,2,2,2,2,5,3,4,4,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,10,5,5,5,5,5,5,3,3,3,3,3,3,3,3,7,8,8,7,13,12,10,10,8,8,7,7,9,12,11,6,6,8,8,9,7,7,7,10,15,10,4,4,4,4,4,11,8,8,9,7,9,14,14,12,2,2,2,2,2,2,2,3,3,3,3,3,12,5,5,5,11,10,7,9,3,8,7,3,15,13,11,4,4,2,2,2,19,7,5,5,3,3,3,3,3,3,3,5,22,18,6,14,17,4,4,19,16,18,2,3,3,7,2,3,2,3,3,6,4,2,3,3,2,5,3,3,3,3,3,3,3,9,9,2,3,2,2,2,3,3,3,5,7,14,7,7,12,9,13,6,11,6,10,9,7,7,8,12,12,8,8,8,10,7,7,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,5,8,10,7,8,11,8,12,9,4,14,7,7,9,13,2,3,3,3,3,3,3,2,3,3,3,1,2,2,3,3,3,3,3,3,5,2,2,5,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,8,4,4,4,3,2,3,3,3,3,5,2,2,2,2,5,5,5,5,3,3,3,3,3,3,3,3,3,7,7,7,7,7,8,8,8,8,8,12,9,8,8,9,8,6,17,6,6,6,8,8,6,6,6,6,6,6,6,6,6,6,6,7,4,4,8,8,9,9,9,7,7,7,7,7,7,7,9,9,9,7,8,8,8,10,7,13,10,8,9,3,3,5,13,3,3,3,3,3,7,7,6,6,10,13,11,11,8,8,9,8,9,9,10,10,10,11,10,10,13,13,16,15,11,12,9,9,10,9,11,10,9,9,14,7,8,3,10,7,7,3,2,2,2,5,3,3,3,3,3,3,3,3,3,3,3,3,6,7,2,2,3,3,3,3,3,3,3,3,4,11,6,7,4,6,2,2,3,3,3,1,3,3,3,3,3,3,6,4,4,2,2,2,3,3,3,3,4,4,6,6,6,6,5,4,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,9,11,6,10,9,12,7,7,11,14,9,7,12,3,3,7,12,11,12,7,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,9,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,3,3,3,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,11,5,5,5,5,5,5,5,5,11,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,5,5,5,5,5,5,5,3,3,3,5,5,5,5,5,5,5,5,5,5,5,3,3,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,5,5,5,5,5,5,5,5,5,5,5,5,5,3,10,3,3,3,11,3,5,9,11,8,12,14,9,7,8,7,7,11,11,7,7,10,9,8,10,9,7,7,7,7,7,7,8,8,7,11,8,8,8,7,7,10,8,7,13,12,7,17,10,8,8,11,7,11,11,14,7,11,7,8,6,9,20,8,7,9,16,7,10,6,11,10,8,9,7,16,11,11,9,8,9,8,8,8,11,8,15,8,8,9,7,8,8,11,10,7,5,7,10,10,15,7,7,7,8,7,8,8,10,11,10,10,10,11,11,7,8,6,8,8,8,10,6,8,6,6,7,8,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,16,6,15,6,7,11,11,7,9,10,11,13,10,6,16,8,10,12,11,6,6,6,6,6,6,6,10,6,10,7,7,7,7,11,7,11,6,6,6,6,6,6,17,7,7,6,6,12,22,6,6,6,6,6,8,6,6,6,6,7,6,6,5,6,6,8,11,6,9,14,11,9,11,7,7,8,6,6,6,8,10,9,6,6,6,6,9,7,6,6,6,6,6,15,6,4,4,4,6,4,17,8,11,6,6,9,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,6,6,6,6,10,6,10,6,6,6,6,12,8,6,6,6,6,6,6,6,6,6,9,6,6,6,6,18,6,6,6,8,9,10,7,8,9,10,11,7,13,6,8,8,6,6,14,7,7,7,7,10,7,14,9,6,6,9,15,9,7,14,6,11,14,13,7,12,8,7,7,7,7,7,12,7,10,9,16,6,8,6,5,17,6,8,10,4,6,4,10,15,17,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,8,4,4,11,7,4,4,7,7,7,6,6,6,6,6,6,6,6,6,6,6,6,19,17,6,10,11,6,6,6,6,18,6,6,11,4,4,4,5,6,6,6,9,5,6,4,6,6,4,6,6,6,6,10,6,6,4,6,6,10,6,10,6,6,6,6,11,6,6,10,6,6,8,6,6,6,8,6,11,4,11,9,10,9,11,4,8,4,11,12,7,9,8,6,7,7,8,12,12,11,13,10,11,7,7,7,9,7,11,10,7,7,7,16,11,10,11,17,9,9,8,8,7,7,7,9,7,7,7,14,7,13,9,11,10,14,10,10,12,11,10,7,10,5,14,8,8,8,9,7,8,7,7,9,8,7,8,7,7,7,7,7,7,7,11,8,10,8,7,8,14,11,8,9,9,9,8,24,10,10,12,7,7,15,11,8,8,12,11,8,9,9,7,8,9,10,11,10,11,7,12,7,7,11,9,8,14,13,12,8,11,10,8,8,7,7,14,9,10,8,9,11,7,14,8,8,13,8,8,12,7,10,14,14,11,9,10,9,9,7,7,11,11,13,9,13,5,5,5,7,9,5,11,12,14,8,7,7,11,10,9,7,8,8,7,10,11,11,5,5,7,5,5,5,7,7,15,7,7,8,7,15,12,12,10,7,8,7,11,7,7,7,23,11,8,8,11,10,7,8,11,7,19,7,7,6,9,9,9,11,3,4,7,8,6,6,4,10,8,2,2]);\nexport const edgeChild = /*#__PURE__*/ new Uint16Array([0,0,0,1,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,12,1,1,1,1,1,17,1,1,1,12,1,12,1,12,13,1,1,1,1,12,1,12,1,1,1,1,1,14,21,1,1,1,1,1,1,1,19,12,1,1,1,1,1,1,1,20,1,1,1,16,18,1,1,15,1,1,1,1,12,1,1,1,1,1,1,1,22,1,1,1,1,12,1,1,1,1,1,1,1,1,12,12,12,12,12,12,12,12,12,12,12,12,1,24,25,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,1,1,12,12,12,12,1,32,0,0,0,1,1,1,1,35,34,1,1,1,1,1,33,1,1,1,1,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,38,0,0,0,0,39,40,0,0,0,0,12,1,1,12,1,1,1,1,43,44,44,44,43,44,43,43,45,44,43,44,43,43,43,43,43,43,45,43,43,43,43,43,43,44,46,46,44,43,43,43,43,43,12,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,49,51,49,49,49,51,49,50,49,52,49,50,50,49,49,49,50,52,50,52,49,50,50,12,54,54,53,55,50,52,49,49,47,48,56,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,59,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,66,1,12,1,1,65,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,77,0,0,0,0,0,0,0,0,0,0,0,0,0,75,78,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,76,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,12,1,1,1,1,88,1,90,1,1,1,1,1,1,1,1,93,1,1,1,1,1,1,1,1,1,1,1,1,0,1,96,96,1,1,12,1,99,1,1,1,1,1,1,1,97,1,98,1,100,1,1,1,1,1,101,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,109,110,1,1,1,1,1,1,112,112,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,120,121,1,1,1,1,1,1,1,1,1,1,1,1,1,121,1,1,1,1,1,1,1,1,1,1,121,1,1,1,1,1,1,1,1,1,125,122,124,119,1,123,1,1,113,1,1,1,1,116,1,126,1,1,1,1,1,1,118,1,107,1,108,1,12,127,105,1,111,1,1,1,1,1,106,114,1,12,12,12,117,115,1,1,1,1,1,1,0,0,0,0,1,12,12,1,1,1,1,1,12,133,1,1,1,1,1,1,1,1,1,1,1,12,135,1,1,1,1,1,1,1,1,136,137,12,12,134,132,44,44,139,49,49,138,141,140,1,1,0,0,0,0,0,0,0,0,0,0,0,0,144,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,142,0,0,0,0,1,0,143,131,1,0,1,1,12,12,1,1,1,1,1,0,0,0,0,0,0,0,1,147,146,20,1,1,12,12,1,20,12,12,1,1,1,1,1,133,1,1,151,1,1,1,1,152,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,1,1,135,1,1,151,1,1,1,1,152,1,1,133,1,1,1,151,1,1,1,1,152,1,1,133,1,1,1,1,1,1,1,1,133,1,1,1,1,1,1,1,1,1,1,1,159,1,1,1,151,1,1,1,1,1,152,1,1,159,1,1,1,1,1,1,1,1,1,1,133,1,1,1,1,151,1,1,1,1,152,1,1,1,133,1,1,151,1,1,1,1,163,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,1,166,1,1,159,1,1,1,1,1,151,1,1,1,1,1,152,1,1,159,1,1,1,1,1,151,1,1,1,1,1,152,1,153,157,157,12,1,12,165,1,1,1,1,1,157,157,157,153,1,1,1,156,157,160,164,1,1,1,1,156,156,1,1,155,153,153,156,169,155,169,1,1,167,1,155,154,156,1,1,1,1,156,1,158,1,1,1,12,1,161,1,161,1,1,1,161,160,162,168,155,153,1,1,1,1,1,1,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,172,171,172,171,171,171,171,173,173,171,172,171,172,171,171,12,1,12,12,12,12,1,12,12,12,12,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,12,1,1,1,1,1,1,12,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,195,1,1,1,1,12,201,202,203,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,12,1,1,1,1,1,1,1,1,150,1,1,1,1,1,1,1,1,1,1,1,198,1,1,1,185,1,1,1,1,209,1,1,206,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,12,1,1,1,1,1,12,1,1,1,1,1,1,1,1,176,192,1,1,1,188,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,183,1,1,1,1,1,1,1,193,1,1,1,1,197,1,1,1,1,170,1,1,191,1,1,1,194,1,1,1,12,1,1,1,1,1,1,1,1,1,1,1,1,181,1,12,1,1,12,1,1,1,1,184,1,1,1,190,1,12,1,1,1,1,1,1,1,1,1,1,1,1,1,1,12,1,1,210,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,196,1,1,1,1,1,12,1,1,1,1,1,1,1,1,175,12,1,1,1,178,12,1,1,1,1,1,1,1,200,1,1,1,1,1,1,1,1,1,1,177,1,1,1,1,1,1,1,205,1,1,1,182,1,1,1,189,1,12,1,186,12,1,1,1,1,1,1,1,1,1,1,193,1,1,1,1,180,1,1,1,1,1,1,1,1,1,1,1,1,1,1,174,1,1,1,1,1,1,1,1,1,1,187,1,1,1,1,1,1,1,1,1,1,1,207,1,1,1,1,1,1,1,1,1,1,12,1,208,1,1,12,1,1,1,1,179,1,1,1,187,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,12,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,12,1,1,1,199,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,12,12,1,1,1,1,1,1,1,1,1,204,1,1,12,1,1,1,12,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,1,0,1,1,1,1,1,1,1,1,1,1,220,0,0,0,0,0,221,0,0,0,0,0,0,1,12,1,1,1,225,1,1,1,0,226,223,224,1,1,1,1,1,1,231,1,233,1,1,1,1,1,1,1,1,1,1,1,229,1,1,1,1,1,235,1,1,12,1,12,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,234,1,1,1,12,1,1,1,1,230,1,1,1,228,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,232,1,1,1,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,1,12,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,241,13,1,1,1,12,12,238,239,1,1,1,1,240,1,1,12,1,1,1,1,1,1,1,242,1,1,12,16,1,1,1,1,1,1,243,1,1,1,12,12,1,1,1,1,1,1,243,12,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,252,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,256,256,1,0,0,0,0,0,1,12,0,0,0,0,0,0,0,0,171,261,262,1,12,1,1,1,1,12,264,1,1,263,1,1,266,1,1,1,1,1,1,0,1,1,1,270,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,12,1,0,1,0,0,0,0,1,0,1,0,1,1,1,1,1,0,1,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,1,12,0,281,0,0,282,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,12,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,59,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,1,1,0,306,0,0,0,0,0,0,0,0,0,308,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,12,1,1,1,1,1,1,1,1,1,12,1,1,1,1,1,324,324,325,324,0,187,1,1,13,320,1,318,0,0,0,0,0,0,0,321,1,1,326,1,206,1,1,1,1,319,1,316,1,322,1,314,1,323,1,315,1,1,1,1,1,1,1,12,1,1,1,1,12,317,317,1,1,1,185,1,1,12,1,1,1,1,1,1,1,1,1,1,12,1,1,1,1,12,1,1,1,1,313,1,0,0,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,329,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,266,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,369,369,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,361,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,1,0,1,337,348,1,1,336,371,1,342,1,1,334,366,1,1,352,333,338,1,1,1,345,376,354,1,1,1,1,1,1,355,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,0,364,368,0,0,78,1,1,0,362,339,375,340,343,350,1,365,0,1,0,78,359,357,1,0,0,1,1,1,0,0,0,0,378,1,1,349,1,78,1,0,1,1,1,381,1,0,0,78,356,0,1,335,1,1,1,0,1,1,358,1,0,1,1,1,0,1,383,346,1,1,0,1,0,0,374,0,1,1,1,78,367,1,1,363,360,1,1,1,1,1,1,1,1,1,1,1,341,1,1,1,1,1,1,1,1,1,1,1,373,0,78,1,1,1,1,0,1,1,1,1,1,1,0,0,1,1,377,1,1,1,0,0,380,0,0,0,1,353,1,0,78,379,1,0,0,0,0,382,1,1,0,0,1,0,1,0,351,0,347,0,1,1,1,0,1,1,0,370,344,372,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,12,1,1,1,12,398,398,1,1,12,12,1,398,1,1,12,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,1,1,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,410,1,1,0,1,1,1,1,206,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,428,428,1,1,0,0,314,1,1,1,1,1,1,1,1,1,1,1,1,12,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,441,1,440,1,1,1,1,1,1,1,1,1,445,1,12,12,1,1,1,1,1,12,1,1,1,1,453,1,1,1,455,1,1,1,1,1,1,1,1,1,1,452,1,447,1,1,1,1,434,1,1,1,1,1,1,1,1,448,12,1,1,1,1,454,1,1,1,449,443,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,314,1,431,1,1,12,451,1,1,314,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,436,1,1,1,1,1,1,1,1,1,1,1,454,1,1,1,1,314,1,450,1,1,1,444,438,1,1,1,1,1,439,1,456,442,1,1,1,1,1,437,1,1,1,1,1,1,1,1,1,432,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,446,1,1,1,1,1,1,1,1,1,1,1,1,435,1,1,1,1,1,433,1,220,457,1,1,1,1,1,12,1,1,1,1,12,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,1,0,0,1,0,1,0,1,1,0,0,0,463,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,12,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,467,0,467,467,467,467,467,467,467,0,467,467,467,467,467,1,467,467,467,0,467,467,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,472,471,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,476,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,469,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,470,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,478,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,467,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,475,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,468,0,0,479,474,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,473,0,0,0,0,0,0,0,0,0,0,0,0,0,467,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,468,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,467,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,477,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,12,1,1,1,1,1,1,1,1,1,1,1,1,489,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,200,200,1,493,1,1,1,492,1,1,1,1,488,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,490,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,494,1,1,491,1,1,1,1,1,1,1,1,369,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,495,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,1,0,0,0,506,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,1,0,0,0,1,0,0,0,0,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,1,0,1,0,0,12,1,508,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,12,12,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,1,0,0,0,0,0,0,0,1,0,0,1,0,1,1,1,1,0,0,0,1,0,0,0,1,59,1,1,12,12,12,12,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,527,1,1,1,1,1,1,1,528,1,1,1,1,1,1,1,526,1,1,12,1,1,530,239,1,1,12,12,1,1,12,1,12,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,534,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,1,1,1,540,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,131,1,12,545,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,106,1,1,12,1,1,1,12,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,550,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,1,1,0,0,0,1,1,1,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,143,1,1,1,228,1,1,12,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,1,575,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,220,1,325,1,1,1,1,1,1,1,1,1,0,0,580,1,1,1,1,0,582,0,78,0,581,0,1,1,1,0,1,1,1,1,1,1,12,0,0,0,1,0,1,0,0,0,0,0,0,589,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,584,584,0,588,586,584,584,584,584,584,590,584,584,594,584,584,584,584,584,584,584,584,584,584,591,588,584,584,588,584,584,584,584,584,584,584,584,584,584,584,584,584,586,584,584,584,584,584,592,584,584,584,584,584,584,0,0,0,1,593,1,1,1,1,587,1,1,1,1,1,585,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,12,598,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,1,12,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,12,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,12,1,1,12,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,95,64,278,304,409,536,0,4,67,236,254,280,305,331,385,411,0,500,520,537,600,9,0,60,87,395,407,427,578,0,498,519,533,615,0,30,6,0,462,501,605,563,69,0,7,283,255,386,464,414,539,78,601,0,579,307,416,466,9,104,286,507,6,30,0,309,78,388,78,484,10,6,130,248,273,0,616,510,0,566,0,63,6,6,251,94,2,430,396,408,599,0,6,0,6,284,102,6,564,502,541,0,465,387,271,285,8,70,103,602,544,389,310,298,417,145,73,288,548,511,604,567,332,327,480,6,74,148,11,0,249,523,549,568,515,553,573,614,36,6,260,293,330,302,218,30,529,556,218,41,216,265,294,303,404,421,482,272,0,72,565,0,401,415,297,78,247,78,0,583,547,505,290,419,78,390,384,0,0,0,9,558,574,217,0,422,405,532,517,576,618,84,218,42,295,393,423,572,0,512,291,274,78,215,79,28,387,30,6,391,328,301,607,595,525,552,514,0,258,80,30,403,420,0,30,424,0,219,596,518,9,406,425,218,248,85,222,597,577,560,483,426,394,250,227,86,58,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,623,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,412,0,0,0,0,0,0,0,0,81,0,128,0,0,83,551,0,0,0,0,0,0,0,27,0,554,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,412,0,0,0,0,504,0,257,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,292,0,0,0,0,0,0,0,620,0,0,0,0,0,619,0,0,0,0,0,0,0,0,0,0,0,0,0,0,392,0,0,0,485,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,68,0,0,0,0,0,0,496,0,0,0,0,0,0,402,0,0,0,0,0,0,0,0,0,0,0,0,0,211,0,0,0,0,0,0,0,0,0,0,0,516,0,0,0,0,0,0,0,0,0,0,0,0,497,0,0,0,0,0,0,0,0,0,0,0,0,0,0,269,279,0,0,0,0,0,531,275,0,0,0,0,0,0,0,0,0,0,0,0,0,513,0,0,0,0,0,0,0,0,0,0,0,458,0,0,0,312,0,0,0,0,0,0,253,0,0,0,0,0,0,23,0,0,0,0,571,0,0,0,0,603,522,0,0,0,0,244,0,0,0,0,0,0,460,0,0,481,0,0,0,0,0,61,0,0,0,267,57,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,0,0,0,0,0,277,613,0,71,0,0,0,0,0,0,0,0,0,622,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,149,0,276,0,0,0,0,0,0,570,0,0,0,0,0,0,524,0,0,0,0,0,0,0,0,0,569,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,62,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,83,0,503,0,0,0,0,0,557,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,83,82,0,0,0,0,0,0,0,0,0,0,0,0,487,0,486,0,0,0,0,0,0,0,0,0,0,259,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,459,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,287,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,538,0,0,0,0,0,0,0,0,296,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,68,237,0,0,0,0,0,0,0,0,0,0,83,0,609,0,0,555,0,0,0,0,0,0,0,0,0,245,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,612,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,521,0,0,0,83,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,499,0,617,0,0,429,0,0,0,0,0,0,0,0,0,0,0,0,400,0,0,0,546,0,92,0,0,0,0,0,0,0,0,0,0,31,0,0,0,0,0,0,29,91,0,0,0,0,0,0,0,0,0,0,0,0,289,0,0,0,214,0,0,0,0,0,0,561,0,0,0,0,129,0,0,0,0,0,562,0,0,0,0,0,0,0,412,418,0,0,0,0,0,0,0,0,0,0,0,0,0,0,397,0,311,0,0,0,0,0,5,0,0,0,0,0,0,0,299,0,0,0,0,0,0,0,0,0,0,0,0,0,535,0,0,0,413,0,0,399,0,0,0,0,0,0,606,0,0,0,542,0,0,89,0,543,0,0,0,0,0,0,0,0,0,0,509,461,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,268,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,412,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,611,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,610,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,621,0,0,0,0,0,559,0,0,0,0,0,0,0,0,0,0,300,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,608,0,0,212,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,626,626,626,626,626,626,626,625,627]);\nexport const labelText = \"orgmilcomschnetedugovdrrformsfeedbackofficialaccoorgmilschnetgovmagazinemediaunioncargopilotgroupcaarespressworksaerodromeworkinggroupair-traffic-controlaircraftaccident-preventioneducatormarketplaceambulanceinsurancecateringairportrepbodyenginesoftwaremodellingair-surveillanceconsultingchartertrainermaintenanceservicesdesignflightskydivingfreightassociationstudentgroundhandlingdgcafuelclubtaxicrewshowballooningexpresstraderbrokerauthoragentsairtrafficjournalistsafetyconsultantmicrolightaccident-investigationparachutingequipmentproductionfederationrecreationscientistnavigationengineertradingglidingleasingresearchpassenger-associationentertainmentparaglidinghangglidingaerobaticrotorcraftemergencycertificationgovernmentaeroclubexchangelogisticschampionshiphomebuiltcouncilconferencecontrolairlinecivilaviationjournalorgcomnetedugovcoorgcomnomnetobjofforgcomnetuwukiloappsframerorgmilcomnetedugovcoradioorgcomnetcommuneedogpbcoitgvorgedugov*spreviewfrontendrelayononstagingupid*mtls*privatelinktypedreamdeveloperbravemochawindsurfaivenmirenupsunwnextbegetngrokclerkwale2bwebcsbrunputerflutterflowspawnbaseshiptodaymagicpatternsnetlifyondigitaloceanrailwayhostedclaudehasurabotdashvercelgithubluyanigadgetreplitcloudflaretelebitedgecomputeevervaultexponyatnoopencrpplxzeaburwasmerframerzeropsrocketpreviewconvexmedusajsspritesonherculeseasypanelstreamlitsnowflakemesserliloginlinehackclubcodepennorthflankbase44corespeedleapcellngrok-freeclerkstagelovableon-fleek*us-west-3ap-south-2us-central-2us-central-1eu-central-1ap-south-1us-west-2us-east-2eu-north-1ap-north-1us-west-1us-east-1*rcloudintsegorgmilcomgobbetnetintedugovturmusicasenasamutualcoopip6uriurnin-addre164homeirisgovdixdaemoncloudnssthwien*inexexkunden4accogvormymyspreadshop4lima2ixortsinfofuturecmsfuturehosting12hpprivfuturemailinglima-cityfunkfeuer123webseitednshomemelmyspreadshopcloudletswasantqldvicactnswtascatholicwasaqldvictasidwasantozqldorgcomvicasnactnetedugovnswtasconfcomairflowlambda-urltransfer-webappairflowtransfer-webapptransfer-webapptransfer-webapp-fipstransfer-webappeu-west-3ap-south-2eu-south-2eu-central-2ap-southeast-3ap-southeast-4ap-northeast-3eu-central-1mx-central-1me-central-1ca-central-1il-central-1ap-northeast-1ap-southeast-1me-south-1af-south-1eu-south-1ap-south-1ap-southeast-7us-west-2eu-west-2us-east-2eu-north-1ap-southeast-2ap-northeast-2ap-southeast-5us-gov-west-1us-gov-east-1ca-west-1us-west-1eu-west-1us-east-1ap-east-1sa-east-1privatenotebookstudiolabelingnotebookstudionotebooknotebook-fipslabelingnotebookstudionotebook-fipsnotebookstudio-fipsnotebook-fipsnotebookstudionotebook-fipsnotebookstudioeu-west-3ap-south-2eu-south-2eu-central-2ap-southeast-3ap-southeast-4ap-northeast-3eu-central-1me-central-1ca-central-1il-central-1ap-northeast-1ap-southeast-1me-south-1af-south-1eu-south-1ap-south-1us-west-2eu-west-2us-east-2eu-north-1ap-southeast-2ap-northeast-2experimentsus-gov-west-1us-gov-east-1ca-west-1us-west-1eu-west-1us-east-1ap-east-1sa-east-1onrepostsagemakercopporgmilcompronetintedugovbiznameinfoshoprsorgmilcomnetedugovbrendlyresolvenzauscotvstoreorgcomnetedugovbizinfoidacaicoittvorgmilcomschnetedugovinfocloudezproxyacmymyspreadshopkuleuvenwebhostingtransurl123websitecloudnsinterhostsolutionsddns5476103298edgfacbmlonihkjutwvqpsryxzbarsycoororgcomedumyftpno-iporxcloud-ipfor-somemmafanfor-morewebhopselfipjozidyndnscloudnsdscloudfor-thefor-betteractivetrailcoeconorestooteorgcomeconeteduassurmoneyafricaarchitectesrestaurantloisirstourismavocatsinfoagrounivcoorgcomnetedugoviatvdeportesaludtksatorgmilcomwebgobnetinteducienciaboliviarevistacooperativaempresanombreindustriamusicapatriamedicinademocraciapoliticapuebloindigenaplurinacionalarteblogwikiinfoagrotransportenoticiasprofesionalacademiaeconomiaecologiamovimientotecnologianaturalsimplesitecepesebamapadfmgalampbacscpirngorotomtrjspaprrprrsesmscepesebamapadfmgalampbacscpirngorotomtrjspaprrprrsesms*biaamfmtcmptvfeirasampajampanatalbelemananiradiog12medindfndbmdtrdthepoaggfjdfdefinfenflegsegongengcngorgzlgslglogppgmillelqslcimcomnomadmjabimbbibbsbabcrectecsjcetcpscpvhudieticriapipsiecnbiorioecogeoteoodoproatoartfstmatvetdetbetnetcntnotfotgrueduajuespappreptmpemparqsrvadvdevgovntrturagrjorfarjusmusdesvixxyzcozfozslzbhzmaringasantamariacampinagrandegoianiasorocabafloripasaobernardocuritibaboavistarecifeaparecidasaogoncasalvadorcuiabamorenamacapalondrinacontagemsocialfortalmaceioleilaoosascoriobranconiteroi9guacutcheblogflogvlogwikitaxicoopmanauspalmascaxiasjoinvillebaruericampinassantoandreribeiraoriopretoweorgcomnetedugovv0windsurfshiptodaycloudsitecoaccoorgnetgovofmilcomgovmediatechzacoorgcomnetedugsjgovmydnspenfnlabnbmbgcbcqconcontnuyksknsmyspreadshopno-ipawdevboxbarsyonidatemfuinabusavinstanceseceuguukussryzespawncsxcloud-ipmyphotosfantasyleaguetwmailcleverappsscrappingccwucloudnsftpaccessgame-serverccgovobjectsrmalpgcust*svcalp1aeappenginermalpgmyspreadshop4lima2ixsquare7cloudscale123websitefirenet12hpflowgotdnslinkyard-cloudcloudnslima-citydnskingobjectstorageedaccogoorusorgcomnetinteduaéroportxn--aroport-byaassogouvcomilgobgovcloudnses-1eu-west-1us-east-1euvipit1eurarubait1s3lbwebsites3websiteru-spbru-mskelasticcsrunstnukukcaukusnl-ams-1fr-par-1fr-par-2functionsnodess3ddlwhmrdbfnck8sifrs3-websitecockpitscblmgdbdtwhkafkpubprivs3ddlwhmrdbk8sifrs3-websitecockpitscblmgdbdtwhkafks3ddlrdbk8sifrs3-websitecockpitscblmgdbdtwhkafkk8sscalebookpl-wawfr-parnl-amsbaremetalsmartlabelinginstancesdechk2kuleuvenlaravelvoorloperurownoxazapscwhstgrvaporonline-serverobservablehqelementorantagonistreclaimjoteluluencowaydiademjelasticmatlabmagentositetrendhostingaxarnetperspectajenv-arubajelejoteravendbemergenttrafficplexconvexkeliwebserveboltbegetcdnstaticson-rancherprimetelonstackitunison-servicesdnshomelinkyardbarsyjelecloudnscocomnetgovmycn-northwest-1cn-north-1s3s3-accesspoints3-websites3s3-accesspointrdsdualstacks3-deprecatedemrappui-prods3-websiteemrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apis3s3-accesspoints3s3-accesspointrdsdualstackemrappui-prods3-websiteemrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apicn-northwest-1cn-north-1cn-northwest-1ebcomputeelbcn-north-1airflowcn-northwest-1cn-north-1oncn-northwest-1cn-north-1amazonawssagemakeramazonwebservicesdirectasgdsdhehahljlnmhbacscahqhshhihnlnynsnmofjbjzjxjtjhkcqtwgsjssxnxjxgxxzgz網絡网络公司orgmilcomnetedugovxn--55qx5dcanva-appsxn--io0a7iquickconnectcanvasitekhsjxn--od0algcanva-codemyqnapcloudsrvrlessclustersrealtimestorageleadpagescarrdcrdorgmilcomnomnetedugovhidnssupabaserdpareplmypiumsoxmitotaplpagesfirewalledreplitowodevwebview-assetsvfswebview-assetss3s3-accesspointdualstackemrappui-prods3-websiteaws-cloud9emrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apicloud9eu-west-3ap-south-2eu-south-2eu-central-2ap-southeast-3ap-southeast-4ap-northeast-3eu-central-1me-central-1ca-central-1il-central-1ap-northeast-1ap-southeast-1me-south-1af-south-1eu-south-1ap-south-1ap-southeast-7us-west-2eu-west-2us-east-2eu-north-1ap-southeast-2ap-northeast-2ap-southeast-5ca-west-1us-west-1eu-west-1us-east-1ap-east-1sa-east-1s3s3-accesspointdualstackemrappui-prods3-websiteaws-cloud9emrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apicloud9s3s3-accesspointdualstackanalytics-gatewayemrappui-prods3-websiteaws-cloud9emrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apicloud9s3s3-accesspointdualstackemrappui-prods3-websiteemrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apis3s3-accesspointdualstacks3-deprecateds3-websites3-object-lambdaexecute-apis3s3-accesspoints3-websites3-accesspoint-fipss3-fipss3s3-accesspointdualstackemrappui-prods3-websites3-accesspoint-fipsaws-cloud9s3-fipsemrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apicloud9s3s3-accesspointdualstackemrappui-prods3-websites3-accesspoint-fipss3-fipsemrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apis3s3-accesspointdualstacks3-deprecatedanalytics-gatewayemrappui-prods3-websiteaws-cloud9emrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apicloud9vfss3s3-accesspointdualstackemrappui-prods3-websiteaws-cloud9emrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apicloud9eu-west-3ap-south-2eu-central-2ap-southeast-3ap-southeast-4ap-northeast-3eu-central-1mx-central-1me-central-1ca-central-1il-central-1ap-northeast-1us-northeast-1ap-southeast-1me-south-1af-south-1ap-south-1ap-southeast-7us-west-2eu-west-2ap-east-2us-east-2ap-southeast-2ap-northeast-2ap-southeast-5us-gov-west-1us-gov-east-1ap-southeast-6ca-west-1us-west-1eu-west-1us-east-1ap-east-1sa-east-1mrapaccesspoints3s3-accesspointdualstacks3-deprecatedanalytics-gatewayemrappui-prods3-websites3-accesspoint-fipsaws-cloud9s3-fipsemrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apicloud9s3s3-accesspointdualstacks3-deprecatedanalytics-gatewayemrappui-prods3-websites3-accesspoint-fipsaws-cloud9s3-fipsemrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apicloud9s3eu-west-3ap-south-2eu-south-2computes3-ap-northeast-2elbrdss3-ap-east-1s3-sa-east-1s3-us-gov-west-1s3-eu-central-1s3-ca-central-1eu-central-2ap-southeast-3ap-southeast-4ap-northeast-3s3-website-us-west-2s3-website-eu-west-1s3-external-1eu-central-1me-central-1ca-central-1il-central-1s3-us-west-1s3-eu-west-1s3-website-sa-east-1s3-website-ap-southeast-2ap-northeast-1ap-southeast-1s3-us-west-2s3-eu-west-2me-south-1af-south-1eu-south-1ap-south-1us-west-2eu-west-2us-east-2s3-website-ap-southeast-1s3-1s3-globals3-ap-northeast-3eu-north-1airflowap-southeast-2s3-us-gov-east-1s3-fips-us-gov-east-1s3-me-south-1s3-ap-south-1ap-northeast-2s3-website-us-west-1ap-southeast-5s3-eu-north-1s3-ap-southeast-1s3-website-us-gov-west-1compute-1s3-eu-west-3us-gov-west-1s3-website-ap-northeast-1us-gov-east-1s3-fips-us-gov-west-1s3-website-us-east-1s3-ap-southeast-2ca-west-1us-west-1eu-west-1us-east-1ap-east-1sa-east-1s3-us-east-2s3-ap-northeast-1authauthauth-fipsauth-fipseu-west-3ap-south-2eu-south-2eu-central-2ap-southeast-3ap-southeast-4ap-northeast-3eu-central-1mx-central-1me-central-1ca-central-1il-central-1ap-northeast-1ap-southeast-1me-south-1af-south-1eu-south-1ap-south-1ap-southeast-7us-west-2eu-west-2us-east-2eu-north-1ap-southeast-2ap-northeast-2ap-southeast-5us-gov-west-1us-gov-east-1ca-west-1us-west-1eu-west-1us-east-1ap-east-1sa-east-1rframeservicesbuilderstg-builderdev-builder*ociocpocsazuregcpawsdemoinstanceeu-west-3eu-south-2ap-southeast-3ap-northeast-3eu-central-1me-central-1ca-central-1il-central-1ap-northeast-1ap-southeast-1me-south-1af-south-1eu-south-1ap-south-1ap-southeast-7us-west-2eu-west-2us-east-2eu-north-1ap-southeast-2ap-northeast-2ap-southeast-5us-gov-west-1us-gov-east-1us-west-1eu-west-1us-east-1ap-east-1sa-east-1previeweu-4us-4us-1eu-1us-2eu-2us-3eu-3appscomputepaasrag-cloudrag-cloud-chjcloudjcloud-ver-jpcdemonodebalancermembersipeuxvsoncillaocelotonzayalilynxsphinxfentigercustomercaracalo365cloudstaticxendevapp001testcode-builder-stgplatformmediasiteprojedrydpagesjsx0desazacncoitrueu4uhkukgrbrushatenadiarymyspreadshopfrom-flfrom-wvwebspace-hosttheworkpchatenablogcursorusercontentservesarcasmapplinzisakuratanwixsiteappchizigiizeis-into-carsdnsiskinkyadobeaemcloudis-a-therapistpgfogmyvncdojinis-an-actress1kappfldrvkozowqa2jpnmexprgmrfirewall-gatewaydynnscafjsfbsbxooguyfrom-gawoltlab-demois-a-anarchistwiardwebteaches-yogadattowebtb-hostinglive-websiteservegamegotpantheonfrom-nhsubsc-payfrom-ohvipsinaappfrom-cadyndns-officehomelinuxfrom-mahercules-appservebbsstreakusercontentfrom-okfrom-wyfastly-terrariumis-a-llamaqualyhqportalserveexchangeon-vaporvivenushopciscofreakgrayjayleaguesmetaaiusercontentfrom-iais-a-libertariansaves-the-whalestaveusercontentyolasiteoperaunitepoint2thisis-a-catererclaudeusercontentlinodeusercontentfrom-vagithubusercontentsells-for-lesshosteurcanva-appsplaystation-cloudddnsfreefrom-pafrom-prfrom-waddnskingoutsystemscloudhotelwithflightmydattois-a-nascarfanmydbserverminiserverdamnserverservehumouris-a-playerfrom-nvfrom-nmemergentagentgentappsamplifyappfrom-kyis-an-accountantnfshostserveircfrom-akpythonanywherestackhero-networkpostman-echolikescandydyndns-mailobservableusercontentserveftpfreeboxosfrom-utcdn77-storageamazonawsneat-urldyndns-serverlinodeis-a-teacherfrom-vtgleezemythic-beastsus1-pleniteu1-plenitla1-plenitpaywhirlservecounterstrikejdevcloudhealth-carereformis-into-animegoogleapisis-a-painterafricaisa-hockeynutatmetais-an-actora2hostedis-a-democratdatadetectest-le-patrondigitaloceanspacesis-a-designeris-a-hunterlinodeobjectstemp-dnsissmarterthanyoufrom-arsimplesiteevennodetownnews-stagingis-a-liberalgooglecodejelasticservemp3qualyhqpartnerdyndns-free1cooldnsest-a-la-masiondrayddnsdynuddnsfrom-orfrom-miis-a-bloggerfrom-himydobisscanvacodeis-an-engineerest-a-la-maisonupsunappdevinappswafflecellmyasustorwpenginepoweredfrom-ctservep2psame-appmyshopblocksthingdustdatalikes-piediscordsezis-with-thebandlpusercontentis-leetshopitsite3utilitiesis-a-personaltrainersinaappladeskis-a-cheflogoipselfipbase44-sandboxnospamproxyalibabacloudcsmesswithdnsauthgearappsiamallamawithgooglelutrausercontentmochausercontentframercanvasmytabitdyndns-homew-credentialless-staticblitzcpserverdiscordsaysis-a-nurseappspotatlassian-isolated-3premotewdfrom-mtwixstudiocode0emm180rmyactivedirectoryawsappsmytuleapdnsabrpolyspaceqbuserrenderbuiltwithdarkboutirgotdnsabrdnsdopaascanva-hosted-embedawsglobalacceleratorhomesecuritypcmyiphostditchyouripclever-clouddyndns-ipon-aptibleis-a-musicianhosted-by-filessecuritytacticsappspaceusercontenthomeunixstrapiappsame-previewcf-ipfsmycloudnaselasticbeanstalkis-certifieddontexistkasserverik-serverdrive-platformatlassian-3pfirebaseappherokuappawsapprunnerbarsycenteris-a-cubicle-slaveservehttpmyshopifyis-a-guruquicksytessiiitesorsitesmagicpatternsappis-a-cpameteorappfrom-wiis-a-rockstarbumbleshrimpdattolocaldatabricksappsreadthedocs-hostedfrom-rifamilydsdyndns-picsplesknsbplaceddnsaliasdynaliasdyndns-remotedoomdnsip-ddnsblogdnsis-a-doctorroutingthecloudamazoncognitobarsyonlinedsmynasddnsgurucloudflare-ipfsdeus-canvasfrom-idsmushcdnpagespeedmobilizerdyndns-at-homeunusualpersonhosted-by-previderis-a-republicandyn-o-saurstreamlitappworkisboringonthewificprapidqualifioappis-uberleetis-slickgetmyipwpdevcloudtypeformdyndns-at-workgentlentapismynascloudw-corp-staticblitzfrom-ingeekgalaxyservebeerfrom-mdonrenderspace-to-rentaivencloudappspacehostedwafaicloudcodespotblogspotatlassian-3p-us-gov-modfrom-ndfrom-msis-a-techieis-a-studentcustomer-ociis-a-photographerdurumisfrom-ksmassivegriddyndns-wikiis-an-entertaineris-a-hard-workermysecuritycamerafrom-mnrackmazedyndns-blogis-a-bulls-fanwritesthisblogfreemyipsimple-urlfrom-sdreservdauthgear-stagingest-mon-blogueuris-into-gamesrice-labsxtooldevicesakurawebis-an-anarchistoraclecloudappsdyndns-worksells-for-urhcloudfrom-dcfastvps-serverwpmucdnis-a-geekscrysecfrom-txis-into-cartoonsmodelscapetrycloudflarelocaltonetstreak-linkbalena-devicesfrom-njforgeblocksfreebox-oswebadorsitefrom-ncdoesntexisthobby-sitestreaklinkshomesecuritymacownprovidertuleap-partnersdattorelaywphostedmailservequakeis-a-socialistservehalflifepivohostingdynuhostingquipelementsw-staticblitzdyndns-webfrom-deproject-studyaliases121is-not-certifiedhercules-devis-a-financialadvisorservepicsis-a-greenloseyouripfrom-ilwithyoutubemwcloudnonprodwiredbladehostingdnsdojofrom-tnpixolinomyqnapcloudis-an-artisthostedpiis-a-landscaperauiusercontentoaiusercontenton-forgeis-a-conservativedreamhostersnet-freaksapps-1and1is-goneencoreapifastly-edgefrom-nesalesforcefrom-scdeployagentoraclegovcloudappsfrom-alis-a-lawyercechirevultrobjectsstufftoreadisa-geekddnsgeeklovableprojecttry-snowplowfrom-moblogsyteis-a-bookkeepernogmyforumravendbmyboxdeelementoredsaacficogoorinforgcomgobnatneteduidstoreorgcomnetintedudevnomepublorgcomneteduathgovtestscalculatorspaynowinfoquizzesresearchedcloudnsfunnelsassessmentsjscaleforcetmacltdorgmilcompronetgovbizpresseklogesrsccloudcustomfltusrcloude4corealmgovmunicontentproxy9metacentrumdyndyndyndnsdynpagespages-researchitionoccustomercomymyspreadshopipv64diskussionsbereich4limacomrub2ixfirewall-gatewayddnssspdnsbarsykeymachinesquare7myhome-serverspeedpartnercommunity-proschuldockxenonconnectgünstigliefernbwcloud-os-instancedyndnssecmy-routerxn--gnstigliefern-wobin-butterl-o-g-i-nisteingeekin-dslin-berlinin-brbfuettertdasnetzleitungsenin-vpnlcube-serverdyn-ip24logoipdyn-berlinruhr-uni-bochum12hpgoipsrvdnsfruskygit-repossvn-reposinternet-dnsgünstigbestellenhome-webserverxn--gnstigbestellen-zvbbplacedheimdnscosidnswebspaceconfiglima-citydyndns1istmeinvirtualuserschulplattformmy-gatewayddnsseclebtimnetztest-iservmein-iservvirtual-userhome64iservschuletaifun-dnstraeumtgeradeschulserverdynamisches-dns123webseitednshomehs-heilbronndnsupdaterbssgraphicdwadpdwdaepeweaawapaafpfwfabwbpbacwcpcciwebuserapiobjectsidsiskospockkimodorikerbonesteamsparisjanewaypicardglobaltarpitreedpikekiraworfsulukirkarchertuckerhackercanarywesleystagingprereleaset3r2lpbravepanelngrokiservstglclcrmerpflypagesbarsyvivenushoplocalcertlocalplayerbearbloggatewaydeno-stagingis-not-ais-a-goodbotdashvercelmocha-sandboxplatter-appreplitgithubpreviewworkersinbrowserevervaultis-ahrsndenoxmitmodxmyaddrstorageapipayloadgrebedocruncontainersstgstagelclstageloginlineis-a-fullstackcodepenleapcellngrok-freeis-coolstoragewebharemediatechlibp2pdiscourseimaginecomyspreadshopstoreregbiz123hjemmesidefirmcoorgcomnetedugovsldorgmilcomwebgobartnetedugovtmorgpolcomsocartnetedugovassoagrondiscoodontk12medcuegyecpaabgengorgmilgalsaltulcomadmesmgobpubdocmonfindgnriouioproartlatvetnetfotedulojgovntrturibrbarxxxofficialbasechefprofmktgpsictechinfoarqtcontdentrrpppsiqgit-pagesritmedfieorgcomlibprieduaipgovriikmeactvsportorgmilcomscieunnetedugovnameinfopintouchtawktotawkmyspreadshoporgcomnomgobedu123miwebcomputeorgcomnetedugovbiznameinfocognito-idpeusc-de-east-1onjelasticnxaspdnsbarsydirectwpdeuxfleurstransurldogadoprvwcloudnsamazonwebservicesdnshomeuserpartycokoobinmkmfidymyspreadshopalandkapsiikixn--hkkinen-5wacloudplatformhäkkinen123kotisivuidacorgmilcompronetedugovbiznameinforadioorgcomneteduuserexperts-comptablestmmyspreadshopgretaprdcomnomynhccifbxoshuissier-justicenotairesaeroportfreeboxoson-webavocatassoportgouvkdnschirurgiens-dentistes-en-franceavouesfbx-os123sitewebveterinairechirurgiens-dentistespharmacienchambagrimedecinfreebox-osdediboxgoupilemszicpyicpvicppleysheezypagesedugovcnpyorgcomcybllcpvtnetedugovtnxonlineschooldaemond6atcopanelorgnetplybotdashstackitkaasorgmilcomnetedugovbizmodltdorgcomedugovcoorgcomneteduappwriteacorgcomnetedugovcloudtranslateusercontentorgcomnetedumobiassoorgcomnetedugovbarsysimplesitediscourseindorgmilcomgobneteduorgcomwebnetedugovguaminfonxhra教育敎育網絡网絡组織組織网络網络组织組织公司政府個人个人箇人ltdorgcomincneteduidvgovxn--uc0ay4axn--55qx5dxn--mk0axixn--io0a7ixn--uc0atvxn--zf0avxxn--lcvr32dxn--od0algxn--wcvs22dxn--gmqw5axn--od0aq3bxn--mxtq1mxn--ciqpnxn--tn0agxn--gmq050iorgmilcomgobneteduiservwp2tempurlmircloudfreesitewpmudevmyfastgadgetcloudaccessjelehalfboltfastvpsemergenteasypanelopencraftizcombrendlynamefromrtpersoadultmedorgpolrelcomproartnetedufirminfoassoshopcoopgouvtmcomediahotelforumvideosportorgsexagrargameslakaseroticaerotikatozsdereklamcasino2000filmsuliinfoboltshopprivnewsszexcityutazasjogaszkonyveloingatlaneacaicogoormyᬩᬮᬶmilwebschnetkopbizzonedesaponpesxn--9tfkymyspreadshopgovmytabittabitorderravpageaccok12idforgnetgovmuniltdplcaccotttvorgcomnetmeca6g5gpgamubacaicniocoukuptverdruscsdelhiindorgmilcomwebnicfingenpronetintedugovresbizbiharbarsyinternetbusinessschooltravelsupabasealumnigujaratfirminfoaeropostbankcoopindevscloudnsno-ipbarsybarrell-of-knowledgebarrel-of-knowledgensupdategroks-thisdnsupdatefor-ourknowsitalldvrcammittwalddynamic-dnsv-infowebhopselfipdyndnshere-for-moreilovecollegemayfirstforumzcloudnsmittwaldservertypo3servergroks-theeusekd1cdndyndnsidrawsainaueuapjpusstagemocksysdevicesclientcustreservdcustdevdisrecprodtestingcobeebyteutwenteboxfusebravepstmndedynngrokorgmilcomnomnetedugovqcxqzzbarsythingdustmo-siemensrb-hostingfh-muenstergitbookbluebitecloudbeesusercontentnodeartkiloappsforgerockdarklangresinstagingapigeebubbleb-datascryptedhypernodedappnodepantheonsitegitlabgithubkeeneticvirtualservercleverappshostyhostingon-rioedugitticketstelebitwixstudioon-k3sicp0icp12038jeleqotolairbubbleappsmyaddrstolosmyrdbxwebflowdrive-platformbeagleboardhasura-applolipopdefinimavaporcloudmusicianwebflowtestazurecontainerresindevicereadthedocsloginlineeditorxmoonscalesandcatsbasicserverwebthingsbrowsersafetymarkbeebyteappbitbucketidaccovistablogorgschnetgovxn--mgba3a4f16axn--mgba3a4fraarvanedgeايرانایرانjclaspeziapdudcefegelemeperetevebacanatavaparasabgagfgogrgpgalclblimfmrmcbmbvbfclcmcvcrcpcchlimifibicivipirisimncnbnanenrnpntnnolomobocoaogorosopotoptvtatctbtmtltotpusulunutpspapaqsvpvvvtvavvrtrsrprgrfrcrbrarorkrvstsssbscsmsispzczbzbozen-suedtirolmyspreadshopxn--bulsan-sdtirol-nsbxn--valledaoste-ebbtrentinoaltoadigetrentin-sued-tirolxn--forlcesena-c8axn--forl-cesena-fcbxn--bozen-sdtirol-2obtriestetrentinsuedtiroltrentino-s-tirollecceudineaostesienaparmaluccapaviagenoapaduaaostamonzaabruzzoternirietiturinmilanbozenlaziofermoleccocuneonuoropratola-speziavdataaligfvgpugmolcalcamlomumbsicpmnvenvaoedugovabrsarmaremrbastoslazibxosfirenzetrentinosüdtirolval-d-aostavalle-aostamessinacremonaravennatoscanatrentin-suedtirolbolognacalabriaurbinopesarofriuli-v-giuliaogliastraxn--valle-aoste-ebblaquilaandriatranibarlettasyncloudxn--valle-d-aoste-ehbaostavalleyvalled-aostatrentino-alto-adigevallee-d-aostexn--balsan-sdtirol-nsbpistoiasicilialucaniacataniaiserniaperugiabresciaveneziagorizialiguriaimperiabulsan-suedtirolbalsan-suedtirolbarlettatraniandriaxn--trentino-sdtirol-szbforlì-cesenatuscanyvallée-d-aostemantovavallée-aostecasertapiemontevalleaostaval-daostafriulivgiuliatrevisoforli-cesenavalléedaosteferrarapescaravald-aostatrentino-altoadigefriuli-vegiuliavallee-aostecarboniaiglesiastarantomediocampidanovalleedaostetrentinosud-tirolcampobassotrentinsüd-tiroltrentinosüd-tirolmonzabrianzatrentino-südtirolxn--trentino-sd-tirol-c3bpotenzacosenzavicenzaemiliaromagnavenicefrosinonemarchepordenonetrentinosued-tirolvaresemolisevalléeaostefriuli-veneziagiuliabasilicatalatinaanconasavonaveronamodenabiellabolzano-altoadigepugliafoggiaumbriatrentino-stirolgenovapadovamateranovararagusapiacenzatrentinostirolvalleeaostetempio-olbiasudsardegnatrentinsudtirolmassa-carrarafriuliveneziagiuliatrentinosuedtirolandria-barletta-tranitrapanixn--cesenaforl-i8amaceratacaltanissettaascoli-picenobrindisicarraramassacagliaririmininapolivibo-valentiachietibulsan-sudtirolbalsan-sudtiroltrentino-a-adigebulsanbalsaniglesiascarboniamilanotorinoteramodell-ogliastraarezzotrentinoalto-adigerovigotrentovenetoiglesias-carboniatrentino-sud-tirolaltoadigereggio-emiliareggio-calabriasardegnatranibarlettaandriapiedmontxn--sdtirol-n2amedio-campidanotrentino-süd-tirolfriuli-vgiuliafriuli-ve-giuliaromeennaromapisa32-b16-b64-blodiastibarineencomonaplesforlicesenailiadboxosalessandriasicilytrani-barletta-andriaxn--trentin-sdtirol-7vbpesarourbinotrentinsued-tirolcesena-forliforlìcesenaemilia-romagnamonzaebrianzaxn--trentinsdtirol-nsbtrentinos-tiroltrentinsüdtirolvalledaostaolbia-tempiocampidanomediovibovalentiasassarivalle-daostalombardysud-sardegnafriulivegiuliareggioemiliamonzaedellabrianzaalto-adigevercellitrentin-sudtiroltraniandriabarlettatrentino-sudtirolascolipicenobozen-südtirolfriulive-giuliaflorencexn--cesena-forl-mcbcarbonia-iglesiasaosta-valleycarrara-massadellogliastratrentinoa-adigexn--valleaoste-e7apesaro-urbinoxn--trentinosdtirol-7vbxn--trentin-sd-tirol-rzbxn--trentinsd-tirol-6vbtrani-andria-barlettatrentin-süd-tirolxn--trentinosd-tirol-rzbgrossetomonza-e-della-brianzasüdtirolreggiocalabriatrentinoaadigetrentin-südtirolverbano-cusio-ossolafriuliv-giuliaverbaniacampaniatrentino-aadigefriulivenezia-giuliasardiniaandriabarlettatranibarletta-trani-andriacatanzarooristanourbino-pesarocesena-forlìvalle-d-aostacampidano-medio123homepagesiracusatempioolbiasuedtirollombardiaavellinocesenaforlìtrentinofriuli-venezia-giuliabozen-sudtirolandria-trani-barlettabulsan-südtirolbalsan-südtirolmonza-brianzabolzanotrentino-sued-tirolbellunosalernolivornocrotonesondriodnshometrentinsud-tirolmassacarraratrentin-sud-tiroltrentino-suedtirolviterbobergamocesenaforliolbiatempiopalermobeneventoagrigentoofcoorgnetfmaitvphdengorgmilcomschnetedugovperagrikanieasukehandachitatokaiaisaikonanoharuamaobuhigashiuraowariasahiinuyamatobishimaiwakurashitarainazawatoyonegamagorimihamatoyotataharakariyayatomioguchikomakimiyoshinishiotokonamekiyosuchiryutoyohashiokazakiisshikikasugaikotakiratoeianjotogofusosetohazutsushimashinshirotakahamanisshinshikatsuhekinantoyokawaichinomiyatoyoakeodateogataakitaikawakyowahonjoogayurihonjonoshirokamiokakatagamimitanegojomeyokotekosakadaisenkazunonikahohonjyomoriyoshimisatohappoukamikoanihachirogatahigashinarusesembokufujisatokitaakitaitayanagiowanitakkomutsutsurutahirosakigonoheoirasetowadamisawanohejiaomorishingohiranairokunohehashikamitsugarushichinohehachinohenakadomarisannohekuroishisakaeisumiasahiotakiinzaiabikomatsudoyachiyomutsuzawakujukuriomigawakashiwatoganemihamanaritasakuranagaramobarahanamigawachoshishiroichoseikozakishisuikatorimidorichonankyonanfuttsuonjukufunabashinagareyamanodasosatakochuotohnoshourayasukimitsuyokaichibayotsukaidosodegauratateyamakamagayayokoshibahikariyachimatakatsuuratomisatokisarazukamogawaichikawanarashinoichinomiyashimofusaminamibososhirakoichiharaoamishirasatoikatahonaiainansaijoseiyoiyoozuuwajimaniihamanamikatamasakiuchikokihokutobetoonshikokuchuomatsuyamaimabarikamijimakumakogenyawatahamamatsunosabaeikedaobamasakaifukuiohionotsurugamihamawakasaminamiechizeneiheijikatsuyamatakahamaechizensoedaukihaomutaokawanishiogoribuzenonojosueumiokiotochikugosasagurisaigawamizumakishinyoshitomikurumekurateyamadakasuganakamamiyamanogatatakatahakataiizukakawaratagawakasuyaashiyainatsukimunakataminamitsuikishonaikurogifukuchikeisenhigashimiyakoshinguyukuhashiokagakiyamekogaongausuikahotohochuotoyotsumiyawakadazaifuhisayamatachiaraiyanagawanakagawahirokawachikujochikushinochikuhochikuzennamieotamaokumashowateneiiwakikoorinangoononishigoshimogoomotegomishimafukushimaasakawakagamiishishirakawaiitatefutabahiratayugawahanawakitakatakawamatakunimiyabukibandaihigashihironoyamatomiharuyamatsuriaizubangedatesomaaizuwakamatsuyanaizuaizumisatonishiaizuizumizakikitashiobarataishinkaneyamakoriyamainawashirotanagurafurudonosamegawasukagawaishikawatamakawaikedaogakitaruiginanenahashimahichisonakatsugawaibigawashirakawamizunamiminokamomitakekawauesekigaharatomikasakahogikitagatayamagatatajimianpachimotosuyaotsukakamigaharahidakanisekitokigujominogodoyorogifukasamatsutakayamawanouchihigashishirakawakasaharashimonitatsumagoichiyodakannakanrashowameiwakiryuotaoratomiokafujiokaitakuranaganoharahigashiagatsumatakasakishibukawaminakamikatashinatsukiyonokawabanumataannakaoizumimidorishintoisesakiuenoyoshiokakusatsutakayamanakanojonanmokutamamuratatebayashimaebashiotakekaitadaiwahongofuchukuietajimashobaramiharahatsukaichihigashihiroshimamiyoshikumanokurenakasakaseraseranishiasaminamifukuyamashinichionomichiosakikamijimajinsekikogentakeharaotobenanaeikedatohmaozoraobiraabirakyowaeniwataikibibaisharirebunerimohiroooketootarupippunishiokoppechitosefurubirahakodateshiranukakitahiroshimakushiroobihironanporoiwamizawaniikappukunneppufukushimanakasatsunaitoyourakuromatsunaiakabirakamisunagawashibechaurakawakamifuranonakatombetsuasahikawashimokawakayabeokoppebiratoriabashirisaromaatsumanumatahidakabifukamukawamikasahorokanaitoyotomisarufutsuhigashikawaishikarikitamiyoichiesashiiwanaitomariminamifuranoakkeshifuranotoyakoyakumootoineppushikaoishiraoinemuronayorohaboroashorobihororishirifujiutashinaihokutotakasuebetsuurausuassabukikonaishimamakinaiedatetoyabieinikiesanuryuoumuteshikagarikubetsuashibetsukimobetsuaibetsutobetsusobetsuembetsushimizuchippubetsurishirihokuryuhoronobeshintokutsubetsushibetsuhonbetsumombetsutsukigatakuriyamakoshimizushiriuchikutchanmurorannoboribetsukamishihorowassamushinshinotsukembuchiwakkanaikamoenaikiyosatotakinoueshikabesunagawafukagawanakagawatakikawakamikawahigashikagurahamatonbetsumatsumaemoseushirankoshishakotanimakanemashikeotofuketomakomaisandatambaitamiawajikasaiasagoshisoonoakoyashirotoyookaminamiawajiinagawafukusakitakasagokamigorikasugaharimayokawaashiyahimejiakashitaishiaogakisannantakinosumototakarazukanishinomiyashingugoshikinishiwakiyokatakaaioimikisayoyabukawanishiamagasakisasayamashinonsenkakogawaichikawakamikawatatsunotsukubaiwamaogawaasahisakaitokaioaraiitakobandodaigosuifuinaamikasumigaurakashimaomitamayachiyoshimodatetomobetoridehitachinakainashikisakuragawakasamayawaramoriyahitachiomiyanamegatayamagatahitachikamisuushikutakahagiibarakitonekoganakasowayukimihojosomitoryugasakishimotsumafujishirotsuchiurachikuseihitachiotashirosatotamatsukuriuchiharashikahakuinanaotsubatawajimakahokukawakitatsurugikaganominotosuzuuchinadakomatsuanamizunakanotohakusannonoichikanazawaiwateshiwafudaikawaimoriokaofunatohanamakikuzumakikitakamininohekunoheyamadayahabasumitaichinosekitanohatahiraizumirikuzentakatajobojiotsuchihironomiyakoiwaizumikarumaiichinohenodakujitonooshushizukuishifujisawamizusawakamaishikanegasakimannoutazukotohiraayagawazentsujihigashikagawauchinomikanonjisanukimarugamemitoyotakamatsutadotsunaoshimatonoshoakuneamamiizumihiokiyusuikinkoisasookouyamanakatanekagoshimakanoyaisenkawanabeminamitanemakurazakitarumizunishinoomotematsumotosatsumasendaioimatsudaayaseebinamiurazushinakaiodawaraiseharasagamiharahakoneaikawakaiseiatsugitsukuihadanoyamatoyamakitazamaoisochigasakininomiyayokosukakamakuraminamiashigarafujisawasamukawakiyokawahiratsukayugawaraokawaumajikochitsunootoyoakiinonishitosayasudahidakamiharasakawaniyodogawahigashitsunokagamigeiseisusakiotsukinaharisukumomurototosakamiochitoyotosashimizumotoyamanankokunakamurakitagawayusuharaogunichoyoukiasoutoozugyokutoamakusamifunetakamoriyamagaminamataminamiogunikikuchisumotoyamatonagasumashikiaraokumamotokamiamakusanishiharayatsushiroayabeseikasakyoideineujinakagyokameokakyotangokyotanabekyotambaminamiyamashiroyamashinatanabeyawatawazukaminaminantanmiyazuhigashiyamafukuchiyamakitamukokamojoyokizumaizuruujitawaraoyamazakinagaokakyokumiyamakawagoeinabeshimameiwaasahitaikiudonoisetsukisosakikuwanamihamamiyamasuzukatamakimisuginabarikumanokomonominamiisewataraitobakiwatakikihotadomatsusakayokkaichikameyamaureshinoishinomakishichikashukuohirataiwaosakizaohigashimatsushimashikamaiwanumashibataogawaraonagawakawasakiseminemarumoriminamisanrikukakudamuratawakuyatomiyanatoriwataritagajomisatotomekamirifushiroishimatsushimayamamotoshiogamafurukawahyugaebinotsunosaitoayakushimanobeokakitauramiyazakitakazakigokaseshiibamimatashintomikunitomikitakatakobayashikawaminamitakaharukijotakanabemiyakonojonishimeranichinankitagawakadogawamorotsukakisofukushimaminamimakisakaeobuseikedaogawamiasaokayaasahiotakiotarichinoinaomichikumakomaganechikuhokukaruizawayasuokaooshikaikusakaminamiaikitogakushimatsukawakawakamitateshinatakamorikitaaikishiojirimiyadahakubaiizunaiijimaiiyamamiyotasuzakayasakatoguraookuwanagawaminowahirayayamagataminamiminowafujimiomachisakakitakaginaganonakanosakuhokomoronagisoshinanomachiwadauedaiidaharasuwatomiachiaokianankisosakunozawaonsenagematsutakayamashimosuwamatsumotoyamanouchinakagawamochizukiazuminotatsunoobamaomuraseihiunzenosetofutsuikichijiwanagasakiisahayahasamisaikaikawatanasasebohiradokuchinotsugototogitsutsushimashimabarashinkamigotomatsuurayamazoekashibaikomakawaitenrioyodosangokoryoudaojiikarugayamatokoriyamatenkawakatsuragikurotakikawakamimiyakemitsuetakatorikamikitayamayamatotakadahegurishinjokanmakisakuraitawaramotogoseoudanarasoniandokawanishishimoichihigashiyoshinokashiharashimokitayamanosegawayoshinomintsivorytopazsakuragehirnsumomoaseinetopalmail-boxmokurenyoitamuikaojiyagosensanjoaganomyokoseiroagaomishibataniigatanagaokamurakamiuonumayuzawakariwatagamitainaitsunanminamiuonumatochioyahikojoetsuseiroukamosadoizumozakitokamachiitoigawasekikawakashiwazakitsubamemitsukekokonoesaikiusukibeppuusahimeshimakunisakihasamataketatsukumihitaoitahijikusuyufukujukamitsuebungoonobungotakadaibaraniimibizentsuyamaokayamakasaokahayashimayakagemaniwaakaiwamisakishinjotamanotakahashikibichuowakesojanagishookumenannishiawakurakurashikiasakuchisetouchikagaminosatoshotomigusukunakagusukuyaeseizenaurumaiheyaaguniogiminanjokinminamidaitokitanakagusukuyonaguniokinawaishigakikunigamiurasoekadenataramahiraraginozataketomishimojizamamitonakiitomanhigashimotobuyonabarugushikamionnanahanagohaebarukumejimakitadaitonakijinnishiharayomitanginowantokashikiishikawaikedasuitaminohizuminishisakaikananabenodaitoosakasayamayaokishiwadatadaokakaizukatondabayashichihayaakasakakumatorikadomasayamahigashiosakashijonawatehirakatataishimisakitajirihannansennankatanotoyonominatosettsuhigashiyodogawaibarakinosekitachuohigashisumiyoshifujiiderakashiwaraizumiotsutoyonakamatsubaramoriguchiizumisanoshimamototakatsukineyagawahabikinotakaishikawachinaganoyoshinogarikamiminearitaouchiimarihizenogikashimaariakekiyamafukudomikitagatakitahataomachigenkaikanzakinishiaritakyuragisagataratosutakushiroishikaratsuhamatamakouhokukawagoeyoshidasatteogoseirumaasakaurawaogawaniizaomiyayoriiotakishikihonjooganohannohanyuinasaitamaokegawaarakawayoshikawayokozehasudasayamahidakafukayachichibuiwatsukiryokamiyoshimikamiizumifujimiwarabiranzanmiyoshiminanoyashiosakadosugitomisatohigashichichibutodasokakukiyonokazoshiraokakasukabekounosukawajimatsurugashimamiyashirokitamotohatoyamamoroyamahatogayakumagayakawaguchinagatorokamisatomatsubushinamegawatokigawakamikawafujiminohigashimatsuyamakoshigayatokorozawas3isk01isk02ryuohkoseikonanaishorittotakashimamaibarahikonetorahimenishiazaikokagamokotoyasuotsukusatsunagahamamoriyamatoyosatotakatsukinotogawaomihachimanhigashiomiakagiunnanizumogotsuamayatsukakakinokimatsuehamadamasudahikawahikimiokuizumoyasugiyakumomisatotamayuohdahigashiizumookinoshimanishinoshimatsuwanoshimaneshimadafujiedayoshidashimodagotembaiwataatamikosaiyaizuitoizumishimahaibaramakinoharaomaezakikawanehonkannamisusonohigashiizufukuroinumazukawazufujiaraishizuokahamamatsushimizuizunokunimatsuzakimorimachiminamiizunishiizukikugawakakegawafujikawafujinomiyaujiietsugaoyamayaitaohiranikkoashikagakuroisokanumasakurashioyakarasuyamamotegiichikaikaminokawatochigihagamokanogisanobatonasumibunasushiobaranishikatautsunomiyaiwafunemashikoshimotsukeohtawaratakanezawaitanokomatsushimatokushimaichibaminamiaizumiwajikikainanmiyoshinarutomimamugiananmatsushigesanagochishishikuinakagawamachidachiyodakomaefussainagitaitochofufuchuomeotahigashiyamatotoshimaokutamaaogashimakodairaedogawaarakawahachiojishinagawatachikawashibuyasuginamihinodekiyosesumidaoshimanerimamitakahamuraadachinakanomizuhobunkyomegurominatokoganeihigashikurumekokubunjihigashimurayamamusashimurayamatamakitahinochuokotokatsushikakouzushimaogasawaraakishimakunitachishinjukusetagayamusashinohachijoitabashiakirunohinoharachizunanbukotouramisasawakasayonagokogehinoyazutottorinichinansakaiminatokawaharaoyabetairainamiasahinantoimizufuchutakaokakurobeyamadajohanatoyamatonaminyuzenfunahashinakaniikawanamerikawaunazukitogahimiuozufukumitsutateyamakamiichiiwadearidayuasainamitaijikatsuragiaridagawatanabemihamahidakakainankiminomisatoshingushirahamakamitondayurakozakoyagobokitayamawakayamakudoyamahashimotokushimotokozagawahirogawakinokawanachikatsuurarsuseroeoishidasagaeoguniasahinagaitendonanyoobanazawanishikawasakataohkuratozawamikawamamurogawayamagatafunagatatakahatashonaishinjokahokuiideyuzakawanishitsuruokakaminoyamayamanobeshiratakamurayamanakayamakaneyamahigashineyonezawasakegawamitouubeyuuabushimonosekitabuseoshimatoyotaiwakunihikarishunannagatohagihofukudamatsutokuyamashowadoshitsurunanbukoshukaiminami-alpsnirasakikosugeotsukioshinohokutominobuyamanashifuefukichuokofuichikawamisatoyamanakakonakamichitabayamanishikatsuranarusawafujikawahayakawafujiyoshidafujikawaguchikouenohara長野京都岐阜大阪三重群馬千葉滋賀佐賀奈良adednelgaccogogror秋田愛知高知埼玉沖縄栃木熊本岩手青森山梨新潟島根鳥取長崎香川宮城石川大分宮崎茨城山口兵庫山形徳島広島福島福岡岡山富山静岡愛媛福井東京xn--4it168dhatenadiaryxn--vgu402ckawaiishophatenablogcocottenamaste北海道penneehimeiwateversestabachibashigagonnagunmapermahaccaakitaosakauh-ohblushkochiaichifukuikuroncapooitigohyogotokyokyotopunyuthickcheap0t00g00j0mie2-ddaapyawjg0amfemsubxiiboomoobutchueekpgwrgrherskrboyrdyupperunderflierchipsmydnsheavyangryhippygirlyrulez神奈川鹿児島和歌山bambinaxn--nit225kokayamasaitamaxn--k7yn95exn--1lqs03nsapporoparasitelolipopmcxn--efvn9sniigatafukuokatokushimafukushimahiroshimakagoshimafakefurokinawaxn--8pvr4ucoolblogxn--0trq7p7nnkawasakinagasakimiyazakichilloutxn--8ltr62kxn--klty5xpeeweezombiecutegirlxn--rny31hxn--uuwu58axn--ntso0iqx3axn--djrs72d6uytoyamanikitanyantakagawamimozanagoyaboyfriendxn--2m4a15egreaterchowderegoismyamagatafashionstorexn--elqq16hxn--pssu33lsendaimiyagixn--rht27zpecoriaomorisaloonwatsonvivianxn--djty4knobushipigboatnaganopinokoxn--f6qx53asadistvelvetsecretxn--5js045dchicappayamanashiibarakidigickgirlfriendxn--1lqs71dmongolianxn--c3s14mxn--qqqt11mtochigixn--5rtq34kparallelo0o0mondkobesagabonadecaoitanarafoolkilldecimainhiholomosblokilociaoundopupugifutankcrapflopnooroopsmodsholyjeezstripperpepperbittershizuokaxn--rht3dkitakyushureadymadeicurusversusmatrixxn--rht61ehungryfloppygloomycrankyhandcraftedlittlestarxn--klt787dxn--kltx9awhitesnowsunnydaytottorilovepoptheshopbuyshopxn--5rtp49cxn--d5qv7z876cwebaccelxn--kbrq7oxn--4pvxsxn--1ctwolovesickkumamotocatfoodxn--tor131oyokohamawakayamatonkotsuxn--ehqz56nxn--uist22hxn--6btw5axn--kltp7dyamaguchifrenchkisspussycatxn--4it797kxn--uisz3gbabybluexn--zbx025dnetgamersxn--7t0a264ckanagawaxn--6orx2rishikawaxn--ntsq17ghalfmoonschoolbusjellybeanxn--mkru45iusercontentlolitapunkxn--32vp30hsakurastoragehokkaidoshimanecandypopbabymilksupersaleweblikeraindropbackdropwebsozaikikirarahateblodaynightmeneacsccogoormobiinfoaeusxxorgmilcomnetedugovorgcomnetedugovbizinfotmprdorgmilcomnomedugovassnotairespresseassocoopgouvveterinairemedecinpharmaciensorgnetedugovtraorgcomedurepgovmeneperekgacscaiiocogoitoresmshsseoulbusanulsandaeguc01milvkimmvchungnamjeonnamjeonbukeliv-dnsgyeonggijejueliv-cdnincheondaejeongangwongyeongbukgwangjuchungbukgyeongnameliv-apicoeduindorgcomembnetedugovorgmilcomnetedugovjcloudorgcomnetintedugovperbnrinfocooyorgcomnetedugovethipfscanvamypepethw3sstorachakeeneticjoinmcinbrowserdwebcyonnftstoragemyfritzaemewphlxachotelltdorgcomwebsocschngonetintedugrpgovassnomgacsccoorgnetedugovbizinfo123websiteidorgmilcomasnnetedugovconfidmedorgcomplcschnetedugovaccoorgnetgovpresstmassoirseproxaccosoundcasthoptocraftvp4c66orgnetedugovitsmcdirmyboxbarsyedgestacksynologylogintoopencloudnohostwebhopdiskstationi234tcp4hoocgroknoipprivmydsddnsdnsforlohmustransipdscloudfilegear-sgbrasiliafilegearframerbarsybarsyonlinecoprdorgmilcomnomedugovinforgcomnetedugovnameacprorgcomartnetedugovpresseinfoassoinstgouvorgnycedugovbarsydscloudjuorgcomnetedugovminisiteaccoororgcomnetgovorgmilcompronetintedugovbizmuseumnameinfoaerocoopaccoorgcomnetintedugovbizcooporgcomgobneteduorgmilcomnetedugovbiznameaccoorgmilneteduadvgovcoorgcomnetaltgovforgotherhiskeeneticispmanagernomassoprod5476132eastasiacentraluswesteuropewestus2eastus2pnortheurope-01newzealandnorth-01southindia-01southcentralus2-01norwaywest-01eastus2-01westus2-01australiaeast-01italynorth-01israelnorthwest-01swedencentral-01westeurope-01centraluseuap-01taiwannorthwest-01uaecentral-01northcentralusstage-01israelcentral-01mexicocentral-01canadacentral-01austriaeast-01germanywestcentral-01francecentral-01ukwest-01denmarkeast-01polandcentral-01eastus-01westus-01swedensouth-01eastus3-01westus3-01brazilsouth-01centralus-01francesouth-01australiacentral-01westindia-01uaenorth-01jioindiacentral-01canadaeast-01belgiumcentral-01spaincentral-01koreacentral-01chilecentral-01qatarcentral-01westcentralus-01eastus2euap-01norwayeast-01southafricanorth-01brazilsoutheast-01germanynorth-01switzerlandnorth-01switzerlandwest-01japanwest-01southafricawest-01japaneast-01eastasia-01indiasouthcentral-01taiwannorth-01centralindia-01uksouth-01southcentralus-01northcentralus-01eastasiastage-01indonesiacentral-01australiacentral2-01australiasoutheast-01malaysiawest-01koreasouth-01southeastasia-01southeastus5-01northeastus5-01jioindiawest-01rucdnwest1-usfra1-desandboxjls-sto1jls-sto3jls-sto2aglobalabglobalsslmapprodfreetlsmapvpslon-1lon-2ny-1fr-1sg-1ny-2paassnwebpaashostingjelasticnordeste-idcsocuserpagescwebfileblobservicebuscoreatlricnjsjelasticwebsitestoragesezagbinruhuukjptsmyspreadshopmynetnameakamaiorigin-stagingfrom-coipv64dynv6cdn77serveblogadobeaemcloudhicamsprytdnsupno-ipownipde5ovhicpfirewall-gatewaysytesmypsxbarsyusgovcloudapimyamazemyradwebakamaihdsaveincloudfastlylbfrom-lasubsc-paysquare7in-the-bandblackbaudcdnhomelinuxoninfernoctfcloudservebbsdns-dynamiccloudfrontakamai-stagingipifonyham-radio-opsenseeringclickrisingcommunity-profrom-nylocalcertgrafana-devedgesuite-stagingcloudflareanycasteating-organicatlassian-devmydattofeste-iplocaltotorprojectknx-serveredgekeycloudflareglobalcloudyclustercasacamserveftpakamaized-stagingakamaiorigindns-cloudmyeffectboomlabotdashbuyshousestwmailhetemlazure-mobilein-dslthruhereredirectmedynuddnsbouncemesupabaseluyanicloudappakamaicloudfunctionsdebiannhlfanpgafanstatic-accessin-vpnmysynologymafeloappudohomeftptrafficmanagersiteleafseidatmemsetcloudflarecloudaccesskeyword-onazure-apiis-a-chefdoes-itgets-itwebhopselfiphomeipkicks-assedgesuitewindowsserver-ontunnelmolemydissentscrapper-sitecloudflarecnuni5srcfggffiobbzabchrsndenodynuopikddnsvpndnsakadnselastxkinghostvps-hostfastlyhomeunixazureedgeshopselectdontexistmyfritzcloudjiffyalwaysdatasells-itsquaresbroke-itazurefddattolocalat-band-campmeinforumfamilydsazurestaticappsdefinimabplaceddnsaliasdynaliasnow-dnsblogdnsroutingthecloudendofinternetdsmynasakamaiedgemymediapcadobeio-staticakamaiedge-stagingakamaihd-stagingddns-ipprivatizehealthinsurancelive-onkrellianschokokeksmassivegridmysecuritycamerarackmazeserveminecraftfrom-azis-a-geekakamaizedmoonscaleoffice-on-theusgovtrafficmanageradobeioruntimeedgekey-stagingreserve-onlinechannelsdvrdnsdojousgovcloudappcdn77-sslapps-1and1podzoneazurewebsitesdynathomescaleforceyandexcloudvusercontentisa-geekcdn-edgescoaemalcesappwriteazimuthtlonarvobuiltwithrocketnoticeablestorecomwebrecnetperotherfirminfoartslgdloncogoiltdorgmilcolcomplcschgenngonetedugovbiznamefirmmobiacincoorgmilcomnomwebgobnetintedubizinfocomyspreadshopdemongovtransurl123websitehosting-clusterkhplaycistrongsnesosvalervålerxn--vler-qoaossandeheroysandeherøybøboheroyherøyxn--hery-iraxn--b-5gavalerbøboxn--b-5gasandesandexn--hery-iraxn--vler-qoavålerhåreålaahavaofsfvfhlolnlalrlhmfmtmahcostntbuåstrmreigersundmyspreadshopgálsáeidsvolltingvollgildeskalflorøvadsøvardøvanylvenxn--bhccavuotna-k7astrandaxn--kvnangen-k0axn--sknland-fxaxn--mosjen-eyarakkestadhyllestadnannestadvevelstadvaapstenordre-landsondre-landsøndre-landtjieltexn--vrggt-xqadsør-aurdalsor-aurdalheradstordmoldefordeførdeseljefedjeryggehemnexn--krehamn-dxasognegranesøgnebrynetjomevallebykletokkegiskedovretjømehobølvoldasaudatolgasømnaviknadønnasomnadonnatranafrananesnaraumasmolatrænafrænalesjasmølaørstaorstahitrafloraaukraloppafrøyarissasnasahalsagalsaromsaraisaráisafroyasnåsagronghobolfjelltydalårdalardalaskimharamkraanghkekråanghkesorumbarumhurumbærumsørummodumsálátbálátfrognbjugnvåganvagangulenskienløtenlotenstrynvefsnxn--merker-kuaskaunsveiobømlobomloskjåkvardoflorovadsosalatbalatsálatklæbuklabuselbubarduulvikskjakklepprisørxn--nttery-byaeflåeidflahofmilgolholsellomskifetvikdepvgsfhsaskerrisorhamarasnesåsnesrørosrorosxn--slat-5namasoynaroyvaroyluroydyroyaskoyradoyandoyrodoymeloyradøyandøyrødøymeløyaskøylurøydyrøymåsøyværøynærøyhoylandethøylandetdivtasvuodnalørenskoglorenskognesoddtangenxn--tjme-hraxn--smla-hraxn--stjrdal-s1aunjargalillehammerunjárgaxn--hamary-fyadavvenjargaxn--bearalvhki-y4a123hjemmesidegjerdrumxn--brnnysund-m8acxn--tnsberg-q1axn--mlatvuopmi-s4axn--snsa-roaxn--skierv-utaxn--brum-voatysfjordkvafjordeidfjordkvæfjordsongdalenmjondalenmjøndalenxn--gls-elackragerogáŋgaviikagangaviikasørreisasorreisasør-varangersor-varangerxn--risr-iraskiervaxn--frna-woaxn--trna-woakvinesdalleksvikleirvikrøyrvikroyrviksvelvikvenneslaevje-og-hornnessandnessjøenmarnardalvindafjordsandefjordenebakksnillfjordullensvangxn--trany-yuabrønnøysundnamsskoganaustevollxn--stjrdalshalsen-sqbnord-aurdalnord-frontrøgstadtrogstadgrimstadflakstadgjerstadxn--sandy-yuaxn--leagaviika-52bnore-og-uvdalvegarsheixn--rlingen-mxaxn--ggaviika-8ya47hvegårsheikarlsoykvitsoymasfjordenhamaroyinderoyosteroydavvenjárgasauheradguovdageaidnuxn--vre-eiker-k8abronnoysiellakkrødsheradkrodsheradkvinnheradbrønnøyxn--mtta-vrjjat-k7afxn--lrenskog-54akvitsøyvárggátkarlsøyosterøyinderøyhamarøybronnoysundxn--aurskog-hland-jnbbahccavuotnabáhccavuotnagiehtavuoatnastor-elvdalmidtre-gauldalxn--gildeskl-g0akarasjokevenassixn--bievt-0qaxn--yer-znalebesbynessebyxn--hbmer-xqamalselvmålselvxn--unjrga-rtamøre-og-romsdalmore-og-romsdalhareidmelandørlandorlandstrandålgårdsolundalgardafjordåfjorddielddanuorrikautokeinoxn--stre-toten-zcbskodjeaejriestangeliernebamblestokkefauskesnåasesnaasekongsvingerlangevagberlevagxn--flor-jrahattfjelldalostre-totenøstre-totenvestfoldxn--mely-iraálaheadjualaheadjunordreisaxn--troms-zuaxn--lgrd-poacporsangerflatangerstavangerleikangerbremangersamnangergieldakarasjohkaxn--rdy-0nabfrostautsirasnoasatromsaxn--sr-aurdal-l8aflekkefjordjølsterjolsteraremarkhedmarknååmesjevuemienaamesjevuemiexn--vard-jrarollagmeråkermerakerorskogørskogxn--bdddj-mrabdákŋoluoktaxn--osyro-wuaaknoluoktatrysilskjervøymandaljondalbindalrindalmeldalsuldalorkdalsigdalalvdallærdalhurdalsirdalverdallerdallardaloppdalåseralaseralhadselkragerødivttasvuotnaoverhallasteinkjerxn--hnefoss-q1askedsmokorsettromsøxn--dyry-iravestre-totenmuseumxn--sandnessjen-ogbrahkkeravjufylkesbiblbájddarbajddarxn--laheadju-7yarennesøyxn--koluokta-7ya57hxn--hgebostad-g3aleirfjordstorfjordbalsfjordbåtsfjordbatsfjordmuosátbievátloabátkárášjohkanøtterøyxn--mjndalen-64anordkappláhppilahppialstahaugsiljanverranrøykenroykenhaldenlyngenbergenhortenhønefosshonefosstroandinbeiarnvarggatosoyroosøyrotromsoidrettmuosatbievatruovatloabatvoagattynsetnessetxn--indery-fyaskánitskanitraholtråholtxn--ystre-slidre-ujbandebusarpsborgbearduxn--karlsy-fyahordalandjorpelandjørpelanddeatnuringsakersør-odalsor-odalxn--slt-elabringerikeaudnedalnittedalnissedalhemsedalslattumsurnadalxn--blt-elabelverumstjørdalnaustdalhjartdalgjøvikfyresdalhasviknarviklarvikgjovikmalvikgamviklenvikporsgrunnstjordalengerdaldrobakdrøbakxn--msy-ula0hvestvagoyxn--vgan-qoaxn--ryken-vuaxn--lten-graxn--stfold-9xaxn--hpmir-xqaxn--lury-iramálatvuopmimalatvuopmitysværkirkenesbirkenesmoskenesbáidárxn--fjord-lraxn--rdal-poabahcavuotnabáhcavuotnaxn--frde-gralindåsbearalvahkixn--hobl-iraráhkkerávjuxn--loabt-0qavågåáltábodøsundlundraderådeetnetimeholeauregrueoddavagavegaranatanaarnasolasulaaltalekafusavangbergkvamåmliamlibokntinnroangranosenoslobodorøstroststatåmotamotivguprivøyeroyerliermossvossxn--nvuotna-hwalusterlunnermarkerhábmerhabmerhvalerfjalerxn--rholt-mratysvarbaidarfitjargaularhápmirhapmirmelhusfosnesøksnesoksnestysneshemnesevenesflesbergeidsbergtonsbergtønsberglindasxn--sndre-land-0cbnamsosxn--srum-graøystre-slidreoystre-slidrevestre-slidretrondheimbalestrandxn--langevg-jxaaustrheimxn--skjk-soavagsoyaveroysandoykarmoyfinnoytranoyvestbytranbysykkylvenxn--hyanger-q1aspjelkavikandasuoloxn--fl-ziaxn--drbak-wuastathellexn--sr-varanger-ggbtelemarkxn--bhcavuotna-s4axn--porsgu-sta26fčáhcesuolocahcesuoloakrehamnåkrehamnsandøykarmøyfinnøytranøyvågsøyaverøynamdalseidxn--lesund-huabadaddjaxn--vegrshei-c0axn--btsfjord-9zagildeskålporsanguxn--trgstad-r1anávuotnanavuotnahammerfestxn--sgne-graxn--brnny-wuacibestadharstadnarviikaevenáššivestnesgjemnessandnesagdenesrennesoyxn--avery-yuaxn--tysvr-vrabearalváhkikongsbergspydebergrandabergxn--andy-iradavvesiidaxn--krdsherad-m8aporsáŋgufredrikstadbjerkreimringeburennebuaurskog-holandnotteroyxn--vgsy-qoa0jxn--rmskog-byaskierváivelandbyglandfrolandaurlandforsandxn--bjddar-ptamidsundålesundalesundfetsundfarsundovre-eikerøvre-eikerakershusxn--moreke-juasørfoldøstfoldostfoldsorfoldhøyangerhoyangerlevangerorkangertanangerxn--vestvgy-ixa6olillesandulsteinxn--rennesy-v1agranvinskjervoyxn--klbu-woalavagisxn--h-2faxn--ryrvik-byakafjordkåfjordseljordfolkebiblxn--gjvik-wuajevnakerxn--kfjord-iuabudejjuxn--kranghke-b0axn--davvenjrga-y4axn--rland-uuaxn--ldingen-q1axn--mlselv-iuaxn--rady-iraxn--linds-prabrumunddalxn--ygarden-p1amo-i-ranaeidskogrømskogromskoghjelmelandxn--finny-yuaxn--sr-odal-q1axn--skjervy-v1aballangenkvanangenkvænangengratangenxn--hmmrfeasta-s4acvossevangensuohkanxn--rde-ulaxn--mli-tlaxn--ksnes-uuanordlandskanlandskånlandsortlandfuoiskuxn--rros-graxn--hcesuolo-7ya35bxn--eveni-0qa01gagaivuotnagáivuotnaxn--seral-lradrammenmodalenmosjoenjan-mayentorskensteigengloppenxn--snes-poamatta-varjjatxn--sr-fron-q1aomasvuotnajessheimbådåddjåxn--krager-gyaxn--kvfjord-nxaxn--asky-iraxn--snase-nraxn--bidr-5nacholtålenxn--vads-jraxn--jlster-byamosjøenxn--rst-0nastavernxn--ostery-fyaxn--oppegrd-ixaxn--sknit-yqaxn--risa-5naoppegårdskiptvetrendalenholtalenxn--mot-tlaxn--lhppi-xqaxn--holtlen-hxaxn--srreisa-q1akopervikxn--muost-0qaxn--bmlo-grahokksundkvalsundegersundxn--karmy-yuaullensakerxn--hylandet-54axn--kvitsy-fyaxn--bod-2nalangevågberlevågkristiansandxn--rsta-frahornindalstjørdalshalsenstjordalshalsensandnessjoenhámmárfeastaxn--lrdal-srasør-fronsor-fronnord-odalkristiansundmátta-várjjatvestvågøynesoddennotoddenbuskerudøygardenoygardensalangenlavangenralingenrælingenlodingenlødingenleaŋgaviikalaakesvuemieleangaviikauenorgexn--srfold-byaaskvollxn--rskog-uuaxn--nry-yla5gxn--vry-yla5ghammarfeastaxn--rhkkervju-01afxn--givuotna-8yakommunekrokstadelvanedre-eikerhagebostadhægebostadxn--berlevg-jxakviteseidxn--s-1faxn--l-1faxn--nmesjevuemie-tcbafuosskomoårekemoarekexn--lt-liacxn--jrpeland-54asvalbardoppegardholmestrandtvedestrandsogndalsokndalarendalsunndalfolldalxn--krjohka-hwab49jlyngdaletnedalnorddalsaltdalgausdalskedsmovaksdalgjesdalstordalxn--frya-hraaarbortedrangedalxn--smna-graaurskog-hølandxn--vg-yiabtjeldsundhaugesundlindesnesxn--mre-og-romsdal-qqbxn--dnna-gradyntmpheremerseineshacknetenterprisecloudmineaccomaorimāoriorgmilcriiwigennetschoolhealthkiwigovtgeekxn--mori-qsacloudnsparliamentcomedorgcompronetedugovmuseumwebsitekinservicebarsywebsitebuildereerobookheimdnsleapcelleero-stagetechcrscsslorigingohomecdbedeeeiemesecabgngilnlalplchfisiincnnoroptatitmtltruauhulumkdkukskjplvtrgrfrkrhrusesismycynzcznetinteduassoososcloudstgbetaaezaeuhkusjshatenadiarycdn77hoptozaptois-a-knightmyftpno-ipjpnddnssdpdnsspdnsbarsysweetpepperis-a-bruinsfanis-very-sweetservegameis-a-soxfanhomelinuxcdn77-secureservebbsmisconfusedwebredirectblogsitefreedesktopcouchpotatofriestoolforgeaccesscamis-lostreadmyblogsmall-webfedorapeopleserveftpis-a-celticsfanmywirepotagertwmailin-dslsellsyourhomeread-booksfreeddnscable-modemis-savednflfanufcfanmlbfanstuff-4-saleendoftheinternetin-vpnmy-firewallhomeftpis-localis-a-chefboldlygoingnowherewebhopselfipkicks-assroxatunkcamdvrfedoraprojectgotdnsdvrdnsdyndnspubtlspimientahomeunixdontexistfedorainfracloudwmflabsfspagesbmoattachmentsteckidsfamilydsdnsaliasdynaliasnow-dnscloudnsdoomdnsduckdnsblogdnshomednsroutingthecloudendofinternetdsmynasip-dynamicpoivronhttpbinmyfirewallis-very-evilmysecuritycamerais-a-linux-userwmcloudis-a-geektuxfamilyis-a-candidatedoesntexistis-very-badhobby-sitegame-hostaltervistais-foundis-a-patsfandnsdojohepforgepodzonedynservcollegefanis-very-goodfrom-meis-very-niceisa-geeknerdpolacmedsldingorgcomnomgobabonetedupleskaemhlxmyboxrockyprvcydeuxfleurspdnscodebergheyflowstatichostorgmilcomnomgobneteduorgcomeduiorgmilcomngonetedugovcloudns1337ngrokacorggogfamcomwebgobnetedugokgopgkpgovgosbizpasaugumicsopozpapuwmwsrprusiskwpspkppspkmpspokeoiawsawifoumsdnskokwpmuppuppsppiwwiwoowuzswkzoschrzpisdnwzmiuwwitdpssewsseumigugimoirmpinbwinbwiihupporzgwgriwupowwskrwioswuozstarostwokonsulattmpccopruszkowmyspreadshopostrodakartuzyopolegminamediaustkazgorajgoraolawailawalomzawloclradombytomjaworznotargilubinkoninzagantorunkutnokepnonakloczestsopotsanokturekplockslasksklepzarowlukowmedaidgdaorgmilrelcomnomatmgsmartneteduelkgovwawsossexbiztgorysejnytychypomorzeboleslawiechomesklepsdscloudunicloudzakopanelegnicarawa-mazbydgoszczswidnikkrasnikwloclawekbielawamragowograjeworealestatebeskidykaszubymalopolskaprzeworskswiebodzinlecznadfirmaszkolawarmiagdyniamiastakazimierz-dolnymalborkswidnicadlugolekaostrolekapodlasieelblagtravelsimplesitezachpomormielecszczecinnieruchomosciwalbrzychlezajsklublinbedzinpoznanwielunmielnooleckostarachowicedkontopowiatwroclawrybniksuwalkileborkslupskgdanskostrowwlkptarnobrzegtourismwegrowkrakowglogowyou2pilanysamailwrocinfoagroautobeepshopprivlapypiszlodzcfolksecommerce-shopmazurypulawyskoczowrzeszowpomorskiezgierzkaliszolkuszlowiczostrowiecsosnowiecmazowszewodzislawbialowiezazgorzeleckatowicepabianicejelenia-gorawolominkarpaczsieradznowarudaczeladzkonskowolaskierniewiceswinoujscieturystykabieszczadycieszynketrzynolsztynbialystokbabia-goraprochowicewarszawastalowa-wolapolkowicegorlicegliwiceponiatowalimanowalubartowaugustowkobierzyceopocznognieznoszczytnokolobrzegshoparenapodhalebielskoklodzkostargardatwithplayitownnamecoorgnetedugovacorgcomproestnetedugovbiznameislaprofinforechtngrokmedaaaacacpaenglawjurbarbarsykeeneticavocatacctcloudnsorgcomsecplonetedugov123paginaweborgcomnetintedugovnomepublidkinbarsygovx443cloudnsorgmilcomnetedugovcooporgmilcomschnetedugovnamecomcannetlibassoaemclantmcontstoreorgcomnomrecwwwbarsyfirminfoshopartsstackitmyddnswebspacelima-cityacincooxorgedugovbarsybrendlyhbvpsvpsspectrumlandinghostingacppmordoviamcprecbgorgmilcomspbnetintedumsknovgovbirrasmcdirmytismircloudvladimirnalchikadygeyamarinepyatigorskmyjinobashkiriaeurodirvladikavkazna4ugroznykustanaikalmykiacldmaildagestaniranbuildcloudcanvaliaravalwixdevelopmentappwritemigrationneedleverceldatabasestackitcodereplravendbonporterlovableaccoorgmilnetgovcoopmedorgcompubschnetedugovservicemecomygovorggovtvmedorgcomnetedugovinfoedgfacbmlonihkutwpsryxzbdtmacfhppmyspreadshopbrandpartiorgcomfhvpress123minsidaitcouldbeworlanbibkommunalforbundfhskiopsyskomvuxkomforbnaturbruksgymnloginlineorgcomnetedugovenscaledeuusentsurgebotdaorgmilcomnetgovnowteleporthashbangplatformlovablebarsyshopwarebasehoplixbarsyonlinemsf5gitappgitpagewawamscofigma-govcaffeinefigmacanvasoltstscwputerbarsysupportchatgptsquareomniweopensocialcpanelplaycodenotionnovecorewpsquaredpreviewjelecyonbyensrhtfastvpspieboxconvexjouwwebheyflowplatformshloginlinemadethissourcecraftclouderaorgorgcomartedugouvunivmeorgcomnetedugovsurveysstatichfheiyuxs4allprojectmyfastubervibehostapp-ionosdeployagentmecoorgcomschnetedugovbizcncostoreorgmilcomneteduembaixadaconsuladokiraranohoprincipesaotomeheliohobarsystorebaseshopwaresellfyaiabkhaziavologdamordoviapenzalenugsochinavoiexnetspbmsknovnorth-kazakhstanashgabadkareliaarmeniageorgiavladimirnalchikivanovobukharaadygeyakhakassiakalugakrasnodarjambylaktyubinsktroitskbryanskobninskkurganazerbaijanpokrovskbashkiriatselinogradvladikavkazmurmansktulatuvamangyshlaktashkentchimkentgroznykaragandatermezarkhangelskkustanaikalmykiabalashoveast-kazakhstankaracoldagestantogliattibarsyredorgcomgobedumirenknightpointaccoorgjelasticdiscoursecleverappsschacmiincogoornetonlineshopcogoorgmilcomwebnicnetintedugovbiznametestcoorgmilcomnomnetedugovorangecloudpersoindorgcomfinnatnetgovensmincomtourismintlinfox0611oyaorgmilcomnetedugovquickconnectvpnplusnettprequalifymeaddrmyaddrntdllwadlnctvavdrk12orgmilpolbeltelcomwebgennetedutskkepgovbbsbiznameinfocoorgmilcompronetedugovbiznameinfobetter-thanworse-thansakurafromdyndnson-the-webmymailerorgmilurlcomneteduidvgovmydnsgameclubebizmeneacsccogotvorhotelmilmobiinfovodteiflgplkmsmsbcckhincndnvncoztltmkckppzpdprvcvkvlvcrkrkscxuzchernovtsyrivneyaltaodesavolynrovnolutskltdinforgcomnetedugovbizvinnicazhitomirternopilpoltavakropyvnytskyizaporizhzhiasevastopolsebastopoluzhgoroduzhhorodkharkovkharkivvinnytsiakhmelnytskyizaporizhzhecrimeaodessazhytomyrnikolaevcherkassydonetskluganskluhanskkirovogradivano-frankivskchernivtsikrymkievkyivlvivsumyzakarpattiamykolaivcherkasychernigovkhersonchernihivdnipropetrovskdnepropetrovskkhmelnitskiyneacsccogoorusorgmilcomedugovmyspreadshopadimono-ipbarsybarsyonlinelayershiftnh-servretrosnubapicampaignservicelugaffinitylotteryweeklylotteryraffleentrygluglugsmeaccoindependent-inquestnimsitecopropymntltdorgplcschnetgovnhsbarsyindependent-commissionindependent-reviewpolicepublic-inquiryindependent-panelconnhospindependent-inquiryroyal-commissionoraclegovcloudappscck12libaws-govccphxcclibpvtparochchtrcck12libcceatonk12coglibtecgendstmusann-arborwashtenawcck12glghcck12sealibforksolympiabainbridge-islkeyporthoquiamyarrow-pointcentraliaport-townsendsequimport-ludlowrentonsilverdalebremertonredmondsheltonbellevueport-orchardport-angeleskingstonchehalisaberdeengig-harborseattlepoulsboidmdndsddemenegacalamaiavawapailalflnmdcncscohnhmihiviwiriinmntnmocoutvtctmtgunjokakwvnvprarorasmskstxwynykyazisadninsnngosrvis-bymircloudservernamepointtoenscaledland-4-salefreeddnsstuff-4-saleazure-apinoipdatabricksappscloudnsgolffanheliohostazurewebsitesgvorgmilcomgubneteducoorgcomnetd0egvorgmilcomnetedugovmydnsiacostoree12orgmilcomnomwebgobbibrectecnetintedugovraremprendefirminfoartseducok12orgcomnethidnsidacaiiosonlahanamhanoicamauhueorgcompronetintedugovbizbacninhtayninhhoabinhnamdinhtravinhhaiphongvinhlonghaiduongquangnamquangtrithuathienhuequangninhbacgianghaugiangquangbinhsoctrangbentrethanhphohochiminhdanangkontumhatinhkhanhhoathanhhoahealthgialailaocaiyenbaibackanngheanlonganphuyenphuthocanthodaklakdongnainameinfovinhphucdongthapkiengiangtiengiangquangngailaichaulangsonlamdongdaknonghagiangangiangcaobangbinhduongninhthuanbinhthuanbaclieuthaibinhninhbinhbinhdinhtuyenquanghungyenbaria-vungtauthainguyendienbienbinhphuocschbizputerimagine-proxyorgcomnetedugovcloud66advisormypetsdyndnsxn--8dbq2axn--4dbgdty6cxn--5dbhl8dxn--hebda8bxn--80auxn--d1atxn--c1avgxn--o1acxn--o1achxn--90azhxn--55qx5dxn--uc0atvxn--od0algxn--wcvs22dxn--gmqw5axn--mxtq1mxn--12c1fe0brxn--h3cuzk1dixn--12co0c3b4evaxn--12cfi8ixb8lxn--o3cyx2axn--m3ch0j3axn--j1adpxn--90amcxn--90a1afxn--h1ahnxn--j1ael8bxn--h1alizxn--c1avgxn--j1aefxn--80aaa0cvacxn--41acaffeineexeopentunnelbotdashtelebitorgtmaccoagricorgmilnomwebnicngonetaltedugovlawnisschoolgrondaraccoorgmilcomschnetedugovbizinfoprg1-zeropstritonstackitlimazeropsaccoorgmilgovяспборгкоммскбизмирсамаракрымсочиакодпроргобрупрצהלממשלישובאקדמיהองค์กรธุรกิจรัฐบาลศึกษาทหารเน็ต教育網絡組織公司政府個人닷넷한국澳门新闻澳門联通家電嘉里招聘通販닷컴삼성コムგეбгрфеюadcdbdgdidmdsdtdaebedeeegeiejekemenepereseveyegabacalamanauavapaqasazacfbfafgfnfpfwftfbgcgagggegkgngmgsgpgvgtgugilmlnlalclglplsltlhmimjmkmmmomambmcmdmfmgmzmpmsmtmgbbblbsbecccacnclcmcvctcscmhkhghchbhthphshlinikifigiaibicivisikninhnmncnbngnsnpnvntnjoionomobocoaofodorosotoptstttytatbtetgtithtmtltrusuvuaucueuguhulumunufjdjbjtjsjlkmkhkfkdkcktkukskpkgpmpnpkpjpgqaqmqiqsvtvcvbvmvlvrwpwtwzwbwcwawgwkwmwtrsrprgrfrercrbrarnrmrlrkrirhrwsusrssspsgsesbsaslsmsissxmxaxcxuypysylymykygybycyuztzsznzmzkzdzczbzazελευ世界台灣购物公益点看臺灣网络書籍在线网站手机机构大拿游戏信息台湾谷歌慈善商标香港中国餐厅网址中國商城食品微博政务移动集团公司八卦商店健康网店政府时尚佛山中信娱乐广东企业homedepotengineeringاماراتrepublicankuokgroupversicherungchannelcitadelxn--pgbs0dhxn--b4w605ferdstatebankwebsitexn--mgb9awbf亚马逊淡马锡alibabaxn--ngbc5azdxn--mgbbh1axn--45br5cyltoshibabuildworldcloudtradeguideplacespacedancemoviephoneprimesmilebiblestyleappleazurestoreskypegripexn--l1accdrivelottehorsehouseleasechasereisestadahondaomegaaetnaamicaninjanokiamediadeltavodkaedekaosakapizzaslingemailgmailtirolshelltmallfinallegaltotalhotelamfamforumrehabmusicciticricohcoachwatchboschearthfaithirishmiamiarchidubaiguccipraxiみんなストアセールcanonsalononionnikonepsonkoelngreensevencrownikanoradioaudioweiboglobopromogalloyahoociscorodeovideomangobingotokyovolvolottokyotophotosmartsportquesttrusthyattjetztadultcymrubaidutushuxn--kprw13dubankclickblackmerckgroupsharpcheapnowtvxn--h2brj9cקוםհայоргсрбмонкомбелмкдқазрусукрمصرقطرعربكومdadcfdmedwedredphdthdbidpidkrdmsdltdiceonewmeglemoerwecfageacbanbambaaaammakianraspacpaaxawtfbcgaegongingaigvigorgdogdhlmilrilonlaolloluoljllcalgalnflafltelsrlfrllplkimibmcamcombommomifmabbjcbscbwebcabnabtabmlbpubabcbbcnecincpncllcstcwtcpwcnyckfhbzhovhmoiskiobisbitcifyituipinvinwinxincbnbcnmanfangdnmenrenkpnmtnyunrunfununobiojioriohbogmofooboooooacoecoceongoproartistottnttbbtcateatlatvetpetbetnethktmitfitintjothotgotdotbotprueduicujnjyouinknhktdkappsapgapmapdnptopgopllpjmpzipvipripesqtrvdtvitvdevmovgovhivnrwlawsewnewbmwwownowhowdvrftrmtrsfrbarcartvscrseusawsupsubssbsadsddsldssasbmsmlsxxxboxfoxgmxtjxsextaxbuyflydiysoyjoyskypaydaygayxyzanzbizwebersenerpokerlameractortatarsolarລາວคอมไทยtourslocusnexuslexusgiftsbeatsboatspartspressglassswissकॉमनेटtiresgivescodeshomesgamestunesshoescardswalesloansvegastoolsdealsautosparisファッションworkssucksrocksxeroxforexfedexpartylillymoneystudyrugbytoraytoday中文网xn--unup4y天主教飞利浦新加坡enterprises我爱你嘉里大酒店christmasxn--fct429kholdingsxn--8y0a063axn--mgbx4cd0ablifestyleabogadoallstatenetbankكاثوليكxn--s9brj9cxn--gk3at1ebestbuycharityxn--55qx5dmicrosoftpropertybasketballhomegoodscorsicajewelrygallerygrocerysurgerycountrybrusselsverisignferreroxn--czr694bhdfcbankcommbanksoftbankپاكستانپاکستانnextdirectالسعوديهالعليانxn--h2brj9c8cxn--80adxhksshikshaxn--mgbai9azgqp6jcuisinellabarclayscatholicxn--kpry57dcompanyxn--xhq521bblackfridayxn--mgba3a3ejtsandvikxn--d1acj3bacademydownloadمليسياxn--j1amhxn--w4r85el8fhu5dnraipirangaathletaxn--fhbeixn--mgbqly7cvafrzuerichxn--c2br7gஇலங்கைcontractorsxn--io0a7igraphicsinsurancetemasekxn--xkc2al3hye2amotorcyclesphotographydirectoryplumbingxn--vhquvclothingtrainingcleaningwilliamhilllightingxn--mgba3a4f16ashoppingcateringeducationokinawapicturesventuresproductionsxn--9et52uwalmartഭാരതംsupportrealestatecapitalonexn--nqv7fs00emaauspostfloristdentistxn--qxamgodaddybradescobargainsmitsubishikerryhotelsxn--9dbq2axn--3pxu8kimmobilienxn--fjq720axn--mgbtx2bholidaymckinseymadridbusinessbuildershelsinkixn--4gbrimмоскваالسعودیةcoffeedegreelacaixapartnersalsaceofficeabbvievoyageorangegeorgeonlinechromemobilekindlegoogleoraclecircleschulesecureinsurexn--mgba7c0bbn0aestatexn--mgbc0a9azcgcruisehangoutxn--vuq861bxn--42c2d9arexrothfirestoneuniversityxn--nnx388alifeinsuranceextraspaceонлайнvermögensberatersoftwarexn--fiqs8sxn--mgbab2bdxn--w4rs40ltiendaभारतम्africatoyotaotsukasakuracameracreditcardnagoyaconsultingnetworkjunipertheatermonsterprogressivepioneerxn--55qw42gracingdatingvotingvikinglivinggivingxn--bck1b9a5dre4cbrotherweatherjoburgفلسطينlplfinancialxn--clchc0ea0b2g2a9gcdfutbolschoolsocialglobaldentalwoodsidechanelairtelmatteltravelrealtorwebcamstreamభారత్unicomalstomxn--nodexn--6frz82gmuseumfurniturexn--rvc1e0am3exn--mix891faccenturexn--11b4c3dismailineustardiscountquebeccomsecclinicservicesxn--y9a3aqxn--c1avgswatchchurchsearchالاردنmarketingcontacthealthmonashshoujisanofitaipeiamericanexpresssuzukiアマゾンクラウドポイントbhartiグーグルxn--mgberp4a5d4armemorialxn--1qqw23alondonmormoninstitutevisionbostonnortoncouponmaisonamazonvirginberlindesigndurbanolayannissananquanxihuanhitachikaufengardenreisenbayerntechnologydatsunxn--90a3aclatinocasinostudiophysioxn--ngbe9e0apharmacytattootaobaoaramcoexpertreportabbottdirectselectimamatfairwindspictettargetmarketintuittravelersinsurancecreditdupontryukyusuppliesxn--tckwebnpparibasschmidtmerckmsdyodobashirestaurantbridgestonecricketxn--fpcrj9c3dbostikbroadwayattorneylefrakemerckxn--fiq228c5hscareersfarmerswinnersflowersxn--wgbh1cguitarsxn--54b7fta0ccxn--p1acfmakeupgalluplandroverxn--kcrx77d1x4agoldpointbauhausxn--mgbayh7gpahiphopplaystationxn--mgba3a4fraxn--eckvdtc9dhyundaixn--gckr3f0fistanbulticketsmarketsflightschintaireviewsxn--3e0b707ewindowsxn--fiqz9sfinancialxn--fzys8d69uvgmابوظبيdiscoverreviewবাংলাxn--5su34j936bgsgmoscowobserverapartmentsдетиارامكوсайтeurovisionxn--i1b6b1a6a2exn--xkc2dl3a5ee0hتونسموقعبارتڀارتشبكةعمانبيتكعراقreadkredbondlandbandfundfoodprodgoldfordtubecafesafelifeggeeieeefreefagepagegugezonewinememenamegamesaleablebikenikelikecarecbreherefiresaveloveliveblueartedatesitevotecaseluxebofamodaltdaasdatiaayogasinavanashiaasiajavabbvatevavivadatazaraarpacasavisasncfprofmaifsurfgolfdvagsongbingpingwangkpmggoogblogpohlfailcooldellcalldeallidlsarlfilmteamroomfarmimdbarabclubhdfcicbchsbcgmbhrichtechfishdishcashminiernikddiaudiwikimobitaxicitikiwidesiqponskinloanakdnwienopenporncerntownimmolimoolloinfonicofidolegosaxozeroaerovivoautovotomotofastbestresthostpostnextlgbtchatseatgiftmeetdietreitmintrentgentspotscotguruitausohumenucyoubanklinkpinkdclktalksilkbookseekworkrsvpaarpjeepshopcoophelpcamppccwshowbeerstarruhrflirweirhaircarsparsjprshausplusnewstipstoysjobskidsfanspicsdocsxboxamexsexynavycitysonyarmyallybabyplaydeliverybuzzgbizlamborghiniphilipsලංකාಭಾರತfitnessexpresslanxesspfizercenterwalterlawyersoccercareerkosherbrokerlockerdealerdoctorauthorxn--mgbqly7c0a67fbcvermögensberatungjaguarxn--pssy2uxn--hxt814eflickrrepairrogersairbusxn--mgbai9a5eva00beventsyachtsxn--t60b56aভাৰতভারতभारतभारोतviajeshermeshughesxn--j1aefसंगठनvillasଭାରତclaimshotelsભારતzapposphotosjuegoscondostatamotorsgratistennisਭਾਰਤtkmaxxtjmaxxschaeffleryandexxn--80aswgrealtysafetybeautyluxuryxn--3ds443gsupplyfamilyxn--o3cw4hhockeysydneyxn--90aenissayalipayenergycomputeragencyxn--rovu88b電訊盈科xn--gecrj9cstatefarmaccountantaquarelleolayangroup香格里拉xn--p1ai组织机构xn--1ck2e1bxn--mgbt3dhdschwarzموريتانياabudhabinowruzkomatsufujitsuhospitalxn--80asehdbxn--mgbtf8flxn--j6w193gxn--yfro4i67oprudentialxn--flw351ecruisescoursesrecipesxn--e1a4cferrarixn--ses554gxn--wgbl6awatchesstaplessinglesxn--mgbcpq6gpa1axn--otu796dpropertiescreditunionxn--mgbah1a3hjkrdstockholmhisamitsuالسعوديةstcgroupdomainsoriginscouponsbloombergclubmedfroganslimitedxn--80aqecdr1aexposedinternationalequipmentbarclaycardxn--q7ce6axn--mgbi4ecexpprotectionassociatesconstructionxn--cck2b3bxn--45q11candroidfoundationישראלxn--mgbca7dzdocliniqueboutiqueengineerxn--qxa6asystemsfirmdalefashionauctionxn--nqv7finfinitirentalsreliancetradingweddingfishinghostinggentingbookingcookingxn--3hcrj9cgraingerxn--czrs0tdemocratsamsungyokohamaxn--h2breg3evexn--nyqy26alundbeckmelbournevacationssolutionsfrontierxn--vermgensberatung-pwbmanagementxn--cg4bkixn--mgb2ddeslincolnhamburgsandvikcoromantblockbusterairforcebarefootxn--4dbrk0ceinvestmentsfeedbackcommunityxn--ngbrxالبحرينdiamondsamsterdamhealthcareredumbrellaxn--mxtq1mxn--2scrj9cagakhanxn--mgbpl2fhкатоликcaravanசிங்கப்பூர்richardlimortgageamericanfamilyxn--fzc2c9e2cscholarshipssaarlandxn--imr513nvlaanderensamsclubgoodyearkitchenஇந்தியாweatherchannelallfinanzxn--kput3iالسعودیۃxn--90aisxn--efvy88hالجزائرxn--mgbaam7a8hexchangejpmorganxn--tiq49xqyjfidelitysecurityxn--mk1bu44cwanggouxn--fiq64bxn--6qq986b3xlxn--mgbbh1a71exn--80ao21amarshallsxn--5tzm5gtravelerspanasoniclatrobeyoutubeaccountantsxn--rhqv96gxn--cckwcxetdanalyticsxn--ygbi2ammxبازاربھارتسوريةorganicfreseniusسورياxn--9krt00axn--qcka1pmcxn--jlq480n2rgdeloittesciencefinancexn--jvr189mxn--30rr7yhomesensehotmailbaseballfootballleclercboehringerxn--q9jyb4cxn--mix082fاليمنهمراهpolitieسودانايرانایرانnetflixyamaxunxn--lgbbat1ad8jcollegestoragecapetowncolognekerrypropertiesxn--mgbgu82axn--ogbpf8flxn--czru2dwhoswhociprianilasallexn--g2xx48cforsalebanamexaudiblexn--vermgensberater-ctbxn--zfr164bericssonvanguardxn--45brj9cindustriestheatremarriottxn--3bst00mcomparexn--mgberp4a5d4a87gcapitaldigitalالمغربbarcelonashangrilaxn--d1alfcalvinkleinwwwcitysapporokawasakinagoyasendaikobekitakyushuyokohamackjp\";\nexport const rulesRoot = 624;\nexport const exceptionsRoot = 628;\n","// NOTE: kept (intentionally) near-identical to packages/tldts-icann/src/suffix-trie.ts.\n// They are separate copies rather than a shared helper because the lookup is\n// only fast when the typed arrays are module-scope monomorphic globals —\n// closing over them (a shared factory) measured ~20% slower. The ICANN build\n// also specializes (constant mask, no isIcann/isPrivate). Keep the two in sync.\nimport {\n fastPathLookup,\n IPublicSuffix,\n ISuffixLookupOptions,\n} from 'tldts-core';\nimport {\n edgeChild,\n edgeLength,\n edgeStart,\n exceptionsRoot,\n labelText,\n nodeFlags,\n rulesRoot,\n} from './data/trie';\n\nconst enum RULE_TYPE {\n ICANN = 1,\n PRIVATE = 2,\n}\n\n// `edgeOffset` (where each label starts in `labelText`), `edgeHash` (djb2 of\n// each label) and `wildcardEdge` (each node's '*' edge, or -1) are derived once\n// at load instead of being shipped: the bundle then carries only the\n// compressible `labelText` + structure, while the lookup binary-searches\n// integer hashes. The cost is a single ~1ms pass at first import — cheaper than\n// the object trie it replaces. Kept at module scope (not captured in a closure)\n// so V8 treats the typed arrays as fast monomorphic globals.\nconst numberOfNodes = nodeFlags.length;\nconst numberOfEdges = edgeLength.length;\nconst edgeOffset = new Uint32Array(numberOfEdges);\nconst edgeHash = new Uint32Array(numberOfEdges);\nconst wildcardEdge = new Int32Array(numberOfNodes).fill(-1);\nfor (let node = 0, offset = 0; node < numberOfNodes; node += 1) {\n for (let edge = edgeStart[node]!; edge < edgeStart[node + 1]!; edge += 1) {\n edgeOffset[edge] = offset;\n const end = offset + edgeLength[edge]!;\n let hash = 5381;\n for (let i = end - 1; i >= offset; i -= 1) {\n hash = (hash * 33) ^ labelText.charCodeAt(i);\n }\n edgeHash[edge] = hash >>> 0;\n if (\n edgeLength[edge] === 1 &&\n labelText.charCodeAt(offset) === 42 /* '*' */\n ) {\n wildcardEdge[node] = edge;\n }\n offset = end;\n }\n}\n\n// Result of the last `walk`, kept in module scope to avoid allocating a match\n// object. Safe because lookups are synchronous and read right after `walk`.\nlet matchNode = -1;\nlet matchStart = 0;\nlet matchEnd = 0;\n\n/**\n * True if edge `edge`'s label equals `hostname[start, start + length)`.\n */\nfunction labelEquals(\n edge: number,\n hostname: string,\n start: number,\n length: number,\n): boolean {\n if (edgeLength[edge] !== length) {\n return false;\n }\n const offset = edgeOffset[edge]!;\n for (let i = 0; i < length; i += 1) {\n if (labelText.charCodeAt(offset + i) !== hostname.charCodeAt(start + i)) {\n return false;\n }\n }\n return true;\n}\n\n/**\n * Find the child edge of `node` whose label is `hostname[start, start + length)`.\n * Edges are sorted by hash, so binary-search the hash then verify the label\n * (scanning the rare run of equal hashes). Returns the edge index or -1.\n */\nfunction findEdge(\n node: number,\n hash: number,\n hostname: string,\n start: number,\n length: number,\n): number {\n let lo = edgeStart[node]!;\n let hi = edgeStart[node + 1]!;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n const value = edgeHash[mid]!;\n if (value < hash) {\n lo = mid + 1;\n } else if (value > hash) {\n hi = mid;\n } else {\n for (let e = mid; e >= lo && edgeHash[e] === hash; e -= 1) {\n if (labelEquals(e, hostname, start, length)) return e;\n }\n for (let e = mid + 1; e < hi && edgeHash[e] === hash; e += 1) {\n if (labelEquals(e, hostname, start, length)) return e;\n }\n return -1;\n }\n }\n return -1;\n}\n\n/**\n * Walk `hostname`'s labels right-to-left from `root`, recording the deepest\n * node whose flag passes `allowedMask` (with the label boundaries of that match\n * in `matchStart`/`matchEnd`). Returns whether any match was found.\n */\nfunction walk(hostname: string, root: number, allowedMask: number): boolean {\n let node = root;\n let end = hostname.length;\n let hash = 5381;\n matchNode = -1;\n for (let i = hostname.length - 1; i >= 0; i -= 1) {\n const code = hostname.charCodeAt(i);\n if (code === 46 /* '.' */) {\n const start = i + 1;\n let edge = findEdge(node, hash >>> 0, hostname, start, end - start);\n if (edge === -1) {\n edge = wildcardEdge[node]!;\n }\n if (edge === -1) {\n return matchNode !== -1;\n }\n node = edgeChild[edge]!;\n if ((nodeFlags[node]! & allowedMask) !== 0) {\n matchNode = node;\n matchStart = start;\n matchEnd = end;\n }\n end = i;\n hash = 5381;\n } else {\n hash = (hash * 33) ^ code;\n }\n }\n\n // Left-most label: hostname[0, end). Same find/descend/record as the loop —\n // duplicated rather than folded into the loop (via `i >= -1`) because that\n // extra per-character branch measured slightly slower on the hot path.\n let edge = findEdge(node, hash >>> 0, hostname, 0, end);\n if (edge === -1) {\n edge = wildcardEdge[node]!;\n }\n if (edge !== -1) {\n node = edgeChild[edge]!;\n if ((nodeFlags[node]! & allowedMask) !== 0) {\n matchNode = node;\n matchStart = 0;\n matchEnd = end;\n }\n }\n return matchNode !== -1;\n}\n\n/**\n * Check if `hostname` has a valid public suffix in the trie.\n */\nexport default function suffixLookup(\n hostname: string,\n options: ISuffixLookupOptions,\n out: IPublicSuffix,\n): void {\n if (fastPathLookup(hostname, options, out)) {\n return;\n }\n\n const allowedMask =\n (options.allowPrivateDomains ? RULE_TYPE.PRIVATE : 0) |\n (options.allowIcannDomains ? RULE_TYPE.ICANN : 0);\n\n // Exceptions have priority and strip their own left-most label (e.g. the\n // rule '!www.ck' makes the suffix of 'www.ck' be 'ck').\n if (walk(hostname, exceptionsRoot, allowedMask)) {\n out.isIcann = (nodeFlags[matchNode]! & RULE_TYPE.ICANN) !== 0;\n out.isPrivate = (nodeFlags[matchNode]! & RULE_TYPE.PRIVATE) !== 0;\n out.publicSuffix = hostname.slice(matchEnd + 1);\n return;\n }\n\n if (walk(hostname, rulesRoot, allowedMask)) {\n out.isIcann = (nodeFlags[matchNode]! & RULE_TYPE.ICANN) !== 0;\n out.isPrivate = (nodeFlags[matchNode]! & RULE_TYPE.PRIVATE) !== 0;\n out.publicSuffix = hostname.slice(matchStart);\n return;\n }\n\n // No match: the prevailing '*' rule makes the right-most label the suffix.\n out.isIcann = false;\n out.isPrivate = false;\n const lastDot = hostname.lastIndexOf('.');\n out.publicSuffix = lastDot === -1 ? hostname : hostname.slice(lastDot + 1);\n}\n","import {\n FLAG,\n getEmptyResult,\n IOptions,\n IResult,\n parseImpl,\n resetResult,\n} from 'tldts-core';\n\nimport suffixLookup from './src/suffix-trie';\n\n// For all methods but 'parse', it does not make sense to allocate an object\n// every single time to only return the value of a specific attribute. To avoid\n// this un-necessary allocation, we use a global object which is re-used.\nconst RESULT: IResult = getEmptyResult();\n\nexport function parse(url: string, options?: Partial<IOptions>): IResult {\n return parseImpl(url, FLAG.ALL, suffixLookup, options, getEmptyResult());\n}\n\nexport function getHostname(\n url: string,\n options?: Partial<IOptions>,\n): string | null {\n /*@__INLINE__*/ resetResult(RESULT);\n return parseImpl(url, FLAG.HOSTNAME, suffixLookup, options, RESULT).hostname;\n}\n\nexport function getPublicSuffix(\n url: string,\n options?: Partial<IOptions>,\n): string | null {\n /*@__INLINE__*/ resetResult(RESULT);\n return parseImpl(url, FLAG.PUBLIC_SUFFIX, suffixLookup, options, RESULT)\n .publicSuffix;\n}\n\nexport function getDomain(\n url: string,\n options?: Partial<IOptions>,\n): string | null {\n /*@__INLINE__*/ resetResult(RESULT);\n return parseImpl(url, FLAG.DOMAIN, suffixLookup, options, RESULT).domain;\n}\n\nexport function getFullDomain(\n url: string,\n options?: Partial<IOptions>,\n): string | null {\n /*@__INLINE__*/ resetResult(RESULT);\n const result = parseImpl(url, FLAG.DOMAIN, suffixLookup, options, RESULT);\n // The hostname *is* the full domain (subdomain + domain) whenever a\n // registrable domain exists; gate on `domain` so non-registrable inputs\n // (IPs, suffix-less or invalid hostnames) return `null` like `getDomain`.\n return result.domain === null ? null : result.hostname;\n}\n\nexport function getSubdomain(\n url: string,\n options?: Partial<IOptions>,\n): string | null {\n /*@__INLINE__*/ resetResult(RESULT);\n return parseImpl(url, FLAG.SUB_DOMAIN, suffixLookup, options, RESULT)\n .subdomain;\n}\n\nexport function getDomainWithoutSuffix(\n url: string,\n options?: Partial<IOptions>,\n): string | null {\n /*@__INLINE__*/ resetResult(RESULT);\n return parseImpl(url, FLAG.ALL, suffixLookup, options, RESULT)\n .domainWithoutSuffix;\n}\n","/**\n * What a Google Ads criterion targets or excludes — one shape for every place a criterion lives.\n *\n * A criterion is the same thing wherever it sits: a placement is `{ placement: { url } }` on a\n * campaign, an ad group, the account's exclusions and a placement exclusion list alike. So the spec\n * (`CriterionSpec`) and the one function that turns it into Google's oneof (`buildCriterion`) are\n * shared by every op that carries one — campaign criteria, ad-group criteria, account exclusions,\n * list members, audience attaches and (6h) asset-group signals — and so is the table of where each\n * type may go.\n *\n * Where a type may go is two tables, both what Google ANSWERED rather than what its docs imply:\n *\n * - `CRITERION_PLACEMENTS` — the shape of the API itself. Google's CampaignCriterion has no\n * `audience` field, AdGroupCriterion has no `proximity` / `ipBlock` / `device`…, so those pairs are\n * refused by the schema whatever the campaign.\n * - `CRITERIA_BY_CHANNEL` — what each campaign type accepts at each level, probed validate-only on\n * v25 against 3865083115 (2026-10-09): every type × campaign / ad group × target / exclude on a\n * Search (with a dynamic ad group), Display, Demand Gen, Performance Max and Shopping campaign.\n * Checked at stage time, once the campaign's type is known. A channel with no row (App, Travel,\n * Hotel, Video) refuses nothing: publish is the backstop there, like the bidding matrix.\n */\nimport { parse as parseHost } from \"tldts\";\nimport { z } from \"zod\";\nimport { GEO_TARGET_COUNTRIES, LANGUAGE_CONSTANTS } from \"./geo-constants\";\nimport {\n DAYS_OF_WEEK,\n DEVICE_TYPES,\n GEO_TARGET_CONSTANT_REGEX,\n GOOGLE_ADS_LIMITS,\n type GoogleSharedSetType,\n LANGUAGE_CONSTANT_REGEX,\n NUMERIC_ID_REGEX,\n RESOURCE_NAME_REGEX,\n TEMP_REF_REGEX,\n} from \"./limits\";\nimport type { GoogleDraftEntity } from \"./ops\";\n\n// --- Enums ---\n\nexport const AGE_RANGES = [\n \"AGE_RANGE_18_24\",\n \"AGE_RANGE_25_34\",\n \"AGE_RANGE_35_44\",\n \"AGE_RANGE_45_54\",\n \"AGE_RANGE_55_64\",\n \"AGE_RANGE_65_UP\",\n \"AGE_RANGE_UNDETERMINED\",\n] as const;\nexport const GENDERS = [\"MALE\", \"FEMALE\", \"UNDETERMINED\"] as const;\nexport const PARENTAL_STATUSES = [\"PARENT\", \"NOT_A_PARENT\", \"UNDETERMINED\"] as const;\nexport const INCOME_RANGES = [\n \"INCOME_RANGE_0_50\",\n \"INCOME_RANGE_50_60\",\n \"INCOME_RANGE_60_70\",\n \"INCOME_RANGE_70_80\",\n \"INCOME_RANGE_80_90\",\n \"INCOME_RANGE_90_UP\",\n \"INCOME_RANGE_UNDETERMINED\",\n] as const;\nconst BRAND_SUITABILITY_LABELS = [\n \"BRAND_SUITABILITY_CONTENT_FOR_FAMILIES\",\n \"BRAND_SUITABILITY_GAMES_FIGHTING\",\n \"BRAND_SUITABILITY_GAMES_MATURE\",\n \"BRAND_SUITABILITY_HEALTH_SENSITIVE\",\n \"BRAND_SUITABILITY_HEALTH_SOURCE_UNDETERMINED\",\n \"BRAND_SUITABILITY_NEWS_RECENT\",\n \"BRAND_SUITABILITY_NEWS_SENSITIVE\",\n \"BRAND_SUITABILITY_NEWS_SOURCE_NOT_FEATURED\",\n \"BRAND_SUITABILITY_POLITICS\",\n \"BRAND_SUITABILITY_RELIGION\",\n] as const;\n/** Google's `ContentLabelType` values an exclusion can name (v25). */\nexport const CONTENT_LABELS = [\n \"SEXUALLY_SUGGESTIVE\",\n \"BELOW_THE_FOLD\",\n \"PARKED_DOMAIN\",\n \"JUVENILE\",\n \"PROFANITY\",\n \"TRAGEDY\",\n \"VIDEO\",\n \"VIDEO_RATING_DV_G\",\n \"VIDEO_RATING_DV_PG\",\n \"VIDEO_RATING_DV_T\",\n \"VIDEO_RATING_DV_MA\",\n \"VIDEO_NOT_YET_RATED\",\n \"EMBEDDED_VIDEO\",\n \"LIVE_STREAMING_VIDEO\",\n \"SOCIAL_ISSUES\",\n ...BRAND_SUITABILITY_LABELS,\n] as const;\n/** Account-wide only: a campaign answers CANNOT_EXCLUDE_CRITERION (probed v25). */\nconst ACCOUNT_ONLY_CONTENT_LABELS: ReadonlySet<string> = new Set(BRAND_SUITABILITY_LABELS);\n/** Campaign only: the account answers CANNOT_EXCLUDE_CRITERION. */\nconst CAMPAIGN_ONLY_CONTENT_LABELS: ReadonlySet<string> = new Set([\"VIDEO\"]);\nexport const PROXIMITY_RADIUS_UNITS = [\"KILOMETERS\", \"MILES\"] as const;\nexport const WEBPAGE_OPERANDS = [\"URL\", \"CATEGORY\", \"PAGE_TITLE\", \"PAGE_CONTENT\", \"CUSTOM_LABEL\"] as const;\nexport const WEBPAGE_OPERATORS = [\"EQUALS\", \"CONTAINS\"] as const;\nconst SCHEDULE_MINUTES = [\"ZERO\", \"FIFTEEN\", \"THIRTY\", \"FORTY_FIVE\"] as const;\nconst MINUTE_DIGITS: Record<(typeof SCHEDULE_MINUTES)[number], string> = {\n ZERO: \"00\",\n FIFTEEN: \"15\",\n THIRTY: \"30\",\n FORTY_FIVE: \"45\",\n};\n\n// --- Primitives ---\n\nconst refSchema = z.union([\n z.string().regex(RESOURCE_NAME_REGEX, \"expected a customers/…/…/… resource name\"),\n z.string().regex(NUMERIC_ID_REGEX, \"expected a numeric id\"),\n z.string().regex(TEMP_REF_REGEX, \"expected a g_temp_* reference\"),\n]);\n/** A reference that must already exist in the account — nothing in a draft can create it. */\nconst existingRefSchema = z.union([\n z.string().regex(RESOURCE_NAME_REGEX, \"expected a customers/…/…/… resource name\"),\n z.string().regex(NUMERIC_ID_REGEX, \"expected a numeric id\"),\n]);\n/** A global constant (`topicConstants/5` or `5`). */\nfunction constantSchema(collection: string) {\n return z.union([z.string().regex(new RegExp(`^${collection}/\\\\d+$`)), z.string().regex(NUMERIC_ID_REGEX)]);\n}\n\n/**\n * Google's `bid_modifier`: \"The modifier must be in the range 0.1 - 10.0. Use 0 to opt out of a\n * Device type.\" So 0 (stop serving on it) and 0.1–10.0 are valid; the (0, 0.1) gap is not.\n */\nexport const bidModifierSchema = z\n .number()\n .min(0)\n .max(10)\n .refine((v) => v === 0 || v >= 0.1, {\n message: \"bid modifier must be 0 (exclude the device) or between 0.1 and 10.0\",\n });\n\n/** Google takes a placement only on a host under a real public suffix (`spam.example`, `localhost` are refused). */\nfunction isPlacementSite(url: string): boolean {\n const host = parseHost(url);\n return !/\\s/.test(url) && host.isIcann === true && host.domain !== null;\n}\n\n// --- The spec union ---\n\n/** Every criterion but a device: 0 opts a device out and is refused on anything else. */\nexport const criterionBidModifierSchema = z\n .number()\n .min(0.1, \"bid modifier must be between 0.1 and 10.0 — only a device takes 0\")\n .max(10);\n\nconst bid = { bidModifier: criterionBidModifierSchema.optional() };\nconst deviceBid = { bidModifier: bidModifierSchema.optional() };\n\nconst criterionSchemas = [\n z.strictObject({\n criterionType: z.literal(\"location\"),\n geoTargetConstant: z.union([z.string().regex(GEO_TARGET_CONSTANT_REGEX), z.string().regex(NUMERIC_ID_REGEX)]),\n ...bid,\n }),\n z.strictObject({\n criterionType: z.literal(\"language\"),\n languageConstant: z.union([z.string().regex(LANGUAGE_CONSTANT_REGEX), z.string().regex(NUMERIC_ID_REGEX)]),\n }),\n z.strictObject({\n criterionType: z.literal(\"adSchedule\"),\n dayOfWeek: z.enum(DAYS_OF_WEEK),\n startHour: z.number().int().min(0).max(23),\n startMinute: z.enum(SCHEDULE_MINUTES).default(\"ZERO\"),\n endHour: z.number().int().min(0).max(24),\n endMinute: z.enum(SCHEDULE_MINUTES).default(\"ZERO\"),\n ...bid,\n }),\n z.strictObject({ criterionType: z.literal(\"device\"), device: z.enum(DEVICE_TYPES), ...deviceBid }),\n /** A radius around a point (latitude/longitude in degrees) or around an address. */\n z.strictObject({\n criterionType: z.literal(\"proximity\"),\n latitude: z.number().min(-90).max(90).optional(),\n longitude: z.number().min(-180).max(180).optional(),\n address: z\n .strictObject({\n streetAddress: z.string().min(1).optional(),\n cityName: z.string().min(1).optional(),\n postalCode: z.string().min(1).optional(),\n countryCode: z.string().length(2),\n })\n .optional(),\n radius: z.number().positive(),\n radiusUnits: z.enum(PROXIMITY_RADIUS_UNITS),\n ...bid,\n }),\n /** A website, app or YouTube page the ads show on (`example.com`, `example.com/news`). */\n z.strictObject({\n criterionType: z.literal(\"placement\"),\n url: z.string().min(1).refine(isPlacementSite, {\n error:\n 'a placement is a website address with a real domain ending, like example.com or example.com/news — Google refuses any other (\"Placement URL has wrong format\")',\n }),\n ...bid,\n }),\n /** A mobile app by Google's id: `1-<appStoreId>` for iOS, `2-<packageName>` for Android. */\n z.strictObject({\n criterionType: z.literal(\"mobileApp\"),\n appId: z.string().regex(/^[12]-.+$/, \"appId is 1-<App Store id> for iOS or 2-<package name> for Android\"),\n ...bid,\n }),\n z.strictObject({\n criterionType: z.literal(\"mobileAppCategory\"),\n mobileAppCategoryConstant: constantSchema(\"mobileAppCategoryConstants\"),\n ...bid,\n }),\n z.strictObject({ criterionType: z.literal(\"youtubeChannel\"), channelId: z.string().min(1), ...bid }),\n z.strictObject({ criterionType: z.literal(\"youtubeVideo\"), videoId: z.string().min(1), ...bid }),\n z.strictObject({ criterionType: z.literal(\"topic\"), topicConstant: constantSchema(\"topicConstants\"), ...bid }),\n z.strictObject({ criterionType: z.literal(\"ageRange\"), ageRange: z.enum(AGE_RANGES), ...bid }),\n z.strictObject({ criterionType: z.literal(\"gender\"), gender: z.enum(GENDERS), ...bid }),\n z.strictObject({ criterionType: z.literal(\"parentalStatus\"), parentalStatus: z.enum(PARENTAL_STATUSES), ...bid }),\n z.strictObject({ criterionType: z.literal(\"incomeRange\"), incomeRange: z.enum(INCOME_RANGES), ...bid }),\n z.strictObject({ criterionType: z.literal(\"ipBlock\"), ipAddress: z.string().min(1) }),\n z.strictObject({ criterionType: z.literal(\"contentLabel\"), contentLabel: z.enum(CONTENT_LABELS) }),\n z.strictObject({ criterionType: z.literal(\"carrier\"), carrierConstant: constantSchema(\"carrierConstants\") }),\n z.strictObject({\n criterionType: z.literal(\"operatingSystem\"),\n operatingSystemVersionConstant: constantSchema(\"operatingSystemVersionConstants\"),\n }),\n /** Pages of the advertiser's own site, for Dynamic Search Ads targeting or URL exclusions. */\n z.strictObject({\n criterionType: z.literal(\"webpage\"),\n name: z.string().min(1).max(255),\n conditions: z\n .array(\n z.strictObject({\n operand: z.enum(WEBPAGE_OPERANDS),\n operator: z.enum(WEBPAGE_OPERATORS).optional(),\n argument: z.string().min(1),\n }),\n )\n .min(1)\n .max(3),\n }),\n /** A BRANDS shared set (`keyword-lists create --type BRANDS`), attached as an inclusion or exclusion. */\n z.strictObject({ criterionType: z.literal(\"brandList\"), sharedSet: refSchema }),\n /** A member of a BRANDS list: Google's brand entity id (`/g/11txzrylsb`, from `baker ads google brands`). */\n z.strictObject({ criterionType: z.literal(\"brand\"), entityId: z.string().regex(/^\\/[a-z]\\/\\w+$/) }),\n z.strictObject({ criterionType: z.literal(\"userList\"), userList: refSchema, ...bid }),\n z.strictObject({ criterionType: z.literal(\"userInterest\"), userInterest: existingRefSchema, ...bid }),\n z.strictObject({ criterionType: z.literal(\"customAudience\"), customAudience: existingRefSchema, ...bid }),\n /** A Demand Gen ad group's one combined audience (the `audiences/{id}` resource). */\n z.strictObject({ criterionType: z.literal(\"audience\"), audience: existingRefSchema }),\n /** An ACCOUNT_LEVEL_NEGATIVE_KEYWORDS list applied to the whole account (account exclusions only). */\n z.strictObject({ criterionType: z.literal(\"negativeKeywordList\"), sharedSet: refSchema }),\n /** A Performance Max search theme (asset-group signal only). */\n z.strictObject({\n criterionType: z.literal(\"searchTheme\"),\n text: z.string().min(1).max(GOOGLE_ADS_LIMITS.assetGroupSignal.searchThemeTextMax),\n }),\n] as const;\n\nexport const LOCATION_GROUP_MESSAGE =\n 'Targeting near business locations (a location group) needs the account\\'s location assets, which Baker cannot stage yet. Target a radius instead — `criterionType: \"proximity\"` with an address or latitude/longitude and a radius — or tell the user to add the business locations in Google Ads; carry on with the rest of the job.';\n\n/** Criterion types that are not part of the union, each answered with the way out. */\nconst RETIRED_CRITERION_TYPES: Readonly<Record<string, string>> = {\n locationGroup: LOCATION_GROUP_MESSAGE,\n keyword:\n \"Keywords are not criteria here: target them with `baker ads google keywords add`, exclude them with `baker ads google negative-keywords add`, or put them in a list with `baker ads google keyword-lists add`.\",\n};\n\nexport const criterionSpecSchema = z.discriminatedUnion(\"criterionType\", criterionSchemas, {\n error: (issue) => {\n const input = issue.input as { criterionType?: unknown } | undefined;\n const type = typeof input?.criterionType === \"string\" ? input.criterionType : undefined;\n return type ? RETIRED_CRITERION_TYPES[type] : undefined;\n },\n});\nexport type CriterionSpec = z.infer<typeof criterionSpecSchema>;\nexport type CriterionType = CriterionSpec[\"criterionType\"];\nexport const CRITERION_TYPES = criterionSchemas.map((schema) => schema.shape.criterionType.value) as CriterionType[];\n\n/** Cross-field rules a discriminated-union option cannot carry itself. */\nexport function criterionSpecIssues(spec: CriterionSpec): Array<{ path: string[]; message: string }> {\n if (spec.criterionType === \"adSchedule\" && spec.endHour === 24 && spec.endMinute !== \"ZERO\") {\n return [{ path: [\"endMinute\"], message: \"endHour 24 (midnight) cannot have a non-zero endMinute\" }];\n }\n if (spec.criterionType === \"proximity\") {\n const point = spec.latitude !== undefined || spec.longitude !== undefined;\n const both = spec.latitude !== undefined && spec.longitude !== undefined;\n if (point === (spec.address !== undefined) || (point && !both)) {\n return [\n {\n path: [],\n message:\n \"a radius is around either a point (latitude AND longitude) or an address (countryCode plus street, city or postal code) — give exactly one\",\n },\n ];\n }\n }\n return [];\n}\n\n// --- Where each type may go (the API's own shape) ---\n\nexport type CriterionLevel = \"campaign\" | \"adGroup\" | \"account\" | \"sharedSet\" | \"assetGroup\";\ntype Polarity = \"target\" | \"exclude\";\nconst BOTH: readonly Polarity[] = [\"target\", \"exclude\"];\nconst TARGET: readonly Polarity[] = [\"target\"];\nconst EXCLUDE: readonly Polarity[] = [\"exclude\"];\n\ninterface CriterionPlacement {\n label: string;\n campaign?: readonly Polarity[];\n adGroup?: readonly Polarity[];\n /** Account-level exclusion (`CustomerNegativeCriterion`). */\n account?: boolean;\n /** The shared-set types it can be a member of. */\n sharedSet?: readonly GoogleSharedSetType[];\n assetGroup?: boolean;\n}\n\nconst PLACEMENT_LISTS: readonly GoogleSharedSetType[] = [\"NEGATIVE_PLACEMENTS\"];\n\nexport const CRITERION_PLACEMENTS: Readonly<Record<CriterionType, CriterionPlacement>> = {\n location: { label: \"location\", campaign: BOTH, adGroup: BOTH },\n language: { label: \"language\", campaign: TARGET, adGroup: TARGET },\n adSchedule: { label: \"ad schedule\", campaign: TARGET },\n // A device is never excluded: a bid adjustment of 0 is how it stops serving.\n device: { label: \"device\", campaign: TARGET },\n proximity: { label: \"radius\", campaign: TARGET },\n placement: { label: \"placement\", campaign: EXCLUDE, adGroup: BOTH, account: true, sharedSet: PLACEMENT_LISTS },\n mobileApp: { label: \"app\", campaign: EXCLUDE, adGroup: BOTH, account: true, sharedSet: PLACEMENT_LISTS },\n mobileAppCategory: {\n label: \"app category\",\n campaign: EXCLUDE,\n adGroup: BOTH,\n account: true,\n sharedSet: PLACEMENT_LISTS,\n },\n youtubeChannel: {\n label: \"YouTube channel\",\n campaign: EXCLUDE,\n adGroup: BOTH,\n account: true,\n sharedSet: PLACEMENT_LISTS,\n },\n youtubeVideo: {\n label: \"YouTube video\",\n campaign: EXCLUDE,\n adGroup: BOTH,\n account: true,\n sharedSet: PLACEMENT_LISTS,\n },\n topic: { label: \"topic\", campaign: EXCLUDE, adGroup: BOTH },\n ageRange: { label: \"age\", campaign: EXCLUDE, adGroup: BOTH },\n gender: { label: \"gender\", campaign: EXCLUDE, adGroup: BOTH },\n parentalStatus: { label: \"parental status\", campaign: EXCLUDE, adGroup: BOTH },\n incomeRange: { label: \"household income\", campaign: EXCLUDE, adGroup: BOTH },\n ipBlock: { label: \"IP address\", campaign: EXCLUDE, account: true },\n contentLabel: { label: \"content type\", campaign: EXCLUDE, account: true },\n carrier: { label: \"mobile carrier\", campaign: TARGET },\n operatingSystem: { label: \"operating system\", campaign: TARGET },\n webpage: { label: \"web pages\", campaign: EXCLUDE, adGroup: BOTH },\n brandList: { label: \"brand list\", campaign: BOTH, adGroup: TARGET },\n brand: { label: \"brand\", sharedSet: [\"BRANDS\"] },\n negativeKeywordList: { label: \"account negative keyword list\", account: true },\n userList: { label: \"audience list\", campaign: BOTH, adGroup: BOTH },\n userInterest: { label: \"interest\", campaign: BOTH, adGroup: BOTH },\n customAudience: { label: \"custom segment\", campaign: BOTH, adGroup: BOTH },\n audience: { label: \"audience\", adGroup: TARGET, assetGroup: true },\n searchTheme: { label: \"search theme\", assetGroup: true },\n};\n\n/**\n * Audience segments go through `audiences attach`, never a generic criterion op: on a campaign or ad\n * group their effect depends on the parent's Observation / Targeting setting, and that op is the one\n * that reads it, warns, and stages the switch.\n */\nexport const AUDIENCE_SEGMENT_TYPES: ReadonlySet<CriterionType> = new Set([\n \"userList\",\n \"userInterest\",\n \"customAudience\",\n]);\nexport const AUDIENCE_SEGMENT_MESSAGE =\n \"Audience lists, interests and custom segments go on a campaign or ad group with `baker ads google audiences attach` (`--user-list`, `--interest` or `--custom-segment`) — that command reads whether the parent narrows its reach to them (Targeting) or only adjusts bids (Observation) and stages the switch. Use it instead.\";\n\nconst LEVEL_WORDS: Readonly<Record<CriterionLevel, string>> = {\n campaign: \"a campaign\",\n adGroup: \"an ad group\",\n account: \"the account's exclusions\",\n sharedSet: \"a list\",\n assetGroup: \"an asset group signal\",\n};\n\nconst PAST: Readonly<Record<Polarity, string>> = { target: \"targeted\", exclude: \"excluded\" };\n\n/** Where the API accepts this type, in words — the way out a refusal names. */\nfunction acceptedAt(type: CriterionType): string {\n const placement = CRITERION_PLACEMENTS[type];\n const where: string[] = [];\n for (const level of [\"campaign\", \"adGroup\"] as const) {\n const polarities = placement[level];\n if (polarities) {\n where.push(\n `${polarities.length === 2 ? \"targeted or excluded\" : PAST[polarities[0] ?? \"target\"]} on ${LEVEL_WORDS[level]}`,\n );\n }\n }\n if (placement.account) {\n where.push(\"excluded account-wide\");\n }\n if (placement.sharedSet) {\n where.push(`a member of a ${placement.sharedSet.join(\"/\")} list`);\n }\n if (placement.assetGroup) {\n where.push(\"an asset group signal\");\n }\n return where.join(\", \");\n}\n\n/**\n * Why Google's API has no place for this criterion at this level and polarity, or undefined. Static\n * — it does not depend on the campaign type (that is `criterionChannelVerdict`).\n */\nexport function criterionLevelIssue(\n spec: CriterionSpec,\n level: CriterionLevel,\n options: { negative?: boolean; viaAudiences?: boolean } = {},\n): string | undefined {\n const type = spec.criterionType;\n const placement = CRITERION_PLACEMENTS[type];\n const audience = audienceRouteIssue(type, level, options.viaAudiences === true);\n if (audience) {\n return audience;\n }\n const polarity: Polarity = options.negative ? \"exclude\" : \"target\";\n if (levelAllows(placement, level, polarity)) {\n return spec.criterionType === \"contentLabel\" ? contentLabelLevelIssue(spec.contentLabel, level) : undefined;\n }\n if (type === \"device\" && options.negative) {\n return \"A device is never excluded — stage it with bidModifier 0 to stop the ads showing on it.\";\n }\n const what = withArticle(placement.label);\n const where =\n level === \"account\" || level === \"sharedSet\"\n ? `put ${what} in ${LEVEL_WORDS[level]}`\n : `${polarity} ${what} on ${LEVEL_WORDS[level]}`;\n return `Google's API cannot ${where} — ${what} can be ${acceptedAt(type)}.`;\n}\n\nfunction withArticle(label: string): string {\n return `${/^[aeiou]/i.test(label) ? \"an\" : \"a\"} ${label}`;\n}\n\n/** Audience segments go through `audiences attach` on a campaign or ad group, and only they do. */\nfunction audienceRouteIssue(type: CriterionType, level: CriterionLevel, viaAudiences: boolean): string | undefined {\n if ((level !== \"campaign\" && level !== \"adGroup\") || AUDIENCE_SEGMENT_TYPES.has(type) === viaAudiences) {\n return undefined;\n }\n return viaAudiences\n ? `\\`audiences attach\\` takes an audience list, interest or custom segment — a ${CRITERION_PLACEMENTS[type].label} is a criterion: stage it with \\`baker ads google ${level === \"campaign\" ? \"campaign\" : \"ad-group\"}-criteria add\\`.`\n : AUDIENCE_SEGMENT_MESSAGE;\n}\n\nfunction levelAllows(placement: CriterionPlacement, level: CriterionLevel, polarity: Polarity): boolean {\n switch (level) {\n case \"campaign\":\n case \"adGroup\":\n return (placement[level] ?? []).includes(polarity);\n case \"account\":\n return placement.account === true;\n case \"assetGroup\":\n return placement.assetGroup === true;\n default:\n return (placement.sharedSet?.length ?? 0) > 0;\n }\n}\n\nfunction contentLabelLevelIssue(label: string, level: CriterionLevel): string | undefined {\n if (level === \"campaign\" && ACCOUNT_ONLY_CONTENT_LABELS.has(label)) {\n return `${label} is excluded account-wide only (Google answers CANNOT_EXCLUDE_CRITERION on a campaign) — stage it with \\`baker ads google account-exclusions add\\`.`;\n }\n if (level === \"account\" && CAMPAIGN_ONLY_CONTENT_LABELS.has(label)) {\n return `${label} is excluded per campaign only (Google answers CANNOT_EXCLUDE_CRITERION account-wide) — stage it with \\`baker ads google campaign-criteria add\\`.`;\n }\n return undefined;\n}\n\n/** Why a bid adjustment cannot ride on this criterion, or undefined. */\nexport function criterionBidIssue(spec: CriterionSpec, negative: boolean): string | undefined {\n if (!(\"bidModifier\" in spec) || spec.bidModifier === undefined) {\n return undefined;\n }\n return negative\n ? \"An exclusion carries no bid adjustment — Google refuses one on a negative criterion (FIELD_INCOMPATIBLE_WITH_NEGATIVE_TARGETING). Drop bidModifier.\"\n : undefined;\n}\n\n// --- What each campaign type accepts (probed) ---\n\ntype Types = readonly CriterionType[];\ninterface LevelCriteria {\n target: Types;\n exclude: Types;\n /** Types whose criterion takes a bid adjustment at this level. */\n bid?: Types;\n}\n/** A pair Google accepts only when something else on the campaign is true. */\ntype Condition = \"aiMax\" | \"dynamicAdGroup\";\n\nexport interface ChannelCriteria {\n campaign: LevelCriteria;\n /** Absent: the campaign type has no ad groups criteria can go on (Performance Max). */\n adGroup?: LevelCriteria;\n /** `${level}:${polarity}:${type}` pairs accepted only under a condition — staged with a warning. */\n conditional?: Readonly<Record<string, Condition>>;\n /** Devices an ad group's own bid adjustment (`AdGroupBidModifier`) can name; absent = none. */\n adGroupDevices?: readonly (typeof DEVICE_TYPES)[number][];\n}\n\nconst AUDIENCES: Types = [\"userList\", \"userInterest\", \"customAudience\"];\nconst PLACEMENT_TYPES: Types = [\"placement\", \"mobileApp\", \"mobileAppCategory\", \"youtubeChannel\", \"youtubeVideo\"];\nconst SEARCH_DEMOGRAPHICS: Types = [\"ageRange\", \"gender\", \"incomeRange\"];\nconst DEMOGRAPHICS: Types = [\"ageRange\", \"gender\", \"parentalStatus\", \"incomeRange\"];\nconst CAMPAIGN_REACH: Types = [\"location\", \"language\", \"adSchedule\", \"device\", \"proximity\"];\nconst BID_AT_CAMPAIGN: Types = [\"location\", \"adSchedule\", \"device\", \"proximity\"];\nconst PHONE_DEVICES = [\"MOBILE\", \"TABLET\", \"DESKTOP\"] as const;\n\nexport const CRITERIA_BY_CHANNEL: Readonly<Record<string, ChannelCriteria>> = {\n SEARCH: {\n campaign: {\n target: [...CAMPAIGN_REACH, ...AUDIENCES, \"brandList\"],\n exclude: [\n \"location\",\n ...SEARCH_DEMOGRAPHICS,\n \"ipBlock\",\n \"contentLabel\",\n ...PLACEMENT_TYPES,\n \"webpage\",\n ...AUDIENCES,\n \"brandList\",\n ],\n bid: [...BID_AT_CAMPAIGN, ...AUDIENCES],\n },\n adGroup: {\n target: [...SEARCH_DEMOGRAPHICS, ...AUDIENCES, \"webpage\", \"location\", \"brandList\"],\n exclude: [...SEARCH_DEMOGRAPHICS, ...PLACEMENT_TYPES, ...AUDIENCES, \"webpage\"],\n bid: [...SEARCH_DEMOGRAPHICS, ...AUDIENCES],\n },\n conditional: {\n \"campaign:target:brandList\": \"aiMax\",\n \"campaign:exclude:brandList\": \"aiMax\",\n \"adGroup:target:location\": \"aiMax\",\n \"adGroup:target:brandList\": \"aiMax\",\n \"adGroup:target:webpage\": \"dynamicAdGroup\",\n \"adGroup:exclude:webpage\": \"dynamicAdGroup\",\n },\n adGroupDevices: PHONE_DEVICES,\n },\n DISPLAY: {\n campaign: {\n target: [...CAMPAIGN_REACH, \"carrier\", \"operatingSystem\"],\n exclude: [\"location\", ...DEMOGRAPHICS, \"ipBlock\", \"contentLabel\", ...PLACEMENT_TYPES, \"topic\", ...AUDIENCES],\n bid: BID_AT_CAMPAIGN,\n },\n adGroup: {\n target: [...PLACEMENT_TYPES, \"topic\", ...DEMOGRAPHICS, ...AUDIENCES],\n exclude: [...PLACEMENT_TYPES, \"topic\", ...DEMOGRAPHICS, ...AUDIENCES],\n bid: [...PLACEMENT_TYPES, \"topic\", ...DEMOGRAPHICS, ...AUDIENCES],\n },\n adGroupDevices: [\"MOBILE\", \"TABLET\", \"DESKTOP\", \"CONNECTED_TV\"],\n },\n DEMAND_GEN: {\n campaign: {\n target: [\"adSchedule\", \"device\", \"carrier\", \"operatingSystem\"],\n exclude: [\"ipBlock\", ...PLACEMENT_TYPES, \"topic\"],\n bid: [\"adSchedule\", \"device\"],\n },\n adGroup: {\n target: [\"location\", \"language\", ...PLACEMENT_TYPES, \"topic\", \"audience\"],\n exclude: [\"location\", ...PLACEMENT_TYPES, \"topic\"],\n bid: [],\n },\n },\n PERFORMANCE_MAX: {\n campaign: {\n target: CAMPAIGN_REACH,\n exclude: [\"location\", \"ageRange\", \"gender\", \"webpage\", \"brandList\", \"userList\"],\n bid: BID_AT_CAMPAIGN,\n },\n },\n SHOPPING: {\n campaign: {\n target: [\"location\", \"adSchedule\", \"device\", \"proximity\", \"brandList\", ...AUDIENCES],\n exclude: [\"location\", \"ipBlock\", \"webpage\", \"brandList\", ...AUDIENCES],\n bid: [...BID_AT_CAMPAIGN, ...AUDIENCES],\n },\n adGroup: { target: AUDIENCES, exclude: AUDIENCES, bid: AUDIENCES },\n adGroupDevices: PHONE_DEVICES,\n },\n};\n\nconst CHANNEL_WORDS: Readonly<Record<string, string>> = {\n SEARCH: \"Search\",\n DISPLAY: \"Display\",\n DEMAND_GEN: \"Demand Gen\",\n PERFORMANCE_MAX: \"Performance Max\",\n SHOPPING: \"Shopping\",\n};\n\n/** The specific way out for a refusal that has a well-known one. */\nconst CHANNEL_REFUSAL_ROUTES: Readonly<Record<string, string>> = {\n \"DEMAND_GEN:campaign:location\":\n 'A Demand Gen campaign takes its locations on each ad group, not the campaign (Google answers \"The error code is not in this version.\"). Stage them with `baker ads google ad-group-criteria add` on every ad group instead.',\n \"DEMAND_GEN:campaign:language\":\n \"A Demand Gen campaign takes its languages on each ad group, not the campaign. Stage them with `baker ads google ad-group-criteria add` on every ad group instead.\",\n \"DEMAND_GEN:campaign:proximity\":\n \"A Demand Gen campaign takes no radius targeting on the campaign; target locations on each ad group with `baker ads google ad-group-criteria add` instead.\",\n \"DEMAND_GEN:adGroup:audience-segment\":\n 'A Demand Gen ad group\\'s audience is ONE combined audience, not individual lists or interests (Google answers CANNOT_ADD_AUDIENCE_SEGMENT_CRITERION_WHEN_AUDIENCE_GROUPED_IS_SET). Point the ad group at an existing combined audience with `baker ads google ad-group-criteria add` (`criterionType: \"audience\"`), or tell the user to build it in Google Ads; carry on with the rest of the job.',\n \"DISPLAY:campaign:audience-segment\":\n \"On Display an audience goes on the ad group, not the campaign — attach it with `--level adGroup` on each ad group (an exclusion can stay on the campaign).\",\n \"PERFORMANCE_MAX:campaign:audience-segment\":\n \"Performance Max takes no audience targeting on the campaign — an audience there is a signal on the asset group, not a criterion. Exclusions of a customer list are allowed.\",\n};\n\nexport interface CriterionPlacementQuery {\n channelType: string | undefined;\n level: \"campaign\" | \"adGroup\";\n criterionType: CriterionType;\n negative: boolean;\n /** Whether the criterion carries a bid adjustment. */\n bid: boolean;\n /** The ad group's own type, when the ad group is known (`SEARCH_DYNAMIC_ADS` decides webpages). */\n adGroupType?: string;\n}\n\n/**\n * Whether this campaign type takes this criterion here: a refusal (Google will refuse it at publish),\n * a warning (it takes it only when something on the campaign is true), or nothing. Unknown channel or\n * a channel with no row → nothing.\n */\nexport function criterionChannelVerdict(query: CriterionPlacementQuery): { refusal?: string; warning?: string } {\n const row = query.channelType ? CRITERIA_BY_CHANNEL[query.channelType] : undefined;\n if (!(row && query.channelType)) {\n return {};\n }\n const refusal = channelRefusal(row, query.channelType, query);\n return refusal ? { refusal } : channelCondition(row, query);\n}\n\nfunction channelRefusal(row: ChannelCriteria, channelType: string, query: CriterionPlacementQuery): string | undefined {\n const channel = CHANNEL_WORDS[channelType] ?? channelType;\n const label = CRITERION_PLACEMENTS[query.criterionType].label;\n const level = row[query.level];\n if (!level) {\n return `A ${channel} campaign has no ad groups to put a ${label} on — stage it on the campaign instead.`;\n }\n if (!level[query.negative ? \"exclude\" : \"target\"].includes(query.criterionType)) {\n return notAcceptedRefusal(row, channelType, query);\n }\n if (query.bid && !(level.bid ?? []).includes(query.criterionType)) {\n const where = query.level === \"adGroup\" ? \"ad group\" : \"campaign\";\n return `Google takes no bid adjustment on a ${label} on a ${channel} ${where} (CANNOT_BID_MODIFY_CRITERION_TYPE) — stage it without bidModifier.`;\n }\n return undefined;\n}\n\n/** The refusal for a pair the campaign type does not take: its known way out, or where it does go. */\nfunction notAcceptedRefusal(row: ChannelCriteria, channelType: string, query: CriterionPlacementQuery): string {\n const segment = AUDIENCE_SEGMENT_TYPES.has(query.criterionType) ? \"audience-segment\" : query.criterionType;\n const route = CHANNEL_REFUSAL_ROUTES[`${channelType}:${query.level}:${segment}`];\n if (route) {\n return route;\n }\n const channel = CHANNEL_WORDS[channelType] ?? channelType;\n const label = CRITERION_PLACEMENTS[query.criterionType].label;\n const polarity: Polarity = query.negative ? \"exclude\" : \"target\";\n const other = query.level === \"campaign\" ? row.adGroup : row.campaign;\n const elsewhere = other?.[polarity].includes(query.criterionType)\n ? ` It can be ${PAST[polarity]} on ${query.level === \"campaign\" ? \"each ad group\" : \"the campaign\"} instead.`\n : \"\";\n const where = query.level === \"adGroup\" ? \"ad group\" : \"campaign\";\n return `Google does not let a ${channel} ${where} ${polarity} a ${label} (it answers OPERATION_NOT_PERMITTED_FOR_CONTEXT).${elsewhere} Leave it out and carry on with the rest of the job.`;\n}\n\nfunction channelCondition(row: ChannelCriteria, query: CriterionPlacementQuery): { warning?: string } {\n const polarity: Polarity = query.negative ? \"exclude\" : \"target\";\n const condition = row.conditional?.[`${query.level}:${polarity}:${query.criterionType}`];\n if (!condition || (condition === \"dynamicAdGroup\" && query.adGroupType === \"SEARCH_DYNAMIC_ADS\")) {\n return {};\n }\n const label = CRITERION_PLACEMENTS[query.criterionType].label;\n return {\n warning:\n condition === \"aiMax\"\n ? `Google takes a ${label} here only when the Search campaign has AI Max for Search switched on (AI_MAX_MUST_BE_ENABLED) — check it is on, or this change is refused at publish. Run \\`baker ads google draft validate\\` before asking the user to publish.`\n : \"Google takes web pages on a Search ad group only when it is a Dynamic Search Ads ad group (or the campaign has AI Max on) — this one may be refused at publish. Run `baker ads google draft validate` before asking the user to publish.\",\n };\n}\n\n/** Why an ad group's own device bid adjustment is not possible on this campaign type, or undefined. */\nexport function adGroupDeviceVerdict(channelType: string | undefined, device: string): string | undefined {\n const row = channelType ? CRITERIA_BY_CHANNEL[channelType] : undefined;\n if (!(row && channelType)) {\n return undefined;\n }\n const channel = CHANNEL_WORDS[channelType] ?? channelType;\n const devices: readonly string[] = row.adGroupDevices ?? [];\n if (devices.length === 0) {\n return `A ${channel} ad group takes no device bid adjustment of its own (OPERATION_NOT_PERMITTED_FOR_CONTEXT) — set it on the campaign with \\`baker ads google campaign-criteria add\\` (criterionType \"device\").`;\n }\n return devices.includes(device)\n ? undefined\n : `A ${channel} ad group takes a device bid adjustment for ${devices.join(\", \")} only — not ${device}.`;\n}\n\n// --- Building Google's oneof ---\n\nexport interface CriterionBuildContext {\n customerId: string;\n /** A ref (temp, bare id or resource name) as the full resource name of the entity it names. */\n rn: (value: string, entity: GoogleDraftEntity) => string;\n}\n\nfunction constant(collection: string, value: string): string {\n return NUMERIC_ID_REGEX.test(value) ? `${collection}/${value}` : value;\n}\n\nfunction accountResource(customerId: string, collection: string, value: string): string {\n return NUMERIC_ID_REGEX.test(value) ? `customers/${customerId}/${collection}/${value}` : value;\n}\n\n/** Latitude/longitude in degrees → Google's micro-degrees. */\nfunction microDegrees(value: number): number {\n return Math.round(value * 1_000_000);\n}\n\n/**\n * The criterion's oneof field — `{ placement: { url } }`, `{ ageRange: { type } }` — plus its bid\n * adjustment, ready to spread into a CampaignCriterion, AdGroupCriterion, CustomerNegativeCriterion,\n * SharedCriterion or AssetGroupSignal. The parent, `negative` and `status` are the caller's.\n */\nexport function buildCriterion(spec: CriterionSpec, ctx: CriterionBuildContext): Record<string, unknown> {\n const withBid = (field: Record<string, unknown>) =>\n \"bidModifier\" in spec && spec.bidModifier !== undefined ? { ...field, bidModifier: spec.bidModifier } : field;\n switch (spec.criterionType) {\n case \"location\":\n return withBid({ location: { geoTargetConstant: constant(\"geoTargetConstants\", spec.geoTargetConstant) } });\n case \"language\":\n return { language: { languageConstant: constant(\"languageConstants\", spec.languageConstant) } };\n case \"adSchedule\":\n return withBid({\n adSchedule: {\n dayOfWeek: spec.dayOfWeek,\n startHour: spec.startHour,\n startMinute: spec.startMinute,\n endHour: spec.endHour,\n endMinute: spec.endMinute,\n },\n });\n case \"device\":\n return withBid({ device: { type: spec.device } });\n case \"proximity\":\n return withBid({\n proximity: {\n ...(spec.address\n ? { address: spec.address }\n : {\n geoPoint: {\n latitudeInMicroDegrees: microDegrees(spec.latitude ?? 0),\n longitudeInMicroDegrees: microDegrees(spec.longitude ?? 0),\n },\n }),\n radius: spec.radius,\n radiusUnits: spec.radiusUnits,\n },\n });\n case \"placement\":\n return withBid({ placement: { url: spec.url } });\n case \"mobileApp\":\n return withBid({ mobileApplication: { appId: spec.appId } });\n case \"mobileAppCategory\":\n return withBid({\n mobileAppCategory: {\n mobileAppCategoryConstant: constant(\"mobileAppCategoryConstants\", spec.mobileAppCategoryConstant),\n },\n });\n case \"youtubeChannel\":\n return withBid({ youtubeChannel: { channelId: spec.channelId } });\n case \"youtubeVideo\":\n return withBid({ youtubeVideo: { videoId: spec.videoId } });\n case \"topic\":\n return withBid({ topic: { topicConstant: constant(\"topicConstants\", spec.topicConstant) } });\n case \"ageRange\":\n return withBid({ ageRange: { type: spec.ageRange } });\n case \"gender\":\n return withBid({ gender: { type: spec.gender } });\n case \"parentalStatus\":\n return withBid({ parentalStatus: { type: spec.parentalStatus } });\n case \"incomeRange\":\n return withBid({ incomeRange: { type: spec.incomeRange } });\n case \"ipBlock\":\n return { ipBlock: { ipAddress: spec.ipAddress } };\n case \"contentLabel\":\n return { contentLabel: { type: spec.contentLabel } };\n case \"carrier\":\n return { carrier: { carrierConstant: constant(\"carrierConstants\", spec.carrierConstant) } };\n case \"operatingSystem\":\n return {\n operatingSystemVersion: {\n operatingSystemVersionConstant: constant(\n \"operatingSystemVersionConstants\",\n spec.operatingSystemVersionConstant,\n ),\n },\n };\n case \"webpage\":\n return {\n webpage: {\n criterionName: spec.name,\n conditions: spec.conditions.map((c) => ({\n operand: c.operand,\n ...(c.operator ? { operator: c.operator } : {}),\n argument: c.argument,\n })),\n },\n };\n case \"brandList\":\n return { brandList: { sharedSet: ctx.rn(spec.sharedSet, \"sharedSet\") } };\n case \"brand\":\n return { brand: { entityId: spec.entityId } };\n case \"negativeKeywordList\":\n return { negativeKeywordList: { sharedSet: ctx.rn(spec.sharedSet, \"sharedSet\") } };\n case \"userList\":\n return withBid({ userList: { userList: ctx.rn(spec.userList, \"audience\") } });\n case \"userInterest\":\n return withBid({\n userInterest: {\n userInterestCategory: accountResource(ctx.customerId, \"userInterests\", spec.userInterest),\n },\n });\n case \"customAudience\":\n return withBid({\n customAudience: { customAudience: accountResource(ctx.customerId, \"customAudiences\", spec.customAudience) },\n });\n case \"audience\":\n return { audience: { audience: accountResource(ctx.customerId, \"audiences\", spec.audience) } };\n case \"searchTheme\":\n return { searchTheme: { text: spec.text } };\n default:\n return spec satisfies never;\n }\n}\n\n/** The temp refs a criterion consumes, with the entity each must resolve to. */\nexport function criterionTempRefs(spec: CriterionSpec): Array<{ ref: string; entity: GoogleDraftEntity }> {\n const refs: Array<{ ref: string; entity: GoogleDraftEntity }> = [];\n if (\n (spec.criterionType === \"brandList\" || spec.criterionType === \"negativeKeywordList\") &&\n TEMP_REF_REGEX.test(spec.sharedSet)\n ) {\n refs.push({ ref: spec.sharedSet, entity: \"sharedSet\" });\n }\n if (spec.criterionType === \"userList\" && TEMP_REF_REGEX.test(spec.userList)) {\n refs.push({ ref: spec.userList, entity: \"audience\" });\n }\n return refs;\n}\n\n// --- Words ---\n\nfunction bare(value: string): string {\n return value.split(\"/\").pop() ?? value;\n}\n\nconst ENUM_WORDS: Readonly<Record<string, string>> = {\n AGE_RANGE_65_UP: \"65+\",\n INCOME_RANGE_0_50: \"lower 50%\",\n INCOME_RANGE_50_60: \"41–50%\",\n INCOME_RANGE_60_70: \"31–40%\",\n INCOME_RANGE_70_80: \"21–30%\",\n INCOME_RANGE_80_90: \"11–20%\",\n INCOME_RANGE_90_UP: \"top 10%\",\n NOT_A_PARENT: \"not a parent\",\n};\n\n/** A criterion enum as a marketer reads it: AGE_RANGE_25_34 → \"25–34\", INCOME_RANGE_90_UP → \"top 10%\". */\nexport function criterionEnumWords(value: string): string {\n const known = ENUM_WORDS[value];\n if (known) {\n return known;\n }\n const age = /^AGE_RANGE_(\\d+)_(\\d+)$/.exec(value);\n if (age) {\n return `${age[1]}–${age[2]}`;\n }\n return value\n .replace(/^(AGE_RANGE_|INCOME_RANGE_)/, \"\")\n .replace(/_/g, \" \")\n .toLowerCase();\n}\n\n/**\n * What the criterion names, as words: \"placement example.com\", \"age 18–24\", \"location Poland\". This\n * is what the agent reads back after staging and what the review lists, so a criterion is never just\n * its type. `resolvedName` is a stage-time read of an id no table carries (a city, a topic).\n */\nexport function criterionValueText(spec: CriterionSpec, resolvedName?: string): string {\n return resolvedName ?? offlineName(spec) ?? rawValueText(spec);\n}\n\n/** A name the offline tables carry (countries, languages), so a common criterion needs no read. */\nfunction offlineName(spec: CriterionSpec): string | undefined {\n if (spec.criterionType === \"location\") {\n return GEO_TARGET_COUNTRIES[bare(spec.geoTargetConstant)];\n }\n return spec.criterionType === \"language\" ? LANGUAGE_CONSTANTS[bare(spec.languageConstant)] : undefined;\n}\n\n/** What the criterion's own fields say, when nothing better names it. */\nfunction rawValueText(spec: CriterionSpec): string {\n switch (spec.criterionType) {\n case \"location\":\n return bare(spec.geoTargetConstant);\n case \"language\":\n return bare(spec.languageConstant);\n case \"adSchedule\":\n return `${spec.dayOfWeek.toLowerCase()} ${spec.startHour}:${MINUTE_DIGITS[spec.startMinute]}–${spec.endHour}:${MINUTE_DIGITS[spec.endMinute]}`;\n case \"device\":\n return spec.device.toLowerCase().replace(/_/g, \" \");\n case \"proximity\":\n return proximityText(spec);\n case \"placement\":\n return spec.url;\n case \"mobileApp\":\n return spec.appId;\n case \"mobileAppCategory\":\n return bare(spec.mobileAppCategoryConstant);\n case \"youtubeChannel\":\n return spec.channelId;\n case \"youtubeVideo\":\n return spec.videoId;\n case \"topic\":\n return bare(spec.topicConstant);\n case \"ageRange\":\n return criterionEnumWords(spec.ageRange);\n case \"gender\":\n return criterionEnumWords(spec.gender);\n case \"parentalStatus\":\n return criterionEnumWords(spec.parentalStatus);\n case \"incomeRange\":\n return criterionEnumWords(spec.incomeRange);\n case \"ipBlock\":\n return spec.ipAddress;\n case \"contentLabel\":\n return criterionEnumWords(spec.contentLabel);\n case \"carrier\":\n return bare(spec.carrierConstant);\n case \"operatingSystem\":\n return bare(spec.operatingSystemVersionConstant);\n case \"webpage\":\n return spec.name;\n case \"brandList\":\n return bare(spec.sharedSet);\n case \"brand\":\n return spec.entityId;\n case \"negativeKeywordList\":\n return bare(spec.sharedSet);\n case \"userList\":\n return bare(spec.userList);\n case \"userInterest\":\n return bare(spec.userInterest);\n case \"customAudience\":\n return bare(spec.customAudience);\n case \"audience\":\n return bare(spec.audience);\n case \"searchTheme\":\n return spec.text;\n default:\n return spec satisfies never;\n }\n}\n\nfunction proximityText(spec: Extract<CriterionSpec, { criterionType: \"proximity\" }>): string {\n const where = spec.address\n ? [spec.address.streetAddress, spec.address.postalCode, spec.address.cityName, spec.address.countryCode]\n .filter(Boolean)\n .join(\", \")\n : `${spec.latitude}, ${spec.longitude}`;\n return `${spec.radius} ${spec.radiusUnits === \"MILES\" ? \"mi\" : \"km\"} around ${where}`;\n}\n\n/** \"placement example.com\" — the type's label, then what it names. */\nexport function criterionPhrase(spec: CriterionSpec, resolvedName?: string): string {\n return `${CRITERION_PLACEMENTS[spec.criterionType].label} ${criterionValueText(spec, resolvedName)}`.trim();\n}\n\n/** The GAQL resource and id a criterion's display name is read from, for ids no offline table names. */\nexport function criterionNameSource(spec: CriterionSpec): { resource: string; id: string } | undefined {\n switch (spec.criterionType) {\n case \"location\":\n return { resource: \"geo_target_constant\", id: bare(spec.geoTargetConstant) };\n case \"language\":\n return { resource: \"language_constant\", id: bare(spec.languageConstant) };\n case \"topic\":\n return { resource: \"topic_constant\", id: bare(spec.topicConstant) };\n case \"carrier\":\n return { resource: \"carrier_constant\", id: bare(spec.carrierConstant) };\n case \"operatingSystem\":\n return { resource: \"operating_system_version_constant\", id: bare(spec.operatingSystemVersionConstant) };\n case \"mobileAppCategory\":\n return { resource: \"mobile_app_category_constant\", id: bare(spec.mobileAppCategoryConstant) };\n case \"userInterest\":\n return { resource: \"user_interest\", id: bare(spec.userInterest) };\n case \"customAudience\":\n return { resource: \"custom_audience\", id: bare(spec.customAudience) };\n case \"audience\":\n return { resource: \"audience\", id: bare(spec.audience) };\n case \"userList\":\n return TEMP_REF_REGEX.test(spec.userList) ? undefined : { resource: \"user_list\", id: bare(spec.userList) };\n case \"brandList\":\n case \"negativeKeywordList\":\n return TEMP_REF_REGEX.test(spec.sharedSet) ? undefined : { resource: \"shared_set\", id: bare(spec.sharedSet) };\n default:\n return undefined;\n }\n}\n\n/** Google's `CriterionType` enum (what a read returns as `.type`) → the spec's `criterionType`. */\nconst CRITERION_TYPE_BY_GOOGLE: Readonly<Record<string, CriterionType>> = {\n LOCATION: \"location\",\n LANGUAGE: \"language\",\n AD_SCHEDULE: \"adSchedule\",\n DEVICE: \"device\",\n PROXIMITY: \"proximity\",\n PLACEMENT: \"placement\",\n MOBILE_APPLICATION: \"mobileApp\",\n MOBILE_APP_CATEGORY: \"mobileAppCategory\",\n YOUTUBE_CHANNEL: \"youtubeChannel\",\n YOUTUBE_VIDEO: \"youtubeVideo\",\n TOPIC: \"topic\",\n AGE_RANGE: \"ageRange\",\n GENDER: \"gender\",\n PARENTAL_STATUS: \"parentalStatus\",\n INCOME_RANGE: \"incomeRange\",\n IP_BLOCK: \"ipBlock\",\n CONTENT_LABEL: \"contentLabel\",\n CARRIER: \"carrier\",\n OPERATING_SYSTEM_VERSION: \"operatingSystem\",\n WEBPAGE: \"webpage\",\n BRAND_LIST: \"brandList\",\n BRAND: \"brand\",\n NEGATIVE_KEYWORD_LIST: \"negativeKeywordList\",\n USER_LIST: \"userList\",\n USER_INTEREST: \"userInterest\",\n CUSTOM_AUDIENCE: \"customAudience\",\n AUDIENCE: \"audience\",\n SEARCH_THEME: \"searchTheme\",\n};\n\nexport function criterionTypeOfGoogle(type: string | undefined): CriterionType | undefined {\n return type ? CRITERION_TYPE_BY_GOOGLE[type] : undefined;\n}\n","/**\n * The structured snippet headers Google Ads accepts.\n *\n * `StructuredSnippetAsset.header` looks like free text and is not: Google\n * rejects anything outside its own published list with \"The input string value\n * is invalid for the associated field.\", which names neither the field nor the\n * list. A campaign launch lost two snippet assets — and, with them, the asset\n * links that depended on them — to the header \"Features\", which is not on it.\n *\n * The list below is Google's, verbatim: the thirteen English headers plus every\n * translation it publishes, so a Portuguese campaign can stage \"Tipos\" and a\n * French one \"Émissions\". A header is matched case-insensitively and rewritten\n * to Google's exact spelling, because a snippet that only differs in casing is\n * a valid intent Google would otherwise refuse.\n *\n * Source: https://developers.google.com/google-ads/api/data/structured-snippet-headers\n */\n\n/** The English headers, in Google's own order — what an error message offers back. */\nexport const STRUCTURED_SNIPPET_HEADERS_EN = [\n \"Brands\",\n \"Amenities\",\n \"Styles\",\n \"Types\",\n \"Destinations\",\n \"Services\",\n \"Courses\",\n \"Neighborhoods\",\n \"Shows\",\n \"Insurance coverage\",\n \"Degree programs\",\n \"Featured hotels\",\n \"Models\",\n] as const;\n\n/** Google's translations of those thirteen headers, across every locale it publishes. */\nconst STRUCTURED_SNIPPET_HEADERS_LOCALIZED: readonly string[] = [\n \"Aanbevolen hotels\",\n \"Acara\",\n \"Apdrošināšana\",\n \"Apkaimes\",\n \"Arredores\",\n \"Asigurare\",\n \"Assegurança\",\n \"Ausstattung\",\n \"Automerkit\",\n \"Bairros\",\n \"Barrios\",\n \"Barris\",\n \"Bestemmingen\",\n \"Biztosítási módozat\",\n \"Blagovne znamke\",\n \"Brand\",\n \"Brändid\",\n \"Brändit\",\n \"Buurten\",\n \"Cakupan asuransi\",\n \"Carreras universitarias\",\n \"Cartiere\",\n \"Chương trình\",\n \"Cilji\",\n \"Cobertura de seguro\",\n \"Cobertura do seguro\",\n \"Comodidades\",\n \"Coperture assicurativa\",\n \"Corsi\",\n \"Corsi di laurea\",\n \"Cours\",\n \"Couverture d'assurance\",\n \"Cursos\",\n \"Cursuri\",\n \"Cursussen\",\n \"Cíle\",\n \"Cấp bằng\",\n \"Degree programmes\",\n \"Dekking\",\n \"Design\",\n \"Destinacions\",\n \"Destinasi\",\n \"Destinasjoner\",\n \"Destinationer\",\n \"Destinazioni\",\n \"Destinații\",\n \"Destinos\",\n \"Destinácie\",\n \"Dienstleistungen\",\n \"Diplomaprogramok\",\n \"Dotări\",\n \"Draudimo aprėptis\",\n \"Dzielnice\",\n \"Dịch vụ\",\n \"Emisije\",\n \"Emisiuni\",\n \"Espectáculos\",\n \"Estilos\",\n \"Estils\",\n \"Faciliteter\",\n \"Fasilitas\",\n \"Fasiliteter\",\n \"Forsikringsdekning\",\n \"Forsikringsdækning\",\n \"Försäkringstyper\",\n \"Galamērķi\",\n \"Gaya\",\n \"Hizmetler\",\n \"Hotel consigliati\",\n \"Hotel ditampilkan\",\n \"Hotel pilihan\",\n \"Hoteles destacados\",\n \"Hotels destacats\",\n \"Hoteluri prezentate\",\n \"Hotéis em destaque\",\n \"Istaknuti hoteli\",\n \"Itinatampok na hotel\",\n \"Jenama\",\n \"Jenis\",\n \"Kaupunginosat\",\n \"Kawasan\",\n \"Kejiranan\",\n \"Kemudahan\",\n \"Khách sạn nổi bật\",\n \"Khóa học\",\n \"Kiemelt szállodák\",\n \"Kierunki studiów\",\n \"Kindlustuskaitse\",\n \"Kiểu\",\n \"Kohteet\",\n \"Kraadiõppeprogrammid\",\n \"Kritje zavarovanj\",\n \"Kurs\",\n \"Kursai\",\n \"Kurse\",\n \"Kurser\",\n \"Kursi\",\n \"Kurslar\",\n \"Kurssit\",\n \"Kursus\",\n \"Kursused\",\n \"Kursy\",\n \"Kurzy\",\n \"Laidos\",\n \"Layanan\",\n \"Licenciaturas\",\n \"Liputan insurans\",\n \"Lisans programları\",\n \"Lisäpalvelut\",\n \"Lokalområder\",\n \"Loại\",\n \"Mahalleler\",\n \"Marcas\",\n \"Markalar\",\n \"Marken\",\n \"Marki\",\n \"Marques\",\n \"Mata pelajaran\",\n \"Merek\",\n \"Merken\",\n \"Merkevarer\",\n \"Mga Amenity\",\n \"Mga Brand\",\n \"Mga Destinasyon\",\n \"Mga Istilo\",\n \"Mga Komunidad\",\n \"Mga Kurso\",\n \"Mga Modelo\",\n \"Mga Palabas\",\n \"Mga Serbisyo\",\n \"Mga Uri\",\n \"Mga degree program\",\n \"Miejsca\",\n \"Model\",\n \"Modele\",\n \"Modeli\",\n \"Modeliai\",\n \"Modelle\",\n \"Modellek\",\n \"Modellen\",\n \"Modeller\",\n \"Modelli\",\n \"Modelos\",\n \"Modely\",\n \"Modeļi\",\n \"Modèles\",\n \"Moksliniai laipsniai\",\n \"Mudelid\",\n \"Mugavusteenused\",\n \"Márkák\",\n \"Mărci\",\n \"Műsorok\",\n \"Nabolag\",\n \"Namų apylinkės\",\n \"Neighbourhoods\",\n \"Oddaje\",\n \"Odporúčané hotely\",\n \"Odredišta\",\n \"Oppiaineet\",\n \"Osiguranje\",\n \"Pakalpojumi\",\n \"Palvelut\",\n \"Paskirties vietos\",\n \"Paslaugos\",\n \"Patogumai\",\n \"Perkhidmatan\",\n \"Phạm vi bảo hiểm\",\n \"Piedāvātās viesnīcas\",\n \"Poistenie\",\n \"Pojištění\",\n \"Polecane hotele\",\n \"Ponudba\",\n \"Pořady\",\n \"Predstavljeni hoteli\",\n \"Prekių ženklai\",\n \"Program\",\n \"Program ijazah\",\n \"Program sarjana\",\n \"Programas\",\n \"Programas de graduação\",\n \"Programe de studiu\",\n \"Programes\",\n \"Programlar\",\n \"Programmer\",\n \"Programmes d'études\",\n \"Programmi\",\n \"Programy\",\n \"Pārraides\",\n \"Quartieri\",\n \"Quartiers\",\n \"Rancangan\",\n \"Relácie\",\n \"Resmål\",\n \"Robne marke\",\n \"Saated ja etendused\",\n \"Sadržaji\",\n \"Sakop ng insurance\",\n \"Serien\",\n \"Serier\",\n \"Serveis\",\n \"Serveis addicionals\",\n \"Servicii\",\n \"Servicios\",\n \"Servicios adicionales\",\n \"Servizi\",\n \"Serviços\",\n \"Show't\",\n \"Sigorta kapsamı\",\n \"Sihtkohad\",\n \"Siūlomi viešbučiai\",\n \"Slogi\",\n \"Služby\",\n \"Soovitatud hotellid\",\n \"Soseske\",\n \"Stiilid\",\n \"Stijlen\",\n \"Stilar\",\n \"Stile\",\n \"Stiler\",\n \"Stili\",\n \"Stiliai\",\n \"Stiller\",\n \"Stilovi\",\n \"Stiluri\",\n \"Storitve\",\n \"Studiengänge\",\n \"Studieprogramma's\",\n \"Studijní programy\",\n \"Studijski programi\",\n \"Studiju programmas\",\n \"Style\",\n \"Styly\",\n \"Stílusok\",\n \"Sunulan olanaklar\",\n \"Suositellut hotellit\",\n \"Szolgáltatások\",\n \"Sélection d'hôtels\",\n \"Tanfolyamok\",\n \"Teenused\",\n \"Tečajevi\",\n \"Tečaji\",\n \"Thương hiệu\",\n \"Tipai\",\n \"Tipi\",\n \"Tipos\",\n \"Tipuri\",\n \"Tipus\",\n \"Titulacions\",\n \"Tiện nghi\",\n \"Tjenester\",\n \"Tjänster\",\n \"Typen\",\n \"Typer\",\n \"Typy\",\n \"Tyylit\",\n \"Tyypit\",\n \"Típusok\",\n \"Türler\",\n \"Tüübid\",\n \"Ubezpieczenia\",\n \"Uddannelser\",\n \"Udogodnienia\",\n \"Udvalgte hoteller\",\n \"Usluge\",\n \"Usługi\",\n \"Utbildningsprogram\",\n \"Utdanningsprogrammer\",\n \"Utvalda hotell\",\n \"Utvalgte hoteller\",\n \"Vakuutukset\",\n \"Varumärken\",\n \"Veidi\",\n \"Versicherungsleistung\",\n \"Viertel\",\n \"Voorzieningen\",\n \"Vorgestellte Hotels\",\n \"Vrste\",\n \"Vybavenie\",\n \"Vybavení\",\n \"Vybrané hotely\",\n \"Vzdelávacie programy\",\n \"Városrészek\",\n \"Vùng lân cận\",\n \"Ziele\",\n \"Značky\",\n \"Známé oblasti\",\n \"Zīmoli\",\n \"destinasyonlar\",\n \"Émissions\",\n \"Équipements\",\n \"Öne çıkan oteller\",\n \"Úti célok\",\n \"Ümbruskonnad\",\n \"Četvrti\",\n \"Điểm đến\",\n \"Ērtības\",\n \"Študijski programi\",\n \"Štvrte\",\n \"Štýly\",\n \"Ασφαλιστική κάλυψη\",\n \"Γειτονιές\",\n \"Εκπομπές\",\n \"Επωνυμίες\",\n \"Μαθήματα\",\n \"Μοντέλα\",\n \"Ξενοδοχεία\",\n \"Παροχές\",\n \"Προγράμματα πτυχίων\",\n \"Προορισμοί\",\n \"Στυλ\",\n \"Τύποι\",\n \"Υπηρεσίες\",\n \"Бренди\",\n \"Бренды\",\n \"Дестинации\",\n \"Застраховка\",\n \"Зручності\",\n \"Квартали\",\n \"Курси\",\n \"Курсове\",\n \"Курсы\",\n \"Марки\",\n \"Места\",\n \"Модели\",\n \"Моделі\",\n \"Місця\",\n \"Освітні програми\",\n \"Послуги\",\n \"Предавания\",\n \"Представени хотели\",\n \"Программы высшего образования\",\n \"Районы\",\n \"Рекомендовані готелі\",\n \"Рекомендуемые отели\",\n \"Специалности\",\n \"Стили\",\n \"Стилове\",\n \"Стилі\",\n \"Страховая защита\",\n \"Страховий захист\",\n \"Типи\",\n \"Типове\",\n \"Типы\",\n \"Удобства\",\n \"Услуги\",\n \"Шоу\",\n \"брендови\",\n \"делови града\",\n \"дестинације\",\n \"дипломе\",\n \"емисије\",\n \"истакнути хотели\",\n \"курсеви\",\n \"модели\",\n \"осигурање\",\n \"садржаји\",\n \"стилови\",\n \"типови\",\n \"услуге\",\n \"דגמים\",\n \"הופעות ותוכניות\",\n \"יעדים גיאוגרפיים\",\n \"כיסוי ביטוחי\",\n \"מותגים\",\n \"מלונות מומלצים\",\n \"סגנונות\",\n \"סוגים\",\n \"קורסים\",\n \"שירותי המקום\",\n \"שירותים\",\n \"שכונות\",\n \"תוכניות ללימודי תואר\",\n \"الأحياء\",\n \"الأنماط\",\n \"الأنواع\",\n \"التغطية التأمينية\",\n \"الخدمات\",\n \"الدورات التدريبية\",\n \"العروض\",\n \"العلامات التجارية\",\n \"الفنادق المميّزة\",\n \"النماذج\",\n \"الوجهات\",\n \"برامج الشهادات\",\n \"وسائل الراحة\",\n \"आस-पड़ोस\",\n \"गंतव्य\",\n \"डिग्री कार्यक्रम\",\n \"पाठ्‍यक्रम\",\n \"प्रकार\",\n \"प्रदर्शित होटल\",\n \"बीमा कवरेज\",\n \"ब्रांड\",\n \"मॉडल\",\n \"शैलियां\",\n \"शो\",\n \"सुविधाएं\",\n \"सेवाएं\",\n \"ความคุ้มครองในประกัน\",\n \"บริการ\",\n \"ประเภท\",\n \"ปลายทาง\",\n \"ย่านใกล้เคียง\",\n \"รุ่น\",\n \"สิ่งอำนวยความสะดวก\",\n \"สไตล์\",\n \"หลักสูตร\",\n \"หลักสูตรปริญญา\",\n \"แบรนด์\",\n \"โชว์\",\n \"โรงแรมเด่น\",\n \"おすすめのホテル\",\n \"コース\",\n \"サービス\",\n \"スタイル\",\n \"タイプ\",\n \"ブランド\",\n \"モデル\",\n \"保険の保障\",\n \"保障範圍\",\n \"到着地\",\n \"周辺地域\",\n \"品牌\",\n \"型号\",\n \"型號\",\n \"学位プログラム\",\n \"学位课程\",\n \"學位課程\",\n \"承保範圍\",\n \"服务\",\n \"服務\",\n \"款式\",\n \"特色酒店\",\n \"番組\",\n \"目的地\",\n \"社区\",\n \"社區\",\n \"節目\",\n \"类型\",\n \"精选酒店\",\n \"精選飯店\",\n \"节目\",\n \"設備\",\n \"設施\",\n \"課程\",\n \"设施\",\n \"课程\",\n \"险种\",\n \"類型\",\n \"과정\",\n \"모델\",\n \"목적지\",\n \"보험 보상 범위\",\n \"브랜드\",\n \"서비스\",\n \"스타일\",\n \"유형\",\n \"인근 지역\",\n \"추천 호텔\",\n \"편의 시설\",\n \"프로그램\",\n \"학위 취득 프로그램\",\n];\n\n/**\n * Headers Google renamed but still documents under the old name, so a marketer\n * reading an older help page does not lose an asset to it.\n *\n * A `Map`, not an object literal: an object answers `\"constructor\"` with a\n * function off `Object.prototype`, and the schema downstream would take that as\n * a valid header and stage a snippet whose header vanishes on serialization —\n * the exact failure this module exists to stop, from a lookup that never\n * touched the list.\n */\nconst HEADER_ALIASES = new Map<string, string>([[\"service catalog\", \"Services\"]]);\n\nconst ACCEPTED = new Set<string>([...STRUCTURED_SNIPPET_HEADERS_EN, ...STRUCTURED_SNIPPET_HEADERS_LOCALIZED]);\n\n/**\n * One case-folded entry per accepted header. Two locales disagree on the casing\n * of the same word, so an exact match is always answered before this map — the\n * fold is a fallback for the caller's casing, not a canonicalization of\n * Google's.\n */\nconst BY_FOLDED_CASE = new Map<string, string>([...ACCEPTED].map((header) => [header.toLowerCase(), header] as const));\n\n/**\n * Google's own spelling of `header`, or `undefined` if Google does not accept\n * any spelling of it. Callers stage the returned string, never the input.\n */\nexport function canonicalStructuredSnippetHeader(header: string): string | undefined {\n const trimmed = header.trim();\n if (ACCEPTED.has(trimmed)) {\n return trimmed;\n }\n const folded = trimmed.toLowerCase();\n return HEADER_ALIASES.get(folded) ?? BY_FOLDED_CASE.get(folded);\n}\n","/**\n * Staged Google Ads write operations — the wire + storage payload contract.\n *\n * Ops are staged per chat and applied only when the chat publishes as a single\n * atomic `GoogleAdsService.Mutate` batch. Every payload here is exhaustively\n * validated at stage time (lengths, enums, micros, match types, resource-name\n * shapes, cross-field constraints); referential checks (customer scope, parent\n * existence, asset readiness) happen in the backend stage action on top of\n * these schemas.\n *\n * Money is in micros (major currency × 1,000,000) — the CLI converts before\n * staging so the contract, builders, and audit log all speak the API's units.\n */\nimport { z } from \"zod\";\nimport { biddingMatrixRefusal, embeddedTargetRefusal, PORTFOLIO_STRATEGY_TYPES } from \"./bidding-matrix\";\nimport {\n appCampaignSettingSchema,\n assetAutomationSchema,\n brandGuidelinesCreateSchema,\n brandGuidelinesUpdateSchema,\n campaignEnableBrandGuidelinesSchema,\n channelSettingsCreateIssues,\n dynamicSearchAdsSettingSchema,\n dynamicSearchAdsSettingUpdateSchema,\n frequencyCapsSchema,\n hotelSettingSchema,\n selectiveOptimizationSchema,\n shoppingSettingSchema,\n shoppingSettingUpdateSchema,\n travelCampaignSettingsSchema,\n} from \"./channel-settings\";\nimport { conversionUploadSchema } from \"./conversion-upload\";\nimport {\n bidModifierSchema,\n type CriterionSpec,\n criterionBidIssue,\n criterionBidModifierSchema,\n criterionLevelIssue,\n criterionSpecIssues,\n criterionSpecSchema,\n criterionTempRefs,\n} from \"./criteria\";\nimport {\n ACCELERATED_DELIVERY_MESSAGE,\n AD_GROUP_TYPES,\n ADVERTISING_CHANNEL_SUB_TYPES,\n ADVERTISING_CHANNEL_TYPES,\n ASSET_FIELD_TYPES,\n ASSET_GROUP_ASSET_FIELD_TYPES,\n BIDDING_STRATEGY_TYPES,\n BUDGET_DELIVERY_METHODS,\n BUSINESS_LOGO_LEVEL_MESSAGE,\n CALL_AD_RETIRED_MESSAGE,\n CAMPAIGN_OBJECTIVES,\n CHANNEL_CREATE_REFUSALS,\n CONVERSION_ACTION_CATEGORIES,\n CONVERSION_ACTION_TYPES,\n CONVERSION_COUNTING_TYPES,\n CONVERSION_ORIGINS,\n DEVICE_TYPES,\n demandGenOnlyStrategyRefusal,\n embeddedTargetOnDemandGenRefusal,\n GA4_CONVERSION_CREATE_MESSAGE,\n GOOGLE_ADS_LIMITS,\n type GoogleBiddingStrategyType,\n isImageAssetLinkFieldType,\n KEYWORD_MATCH_TYPES,\n LOOKALIKE_EXPANSION_LEVELS,\n manualCpcOnDemandGenRefusal,\n mergedTargetStrategyRefusal,\n NEGATIVE_GEO_TARGET_TYPES,\n NUMERIC_ID_REGEX,\n PINNED_FIELDS,\n PLAYBOOK_DAILY_BUDGET_FLOOR_MICROS,\n POSITIVE_GEO_TARGET_TYPES,\n RESOURCE_NAME_REGEX,\n retiredChoiceError,\n SHARED_SET_TYPES,\n STAGEABLE_CREATE_STATUSES,\n SUB_TYPE_CHANNEL,\n SUB_TYPE_CREATE_REFUSALS,\n TARGET_IMPRESSION_SHARE_LOCATIONS,\n TARGETING_DIMENSIONS,\n TEMP_REF_REGEX,\n USER_LIST_LOGICAL_OPERATORS,\n USER_LIST_NUMBER_OPERATORS,\n USER_LIST_STRING_OPERATORS,\n USER_LIST_TYPES,\n VIDEO_BRAND_SAFETY_LEVELS,\n} from \"./limits\";\nimport { canonicalStructuredSnippetHeader, STRUCTURED_SNIPPET_HEADERS_EN } from \"./structured-snippet-headers\";\n\n// --- Shared primitives ---\n\nexport const tempRefSchema = z.string().regex(TEMP_REF_REGEX, \"expected a g_temp_* reference\");\n\n/** A reference to another entity: a full resource name, a bare numeric id, or a g_temp_* ref staged earlier. */\nexport const refSchema = z.union([\n z.string().regex(RESOURCE_NAME_REGEX, \"expected a customers/…/…/… resource name\"),\n z.string().regex(NUMERIC_ID_REGEX, \"expected a numeric id\"),\n tempRefSchema,\n]);\n\n/** Update/status/remove targets: a real resource name or bare id, or a g_temp_* ref (AMENDS the staged create). */\nexport const targetRefSchema = refSchema;\n\nconst microsSchema = z.number().int().positive(\"expected a positive micros amount\");\nconst httpsUrlSchema = z\n .string()\n .url()\n .refine((u) => u.startsWith(\"https://\"), \"final URLs must be https\");\n\nconst customerIdSchema = z.string().regex(NUMERIC_ID_REGEX, \"customerId must be the bare numeric customer id\");\n\nconst stageableStatusSchema = z.enum(STAGEABLE_CREATE_STATUSES);\nconst matchTypeSchema = z.enum(KEYWORD_MATCH_TYPES);\n\n/**\n * `final_url_suffix` — bare query parameters appended to every final URL under the entity\n * (`utm_source=google&utm_agency=baker`). Not a URL and not a tracking template: a leading `?`\n * or `&` and a `{lpurl}` placeholder are both rejected by Google, so they are rejected here\n * before they can fail the whole atomic publish batch. The empty string clears the suffix.\n */\nexport const finalUrlSuffixSchema = z\n .string()\n .max(GOOGLE_ADS_LIMITS.campaign.finalUrlSuffixMax)\n .refine((s) => !/^[?&]/.test(s), \"drop the leading ? or & — a final URL suffix is bare query parameters\")\n .refine((s) => !s.includes(\"{lpurl}\"), \"{lpurl} belongs in a tracking template, not in a final URL suffix\")\n .refine((s) => !/\\s/.test(s), \"a final URL suffix cannot contain whitespace\")\n .refine((s) => s === \"\" || s.includes(\"=\"), 'expected key=value pairs, e.g. \"utm_source=google&utm_agency=baker\"');\n\n/** The ValueTrack tags that carry the landing page into a tracking template. */\nconst LANDING_PAGE_TAGS = [\"{lpurl}\", \"{unescapedlpurl}\", \"{escapedlpurl}\", \"{lpurl+2}\", \"{lpurl+3}\"];\n\n/**\n * `tracking_url_template` — the click-measurement URL every ad under the entity routes through.\n *\n * A template without a landing-page tag sends the click to the tracker and nowhere after it, which\n * Google rejects (and which would strand traffic if it didn't), so the tag is required here rather\n * than at publish where the rejection fails the whole atomic batch. The empty string clears the\n * template back to the account-level one.\n */\nexport const trackingUrlTemplateSchema = z\n .string()\n .max(GOOGLE_ADS_LIMITS.campaign.trackingUrlTemplateMax)\n .refine((t) => !/\\s/.test(t), \"a tracking template cannot contain whitespace\")\n .refine(\n (t) => t === \"\" || LANDING_PAGE_TAGS.some((tag) => t.includes(tag)),\n `a tracking template must carry the landing page through one of ${LANDING_PAGE_TAGS.join(\", \")}, e.g. \"https://tracker.example/?url={lpurl}\"`,\n )\n .refine(\n (t) => t === \"\" || /^(https?:\\/\\/|\\{)/.test(t),\n \"a tracking template must start with http://, https:// or a {lpurl} tag\",\n );\n\n/**\n * `url_custom_parameters` — the `{_name}` placeholders a tracking template or final URL can\n * reference. Google REPLACES the whole set on update, so an empty array clears them.\n */\nexport const urlCustomParametersSchema = z\n .array(\n z.strictObject({\n key: z\n .string()\n .min(1)\n .max(GOOGLE_ADS_LIMITS.campaign.urlCustomParameterKeyMax)\n .regex(/^[A-Za-z0-9_]+$/, \"a custom parameter key is letters, digits and underscores only\"),\n value: z.string().max(GOOGLE_ADS_LIMITS.campaign.urlCustomParameterValueMax),\n }),\n )\n .max(GOOGLE_ADS_LIMITS.campaign.urlCustomParametersMax)\n .refine(\n (params) => new Set(params.map((p) => p.key)).size === params.length,\n \"each custom parameter key can appear only once\",\n );\n\nconst keywordTextSchema = z\n .string()\n .min(1)\n .max(GOOGLE_ADS_LIMITS.keyword.textMax)\n .refine((t) => t.trim().split(/\\s+/).length <= GOOGLE_ADS_LIMITS.keyword.wordsMax, \"keyword exceeds 10 words\");\n\n// --- Campaign budget ---\n\nconst deliveryMethodSchema = z.enum(BUDGET_DELIVERY_METHODS, {\n error: retiredChoiceError({ ACCELERATED: ACCELERATED_DELIVERY_MESSAGE }),\n});\n\nexport const TOTAL_BUDGET_NOT_SHARED_MESSAGE =\n \"a total budget belongs to one campaign and cannot be shared — leave explicitlyShared out\";\nconst ONE_BUDGET_AMOUNT_MESSAGE =\n \"set amountMicros (a daily budget) OR totalAmountMicros (one total for the campaign's whole flight), not both\";\n\n/**\n * A daily budget (`amountMicros`) or a total budget (`totalAmountMicros`, Google's\n * `period: CUSTOM_PERIOD`): one total spent across the campaign's start and end dates. Google\n * refuses a total with a daily amount beside it, a shared total, and a total budget on a campaign\n * without an end date (live, v25); which campaign types take one is checked at stage.\n */\nexport const budgetCreateSchema = z\n .strictObject({\n name: z.string().min(1).max(GOOGLE_ADS_LIMITS.budget.nameMax),\n amountMicros: microsSchema.optional(),\n /** A total for the campaign's whole flight instead of a daily amount (needs the campaign's end date). */\n totalAmountMicros: microsSchema.optional(),\n deliveryMethod: deliveryMethodSchema.default(\"STANDARD\"),\n explicitlyShared: z.boolean().default(false),\n })\n .superRefine((p, ctx) => {\n if ((p.amountMicros === undefined) === (p.totalAmountMicros === undefined)) {\n ctx.addIssue({ code: \"custom\", path: [\"amountMicros\"], message: ONE_BUDGET_AMOUNT_MESSAGE });\n }\n if (p.totalAmountMicros !== undefined && p.explicitlyShared) {\n ctx.addIssue({ code: \"custom\", path: [\"explicitlyShared\"], message: TOTAL_BUDGET_NOT_SHARED_MESSAGE });\n }\n });\nexport type BudgetCreate = z.infer<typeof budgetCreateSchema>;\n\nexport const budgetUpdateSchema = z\n .strictObject({\n name: z.string().min(1).max(GOOGLE_ADS_LIMITS.budget.nameMax).optional(),\n amountMicros: microsSchema.optional(),\n /** A total budget's new total. A budget's kind (daily or total) never changes after it is created. */\n totalAmountMicros: microsSchema.optional(),\n deliveryMethod: deliveryMethodSchema.optional(),\n })\n .superRefine((p, ctx) => {\n if (Object.values(p).every((v) => v === undefined)) {\n ctx.addIssue({ code: \"custom\", message: \"update needs at least one field\" });\n }\n if (p.amountMicros !== undefined && p.totalAmountMicros !== undefined) {\n ctx.addIssue({ code: \"custom\", path: [\"amountMicros\"], message: ONE_BUDGET_AMOUNT_MESSAGE });\n }\n });\nexport type BudgetUpdate = z.infer<typeof budgetUpdateSchema>;\n\n// --- Bidding (inline standard strategy on a campaign) ---\n\n/**\n * Strict for the same reason as `networkSettings`: Target Impression Share goal keys\n * (`location`, `locationFractionMicros`) were stripped by a non-strict object, so the update\n * staged with no warning and published a campaign whose goal never changed.\n */\nexport const biddingConfigSchema = z\n .strictObject({\n type: z.enum(BIDDING_STRATEGY_TYPES),\n targetCpaMicros: microsSchema.optional(),\n targetRoas: z.number().positive().optional(),\n /** Demand Gen only — `Campaign.target_cpc.target_cpc_micros`. */\n targetCpcMicros: microsSchema.optional(),\n cpcBidCeilingMicros: microsSchema.optional(),\n enhancedCpcEnabled: z.boolean().optional(),\n /** Target impression share: where on the page the share is counted. */\n location: z.enum(TARGET_IMPRESSION_SHARE_LOCATIONS).optional(),\n /** Target impression share: the share to reach, in millionths (700000 = 70%). */\n locationFractionMicros: z.number().int().min(1).max(1_000_000).optional(),\n })\n .superRefine((p, ctx) => {\n if (p.type !== \"TARGET_IMPRESSION_SHARE\" && (p.location !== undefined || p.locationFractionMicros !== undefined)) {\n ctx.addIssue({\n code: \"custom\",\n path: [\"location\"],\n message: \"location and locationFractionMicros belong to TARGET_IMPRESSION_SHARE only\",\n });\n }\n if (p.type === \"TARGET_CPA\" && p.targetCpaMicros === undefined) {\n ctx.addIssue({ code: \"custom\", path: [\"targetCpaMicros\"], message: \"TARGET_CPA needs targetCpaMicros\" });\n }\n if (p.type === \"TARGET_ROAS\" && p.targetRoas === undefined) {\n ctx.addIssue({ code: \"custom\", path: [\"targetRoas\"], message: \"TARGET_ROAS needs targetRoas\" });\n }\n if (p.type === \"TARGET_CPC\" && p.targetCpcMicros === undefined) {\n ctx.addIssue({ code: \"custom\", path: [\"targetCpcMicros\"], message: \"TARGET_CPC needs targetCpcMicros\" });\n }\n });\nexport type BiddingConfig = z.infer<typeof biddingConfigSchema>;\n\nconst TARGET_IMPRESSION_SHARE_FIELDS = [\n [\"location\", \"where on the page — ANYWHERE_ON_PAGE, TOP_OF_PAGE or ABSOLUTE_TOP_OF_PAGE\"],\n [\"locationFractionMicros\", \"the share to reach, in millionths (700000 = 70%)\"],\n [\"cpcBidCeilingMicros\", \"the max CPC Google may bid to reach it\"],\n] as const;\n\n/**\n * Target impression share has no default for any of its three fields: a create carrying only the\n * type was answered REQUIRED on each (v25). An update that only moves the ceiling is fine — the\n * campaign already has the other two — so this applies to a NEW strategy only.\n */\nfunction addTargetImpressionShareIssues(bidding: BiddingConfig | undefined, path: string, ctx: z.RefinementCtx): void {\n if (bidding?.type !== \"TARGET_IMPRESSION_SHARE\") {\n return;\n }\n for (const [field, meaning] of TARGET_IMPRESSION_SHARE_FIELDS) {\n if (bidding[field] === undefined) {\n ctx.addIssue({\n code: \"custom\",\n path: [path, field],\n message: `Target impression share needs ${field}: ${meaning}`,\n });\n }\n }\n}\n\n// --- Campaign ---\n\n/**\n * `campaign.network_settings` — which networks the campaign serves on. Strict for the same reason\n * as `geoTargetTypeSetting`: a typo'd key inside a non-strict object was stripped silently, so the\n * command reported success and the campaign published on Google's networks instead of the staged ones.\n */\nconst networkSettingsSchema = z.strictObject({\n targetGoogleSearch: z.boolean().optional(),\n targetSearchNetwork: z.boolean().optional(),\n targetContentNetwork: z.boolean().optional(),\n targetPartnerSearchNetwork: z.boolean().optional(),\n});\nexport type NetworkSettings = z.infer<typeof networkSettingsSchema>;\n\n/**\n * What Baker sends for a SEARCH campaign create that states no networks. Google's own default turns\n * Search partners AND the Display network on, which is spend on surfaces nobody chose and an audit\n * finding on the next Session — so the unstated case means Google Search only, and widening is an\n * explicit `networkSettings` in the payload.\n *\n * SEARCH only: Display campaigns need `targetContentNetwork` on, and Performance Max does not take\n * network settings at all, so there is no single safe default to apply across channel types.\n * Applied on the way OUT — at publish and on the review card — never on the way in, so the draft\n * keeps recording what the agent actually asked for (same convention as CONVERSION_ACTION_CREATE_DEFAULTS).\n */\nexport const SEARCH_CAMPAIGN_NETWORK_DEFAULTS = {\n targetGoogleSearch: true,\n targetSearchNetwork: false,\n targetContentNetwork: false,\n targetPartnerSearchNetwork: false,\n} as const satisfies NetworkSettings;\n\n/** The network settings that actually reach Google for a campaign create; undefined leaves it unset. */\nexport function resolveCampaignNetworkSettings(\n channelType: string | undefined,\n staged: NetworkSettings | undefined,\n): NetworkSettings | undefined {\n if (staged) {\n return staged;\n }\n return channelType === \"SEARCH\" ? SEARCH_CAMPAIGN_NETWORK_DEFAULTS : undefined;\n}\n\nconst dateSchema = z.string().regex(/^\\d{4}-\\d{2}-\\d{2}$/, \"expected a YYYY-MM-DD date\");\n\n/**\n * `campaign.geo_target_type_setting` — how the campaign's location criteria are interpreted.\n * Strict, because the whole point of staging this is that a typo'd key used to vanish silently\n * and the campaign published on Google's default (`PRESENCE_OR_INTEREST`) instead.\n */\nconst geoTargetTypeSettingSchema = z\n .strictObject({\n positiveGeoTargetType: z.enum(POSITIVE_GEO_TARGET_TYPES).optional(),\n negativeGeoTargetType: z.enum(NEGATIVE_GEO_TARGET_TYPES).optional(),\n })\n .refine(\n (p) => p.positiveGeoTargetType !== undefined || p.negativeGeoTargetType !== undefined,\n \"geoTargetTypeSetting needs positiveGeoTargetType and/or negativeGeoTargetType\",\n );\nexport type GeoTargetTypeSetting = z.infer<typeof geoTargetTypeSettingSchema>;\n\n/**\n * Text guidelines: what the text Google writes for an AI Max or Performance Max campaign must avoid.\n * Each list REPLACES the campaign's whole list on publish; `[]` clears it, an omitted list is left\n * alone. A messaging restriction is sent as Google's only restriction type, `RESTRICTION_BASED_EXCLUSION`.\n */\nconst textGuidelinesSchema = z\n .strictObject({\n termExclusions: z\n .array(z.string().trim().min(1).max(GOOGLE_ADS_LIMITS.campaign.termExclusionMax))\n .max(GOOGLE_ADS_LIMITS.campaign.termExclusionsMax)\n .optional(),\n messagingRestrictions: z\n .array(z.string().trim().min(1).max(GOOGLE_ADS_LIMITS.campaign.messagingRestrictionMax))\n .max(GOOGLE_ADS_LIMITS.campaign.messagingRestrictionsMax)\n .refine(\n (rules) => new Set(rules.map((rule) => rule.toLowerCase())).size === rules.length,\n \"each messaging restriction must be unique\",\n )\n .optional(),\n })\n .refine(\n (p) => p.termExclusions !== undefined || p.messagingRestrictions !== undefined,\n \"textGuidelines needs termExclusions and/or messagingRestrictions\",\n );\nexport type TextGuidelines = z.infer<typeof textGuidelinesSchema>;\n\nexport const AI_MAX_TEXT_NEEDS_AI_MAX_MESSAGE =\n \"AI Max text customization only works with AI Max on: also turn AI Max on, or leave text customization off.\";\nexport const AI_MAX_URL_NEEDS_TEXT_MESSAGE =\n \"AI Max final URL expansion only works with text customization on: also turn text customization on, or leave URL expansion off.\";\n\n/**\n * AI Max on a Search campaign: the switch itself (`ai_max_setting.enable_ai_max`) and its two\n * opt-in features, text customization (`TEXT_ASSET_AUTOMATION`) and final URL expansion\n * (`FINAL_URL_EXPANSION_TEXT_ASSET_AUTOMATION`). An omitted field keeps the campaign's value.\n * Google refuses text customization without AI Max and URL expansion without text customization,\n * so a payload that states both halves of either pair contradictorily is refused here; a half the\n * payload leaves out is checked against the live campaign at stage time.\n */\nconst aiMaxSchema = z\n .strictObject({\n enabled: z.boolean().optional(),\n textCustomization: z.boolean().optional(),\n finalUrlExpansion: z.boolean().optional(),\n })\n .superRefine((p, ctx) => {\n if (p.enabled === undefined && p.textCustomization === undefined && p.finalUrlExpansion === undefined) {\n ctx.addIssue({ code: \"custom\", message: \"aiMax needs enabled, textCustomization and/or finalUrlExpansion\" });\n }\n if (p.enabled === false && p.textCustomization === true) {\n ctx.addIssue({ code: \"custom\", path: [\"textCustomization\"], message: AI_MAX_TEXT_NEEDS_AI_MAX_MESSAGE });\n }\n if (p.textCustomization === false && p.finalUrlExpansion === true) {\n ctx.addIssue({ code: \"custom\", path: [\"finalUrlExpansion\"], message: AI_MAX_URL_NEEDS_TEXT_MESSAGE });\n }\n });\nexport type AiMax = z.infer<typeof aiMaxSchema>;\n\nexport const AI_MAX_SEARCH_ONLY_MESSAGE = \"AI Max exists only on Search campaigns.\";\n\n/** Why a new campaign's AI Max can't be created as staged. A new campaign starts with AI Max and both features off. */\nfunction aiMaxCreateRefusal(channelType: string, aiMax: AiMax | undefined): string | undefined {\n if (!aiMax) {\n return undefined;\n }\n if (channelType !== \"SEARCH\") {\n return AI_MAX_SEARCH_ONLY_MESSAGE;\n }\n if (aiMax.enabled !== true && aiMax.textCustomization === true) {\n return AI_MAX_TEXT_NEEDS_AI_MAX_MESSAGE;\n }\n if (aiMax.textCustomization !== true && aiMax.finalUrlExpansion === true) {\n return AI_MAX_URL_NEEDS_TEXT_MESSAGE;\n }\n return undefined;\n}\n\n/**\n * Why a new campaign of this type cannot take this inline bidding, or undefined. A create carries its\n * own channel, so this is answerable at the schema — an update has to wait for the stage-time snapshot\n * to say what channel it is editing.\n */\nfunction createBiddingRefusal(\n channelType: string,\n channelSubType: string | undefined,\n bidding: BiddingConfig | undefined,\n): string | undefined {\n if (channelType === \"PERFORMANCE_MAX\" && bidding?.type === \"MANUAL_CPC\") {\n return \"Performance Max does not support Manual CPC\";\n }\n return (\n mergedTargetStrategyRefusal(channelType, bidding?.type) ??\n demandGenOnlyStrategyRefusal(channelType, bidding?.type) ??\n manualCpcOnDemandGenRefusal(channelType, bidding?.type) ??\n embeddedTargetOnDemandGenRefusal(channelType, bidding) ??\n biddingMatrixRefusal({ channelType, channelSubType, strategy: bidding?.type }) ??\n embeddedTargetRefusal(channelType, bidding)\n );\n}\n\n/**\n * Strict: an unknown key on a campaign payload is a hard stage-time error, never a silent drop.\n * A `--file` payload that named a field this contract does not carry (`geoTargetTypeSetting`\n * before it existed here) used to be stripped by zod, so the command reported success and the\n * campaign went live on Google's defaults. Failing loudly is what lets the agent correct itself.\n */\nexport const campaignCreateSchema = z\n .strictObject({\n name: z.string().min(1).max(GOOGLE_ADS_LIMITS.campaign.nameMax),\n channelType: z.enum(ADVERTISING_CHANNEL_TYPES, { error: retiredChoiceError(CHANNEL_CREATE_REFUSALS) }),\n channelSubType: z\n .enum(ADVERTISING_CHANNEL_SUB_TYPES, { error: retiredChoiceError(SUB_TYPE_CREATE_REFUSALS) })\n .optional(),\n budget: refSchema,\n /** Inline standard bidding, or a portfolio strategy ref via biddingStrategy. */\n bidding: biddingConfigSchema.optional(),\n biddingStrategy: refSchema.optional(),\n networkSettings: networkSettingsSchema.optional(),\n /**\n * \"Location options\". Omitted stages Google's own default — reach people *in or interested in*\n * the targeted locations — so pass `PRESENCE` explicitly when only people physically there count.\n */\n geoTargetTypeSetting: geoTargetTypeSettingSchema.optional(),\n startDate: dateSchema.optional(),\n endDate: dateSchema.optional(),\n /** Campaign-level override of the account's final URL suffix — REPLACES it, never merges. */\n finalUrlSuffix: finalUrlSuffixSchema.optional(),\n /** Campaign-level override of the account's tracking template — REPLACES it, never merges. */\n trackingUrlTemplate: trackingUrlTemplateSchema.optional(),\n /** The `{_name}` parameters this campaign's tracking template and final URLs can reference. */\n urlCustomParameters: urlCustomParametersSchema.optional(),\n /** Advisory Google Ads UI objective — drives warnings, not sent to the API. */\n objective: z.enum(CAMPAIGN_OBJECTIVES).optional(),\n /**\n * Whether the campaign contains EU political advertising. Google requires the declaration on\n * every campaign create (FieldError.REQUIRED without it); omitted means it does not.\n */\n euPoliticalAds: z.boolean().optional(),\n /** AI Max for Search. A new campaign has it off unless this turns it on. */\n aiMax: aiMaxSchema.optional(),\n /** Shopping (required) and Performance Max (optional, a retail campaign): the Merchant Center feed. */\n shoppingSetting: shoppingSettingSchema.optional(),\n /** App campaigns (MULTI_CHANNEL): the app, its store and the goal. Fixed at creation. */\n appCampaignSetting: appCampaignSettingSchema.optional(),\n /** App campaigns with an in-app or value goal: the app's conversion actions to optimize toward. */\n selectiveOptimization: selectiveOptimizationSchema.optional(),\n /** Travel campaigns: the linked travel account (Things to do). */\n travelCampaignSettings: travelCampaignSettingsSchema.optional(),\n /** Hotel campaigns: the linked Hotel Center account. */\n hotelSetting: hotelSettingSchema.optional(),\n /** Search: the site dynamic ads are built from. */\n dynamicSearchAdsSetting: dynamicSearchAdsSettingSchema.optional(),\n /** Display: how often one person sees the campaign's ads. */\n frequencyCaps: frequencyCapsSchema.optional(),\n /** Performance Max, or Search with AI Max + text customization: what Google's generated text must avoid. */\n textGuidelines: textGuidelinesSchema.optional(),\n /** Performance Max: what Google may generate (text, final URL expansion, image and video enhancements). */\n assetAutomation: assetAutomationSchema.optional(),\n /** Performance Max: brand guidelines (business name + logo as campaign assets, colors, font). */\n brandGuidelines: brandGuidelinesCreateSchema.optional(),\n status: stageableStatusSchema.default(\"PAUSED\"),\n })\n .superRefine((p, ctx) => {\n for (const issue of channelSettingsCreateIssues(p)) {\n ctx.addIssue({ code: \"custom\", path: issue.path, message: issue.message });\n }\n if (!p.bidding && !p.biddingStrategy) {\n ctx.addIssue({\n code: \"custom\",\n path: [\"bidding\"],\n message: \"set an inline bidding strategy or reference a portfolio biddingStrategy\",\n });\n }\n if (p.bidding && p.biddingStrategy) {\n ctx.addIssue({\n code: \"custom\",\n path: [\"bidding\"],\n message: \"use inline bidding OR a portfolio biddingStrategy, not both\",\n });\n }\n addTargetImpressionShareIssues(p.bidding, \"bidding\", ctx);\n const channelRefusal = createBiddingRefusal(p.channelType, p.channelSubType, p.bidding);\n if (channelRefusal) {\n ctx.addIssue({ code: \"custom\", path: [\"bidding\"], message: channelRefusal });\n }\n if (p.startDate && p.endDate && p.endDate <= p.startDate) {\n ctx.addIssue({ code: \"custom\", path: [\"endDate\"], message: \"endDate must be after startDate\" });\n }\n if (p.channelSubType && SUB_TYPE_CHANNEL[p.channelSubType] !== p.channelType) {\n ctx.addIssue({\n code: \"custom\",\n path: [\"channelSubType\"],\n message: `${p.channelSubType} is a ${SUB_TYPE_CHANNEL[p.channelSubType]} sub-type, not ${p.channelType} — leave the sub-type out for a standard ${p.channelType} campaign`,\n });\n }\n const aiMaxRefusal = aiMaxCreateRefusal(p.channelType, p.aiMax);\n if (aiMaxRefusal) {\n ctx.addIssue({ code: \"custom\", path: [\"aiMax\"], message: aiMaxRefusal });\n }\n });\nexport type CampaignCreate = z.infer<typeof campaignCreateSchema>;\n\nexport const campaignUpdateSchema = z\n .strictObject({\n name: z.string().min(1).max(GOOGLE_ADS_LIMITS.campaign.nameMax).optional(),\n budget: refSchema.optional(),\n /**\n * The campaign's own (standard) bidding. On a campaign that is on a portfolio strategy this also\n * takes it OFF the portfolio — the builder clears `bidding_strategy` with it.\n */\n bidding: biddingConfigSchema.optional(),\n /**\n * Moves the campaign onto a portfolio bidding strategy (a ref: staged create, id or resource name).\n * `\"\"` takes it off its portfolio — only beside `bidding`, the campaign's own bidding from then on\n * (staging adds it when `bidding` is staged on a campaign that is on a portfolio).\n */\n biddingStrategy: z.union([refSchema, z.literal(\"\")]).optional(),\n networkSettings: networkSettingsSchema.optional(),\n /** Switches an existing campaign between \"Presence or interest\" and \"Presence\". */\n geoTargetTypeSetting: geoTargetTypeSettingSchema.optional(),\n startDate: dateSchema.optional(),\n endDate: dateSchema.optional(),\n /** Campaign-level override of the account's final URL suffix. `\"\"` clears it back to the account value. */\n finalUrlSuffix: finalUrlSuffixSchema.optional(),\n /** Campaign-level tracking template. `\"\"` clears it back to the account value. */\n trackingUrlTemplate: trackingUrlTemplateSchema.optional(),\n /** Replaces the campaign's custom parameters wholesale; `[]` removes them all. */\n urlCustomParameters: urlCustomParametersSchema.optional(),\n /** Corrects the campaign's EU political advertising declaration (true = contains, false = does not). */\n euPoliticalAds: z.boolean().optional(),\n /** AI Max / Performance Max text guidelines. Google refuses them on a Search campaign without AI Max. */\n textGuidelines: textGuidelinesSchema.optional(),\n /** Turns AI Max or its features on or off. Search campaigns only (checked against the live channel). */\n aiMax: aiMaxSchema.optional(),\n /** Feed label (Shopping, Performance Max), priority and local inventory (Shopping). Checked against the live channel. */\n shoppingSetting: shoppingSettingUpdateSchema.optional(),\n /** Search: the site dynamic ads are built from (each field on its own). Checked against the live channel. */\n dynamicSearchAdsSetting: dynamicSearchAdsSettingUpdateSchema.optional(),\n /** Display / Video: REPLACES the campaign's caps; `[]` removes them. Checked against the live channel. */\n frequencyCaps: frequencyCapsSchema.optional(),\n /** Performance Max: switches Google's generated assets; the ones left out keep their live value. */\n assetAutomation: assetAutomationSchema.optional(),\n /** Performance Max with brand guidelines on: its brand colors and font. Turning them on is `enableBrandGuidelines`. */\n brandGuidelines: brandGuidelinesUpdateSchema.optional(),\n status: z.enum([\"ENABLED\", \"PAUSED\", \"REMOVED\"]).optional(),\n })\n .superRefine((p, ctx) => {\n if (Object.values(p).every((v) => v === undefined)) {\n ctx.addIssue({ code: \"custom\", message: \"update needs at least one field\" });\n }\n if (p.bidding && p.biddingStrategy) {\n ctx.addIssue({\n code: \"custom\",\n path: [\"biddingStrategy\"],\n message:\n \"use the campaign's own bidding OR a portfolio biddingStrategy, not both — own bidding takes the campaign off its portfolio\",\n });\n }\n if (p.biddingStrategy === \"\" && !p.bidding) {\n ctx.addIssue({\n code: \"custom\",\n path: [\"biddingStrategy\"],\n message:\n \"leaving a portfolio needs the campaign's own bidding — stage bidding (e.g. MAXIMIZE_CONVERSIONS) with it\",\n });\n }\n });\nexport type CampaignUpdate = z.infer<typeof campaignUpdateSchema>;\n\n// --- Account (customer) settings ---\n\n/**\n * The account-wide settings a `google.customer.update` stages — Google Ads \"Admin → Account\n * settings\". It rides the same `GoogleAdsService.Mutate` batch as every other staged op\n * (`customerOperation`, update only), so it is staged in the chat and applied at Publish like the rest.\n *\n * `callConversionAction` is deliberately absent: v25 refuses a write of\n * `call_reporting_setting.call_conversion_action` even when it names the action the account already\n * uses (\"The error code is not in this version.\"), so it is not stageable.\n */\nexport const customerUpdateSchema = z\n .strictObject({\n /** Auto-tagging: Google appends the `gclid` click id to every landing page. */\n autoTaggingEnabled: z.boolean().optional(),\n /** Account tracking template. Campaign, ad group and ad templates REPLACE it; `\"\"` clears it. */\n trackingUrlTemplate: trackingUrlTemplateSchema.optional(),\n /** Account final URL suffix. Campaign, ad group and ad suffixes REPLACE it; `\"\"` clears it. */\n finalUrlSuffix: finalUrlSuffixSchema.optional(),\n /** Call reporting: Google counts and reports calls from call assets. */\n callReportingEnabled: z.boolean().optional(),\n /** Whether calls from ads count as conversions (needs call reporting on). */\n callConversionReportingEnabled: z.boolean().optional(),\n /** The account's video inventory type (brand safety) for YouTube and video placements. */\n videoBrandSafety: z.enum(VIDEO_BRAND_SAFETY_LEVELS).optional(),\n })\n .superRefine((p, ctx) => {\n if (Object.values(p).every((v) => v === undefined)) {\n ctx.addIssue({ code: \"custom\", message: \"update needs at least one setting\" });\n }\n if (p.callReportingEnabled === false && p.callConversionReportingEnabled === true) {\n ctx.addIssue({\n code: \"custom\",\n path: [\"callConversionReportingEnabled\"],\n message: \"calls can count as conversions only while call reporting is on\",\n });\n }\n });\nexport type CustomerUpdate = z.infer<typeof customerUpdateSchema>;\n\nexport const CUSTOMER_TARGET_MESSAGE =\n \"an account settings change targets the account itself — set target to the same id as customerId\";\n\n// --- Ad group ---\n\nexport const adGroupCreateSchema = z.strictObject({\n name: z.string().min(1).max(GOOGLE_ADS_LIMITS.adGroup.nameMax),\n campaign: refSchema,\n /**\n * Optional, and NOT defaulted: Google derives an ad group's type from its campaign's channel when\n * it is unset, and for a Demand Gen campaign that is the only way to say it — the v23 enum has no\n * Demand Gen value at all. A default of `SEARCH_STANDARD` would state a type nobody chose on every\n * ad group Baker stages, which on a Demand Gen campaign is a whole-batch publish failure.\n */\n type: z.enum(AD_GROUP_TYPES).optional(),\n cpcBidMicros: microsSchema.optional(),\n status: stageableStatusSchema.default(\"PAUSED\"),\n});\nexport type AdGroupCreate = z.infer<typeof adGroupCreateSchema>;\n\n/** Strict for the same reason as `campaignUpdateSchema`: an unknown key here used to be dropped in silence. */\nexport const adGroupUpdateSchema = z\n .strictObject({\n name: z.string().min(1).max(GOOGLE_ADS_LIMITS.adGroup.nameMax).optional(),\n cpcBidMicros: microsSchema.optional(),\n status: z.enum([\"ENABLED\", \"PAUSED\", \"REMOVED\"]).optional(),\n })\n .refine((p) => Object.values(p).some((v) => v !== undefined), \"update needs at least one field\");\nexport type AdGroupUpdate = z.infer<typeof adGroupUpdateSchema>;\n\n// --- Keywords (ad-group criteria) ---\n\nexport const keywordAddSchema = z.strictObject({\n adGroup: refSchema,\n text: keywordTextSchema,\n matchType: matchTypeSchema,\n cpcBidMicros: microsSchema.optional(),\n finalUrls: z.array(httpsUrlSchema).optional(),\n status: stageableStatusSchema.default(\"ENABLED\"),\n});\nexport type KeywordAdd = z.infer<typeof keywordAddSchema>;\n\nexport const keywordUpdateSchema = z\n .strictObject({\n cpcBidMicros: microsSchema.optional(),\n finalUrls: z.array(httpsUrlSchema).optional(),\n status: z.enum([\"ENABLED\", \"PAUSED\", \"REMOVED\"]).optional(),\n })\n .refine((p) => Object.values(p).some((v) => v !== undefined), \"update needs at least one field\");\nexport type KeywordUpdate = z.infer<typeof keywordUpdateSchema>;\n\nexport const negativeKeywordAddSchema = z.strictObject({\n level: z.enum([\"adGroup\", \"campaign\"]),\n parent: refSchema,\n text: keywordTextSchema,\n matchType: matchTypeSchema,\n});\nexport type NegativeKeywordAdd = z.infer<typeof negativeKeywordAddSchema>;\n\n/**\n * A negative keyword's new text or match type. Google never changes either on a live criterion\n * (both are immutable), so this publishes as a REPLACE — the new negative created and the old one\n * removed in one all-or-nothing request, so the term is never left unexcluded. Staging fills the\n * field left out from the live negative.\n */\nexport const negativeKeywordUpdateSchema = z\n .strictObject({ text: keywordTextSchema.optional(), matchType: matchTypeSchema.optional() })\n .refine((p) => p.text !== undefined || p.matchType !== undefined, \"update needs text or matchType\");\nexport type NegativeKeywordUpdate = z.infer<typeof negativeKeywordUpdateSchema>;\n\n// --- Shared sets (keyword lists) ---\n\nexport const sharedSetCreateSchema = z.strictObject({\n name: z.string().min(1).max(GOOGLE_ADS_LIMITS.sharedSet.nameMax),\n type: z.enum(SHARED_SET_TYPES).default(\"NEGATIVE_KEYWORDS\"),\n});\nexport type SharedSetCreate = z.infer<typeof sharedSetCreateSchema>;\n\n/** A keyword list's new name — the only thing about a list Google lets change (its type is fixed). */\nexport const sharedSetUpdateSchema = z.strictObject({\n name: z.string().min(1).max(GOOGLE_ADS_LIMITS.sharedSet.nameMax),\n});\nexport type SharedSetUpdate = z.infer<typeof sharedSetUpdateSchema>;\n\n/**\n * A member of a shared list: a keyword (`text` + `matchType`) in a negative keyword list, or a\n * criterion — a placement, app, app category or YouTube channel/video in a NEGATIVE_PLACEMENTS list,\n * a brand in a BRANDS list. Which list type takes which member is checked at stage, where the list's\n * type is known.\n */\nexport const sharedSetMemberAddSchema = z\n .strictObject({\n sharedSet: refSchema,\n text: keywordTextSchema.optional(),\n matchType: matchTypeSchema.optional(),\n criterion: criterionSpecSchema.optional(),\n })\n .superRefine((val, ctx) => {\n const keyword = val.text !== undefined || val.matchType !== undefined;\n if (keyword === (val.criterion !== undefined)) {\n ctx.addIssue({\n code: \"custom\",\n path: [],\n message:\n \"a list member is either a keyword (text + matchType) or a criterion (a placement, app, YouTube channel/video or brand) — give exactly one\",\n });\n return;\n }\n if (keyword && (val.text === undefined || val.matchType === undefined)) {\n ctx.addIssue({\n code: \"custom\",\n path: [val.text === undefined ? \"text\" : \"matchType\"],\n message: \"a keyword member needs text and matchType\",\n });\n }\n if (val.criterion) {\n const message = criterionLevelIssue(val.criterion, \"sharedSet\") ?? criterionBidIssue(val.criterion, true);\n if (message) {\n ctx.addIssue({ code: \"custom\", path: [\"criterion\"], message });\n }\n }\n });\nexport type SharedSetMemberAdd = z.infer<typeof sharedSetMemberAddSchema>;\n\nexport const campaignSharedSetAttachSchema = z.strictObject({\n campaign: refSchema,\n sharedSet: refSchema,\n});\nexport type CampaignSharedSetAttach = z.infer<typeof campaignSharedSetAttachSchema>;\n\n// --- Ads (asset-based, discriminated on format) ---\n\nconst adTextAssetSchema = z.strictObject({\n text: z.string().min(1),\n pinnedField: z.enum(PINNED_FIELDS).optional(),\n});\n\n/**\n * Every ad-content format is STRICT. An ad's creative lives in format-specific fields\n * (`images` on an App ad, `marketingImageAssets` on a Display ad, …), so a payload that names the\n * wrong one used to parse clean — zod dropped the unknown key, the derived updateMask never\n * mentioned the image field, and publish shipped headlines only while every staged image was\n * created in the account and attached to nothing. Rejecting the unknown key is the only place that\n * failure is visible; by publish the agent is long gone.\n */\nconst responsiveSearchAdSchema = z.strictObject({\n format: z.literal(\"responsiveSearch\"),\n headlines: z\n .array(\n adTextAssetSchema.refine(\n (a) => a.text.length <= GOOGLE_ADS_LIMITS.responsiveSearchAd.headlineTextMax,\n \"headline exceeds 30 chars\",\n ),\n )\n .min(GOOGLE_ADS_LIMITS.responsiveSearchAd.headlinesMin)\n .max(GOOGLE_ADS_LIMITS.responsiveSearchAd.headlinesMax),\n descriptions: z\n .array(\n adTextAssetSchema.refine(\n (a) => a.text.length <= GOOGLE_ADS_LIMITS.responsiveSearchAd.descriptionTextMax,\n \"description exceeds 90 chars\",\n ),\n )\n .min(GOOGLE_ADS_LIMITS.responsiveSearchAd.descriptionsMin)\n .max(GOOGLE_ADS_LIMITS.responsiveSearchAd.descriptionsMax),\n path1: z.string().max(GOOGLE_ADS_LIMITS.responsiveSearchAd.pathMax).optional(),\n path2: z.string().max(GOOGLE_ADS_LIMITS.responsiveSearchAd.pathMax).optional(),\n finalUrls: z.array(httpsUrlSchema).min(1),\n});\n\nconst responsiveDisplayAdSchema = z.strictObject({\n format: z.literal(\"responsiveDisplay\"),\n headlines: z\n .array(z.strictObject({ text: z.string().min(1).max(GOOGLE_ADS_LIMITS.responsiveDisplayAd.headlineTextMax) }))\n .min(1)\n .max(5),\n longHeadline: z.strictObject({\n text: z.string().min(1).max(GOOGLE_ADS_LIMITS.responsiveDisplayAd.longHeadlineTextMax),\n }),\n descriptions: z\n .array(z.strictObject({ text: z.string().min(1).max(GOOGLE_ADS_LIMITS.responsiveDisplayAd.descriptionTextMax) }))\n .min(1)\n .max(5),\n businessName: z.string().min(1).max(GOOGLE_ADS_LIMITS.responsiveDisplayAd.businessNameMax),\n // A Responsive Display Ad's images are fields on the ad's own content (never campaign-level\n // asset links). Google requires ≥1 landscape marketing image (1.91:1) AND ≥1 square marketing\n // image (1:1) to serve; the logo images are optional.\n marketingImageAssets: z.array(refSchema).optional(),\n squareMarketingImageAssets: z.array(refSchema).optional(),\n logoImageAssets: z.array(refSchema).optional(),\n finalUrls: z.array(httpsUrlSchema).min(1),\n});\n\n/**\n * An App ad's counts were unbounded here until a publish carrying 6 descriptions came back as the\n * bare word \"Too many.\" — Google's whole-batch rejection names no field, no count, and no limit, and\n * by then every image asset in the same draft had already been created in the account. The caps are\n * cheap to enforce at stage time and unreadable at publish.\n */\nconst appAdSchema = z.strictObject({\n format: z.literal(\"app\"),\n headlines: z\n .array(z.strictObject({ text: z.string().min(1).max(GOOGLE_ADS_LIMITS.appAd.headlineTextMax) }))\n .min(GOOGLE_ADS_LIMITS.appAd.headlinesMin)\n .max(GOOGLE_ADS_LIMITS.appAd.headlinesMax),\n descriptions: z\n .array(z.strictObject({ text: z.string().min(1).max(GOOGLE_ADS_LIMITS.appAd.descriptionTextMax) }))\n .min(GOOGLE_ADS_LIMITS.appAd.descriptionsMin)\n .max(GOOGLE_ADS_LIMITS.appAd.descriptionsMax),\n // An App campaign ad carries its images on its own content (`AppAdInfo.images`), not as\n // campaign-level asset links — same shape as a responsive display ad's marketing images.\n images: z.array(refSchema).max(GOOGLE_ADS_LIMITS.appAd.imagesMax).optional(),\n // `AppAdInfo.youtube_videos` — an App ad's videos live on its content too. Without this field\n // there is no way to express \"keep these videos on the ad\", so a content update that only\n // restated headlines silently left the ad's videos to whatever the mask happened to omit.\n youtubeVideos: z.array(refSchema).max(GOOGLE_ADS_LIMITS.appAd.youtubeVideosMax).optional(),\n});\n\nconst videoAdSchema = z.strictObject({\n format: z.literal(\"video\"),\n // A raw YouTube id is not a publishable Google Ads reference — the video must be staged as\n // its own `google.asset.create` (type: youtubeVideo) first, then referenced here by asset ref.\n videoAssets: z.array(refSchema).min(1),\n /**\n * Google requires both since v24 (`VideoResponsiveAdInfo.business_name` / `.logo_images`). Optional\n * here for the same reason as a Demand Gen video ad's media: an update masks only what it sends.\n * A create without them is refused at stage (`videoAdCreateRefusal`, backend `adFormatMatch.ts`).\n * The business name is an `AdTextAsset` on the wire, held to the Demand Gen video ad's 25 characters.\n */\n businessName: z.string().min(1).max(GOOGLE_ADS_LIMITS.demandGenVideoAd.businessNameMax).optional(),\n logoImageAssets: z.array(refSchema).optional(),\n finalUrls: z.array(httpsUrlSchema).min(1),\n});\n\nconst demandGenAdSchema = z.strictObject({\n format: z.literal(\"demandGen\"),\n /**\n * `Ad.name`. Accepted here but NOT required: a multi-asset Demand Gen ad published against a live\n * account with no name was created, and reads back with none. Only the video format requires one.\n */\n name: z.string().min(1).max(GOOGLE_ADS_LIMITS.demandGenAd.adNameMax).optional(),\n headlines: z\n .array(z.strictObject({ text: z.string().min(1).max(GOOGLE_ADS_LIMITS.demandGenAd.headlineTextMax) }))\n .min(GOOGLE_ADS_LIMITS.demandGenAd.headlinesMin)\n .max(GOOGLE_ADS_LIMITS.demandGenAd.headlinesMax),\n descriptions: z\n .array(z.strictObject({ text: z.string().min(1).max(GOOGLE_ADS_LIMITS.demandGenAd.descriptionTextMax) }))\n .min(GOOGLE_ADS_LIMITS.demandGenAd.descriptionsMin)\n .max(GOOGLE_ADS_LIMITS.demandGenAd.descriptionsMax),\n businessName: z.string().min(1).max(GOOGLE_ADS_LIMITS.demandGenAd.businessNameMax),\n finalUrls: z.array(httpsUrlSchema).min(1),\n imageAssets: z.array(refSchema).optional(),\n squareImageAssets: z.array(refSchema).optional(),\n logoImageAssets: z.array(refSchema).optional(),\n});\n\n/**\n * The Demand Gen ad that runs a video (`DEMAND_GEN_VIDEO_RESPONSIVE_AD`). It is its own format\n * rather than a few optional fields on `demandGen` because Google gives it a different message\n * (`demandGenVideoResponsiveAd`), a `longHeadlines` list no other Demand Gen ad has, and a\n * `businessName` that is a text ASSET rather than a bare string. Folding the two together would put\n * `longHeadlines` on a payload that publishes into a message with no such field.\n *\n * `videoAssets` / `logoImageAssets` / `callToActionAssets` are optional so a copy-only edit can omit\n * them: an ad update masks only the fields it sends, so an omitted media list is left as it is on\n * the ad (the same contract as an App ad's `images`). A CREATE needs a video and a logo (required by\n * Google since v24) — `demandGenVideoCreateRefusal` (backend `adFormatMatch.ts`) says so at stage.\n */\nconst demandGenVideoAdSchema = z.strictObject({\n format: z.literal(\"demandGenVideo\"),\n /**\n * `Ad.name` — the ad's own name, which Google REQUIRES on this format and asks for in its\n * interface as \"Ad name\". No other format Baker writes needs one (the multi-asset Demand Gen ad\n * was published without one and accepted), so nothing carried it: a create without it comes back\n * as `REQUIRED … at mutate_operations[n].ad_group_ad_operation.create.ad.name`, after every asset\n * in the same batch has already been created. Optional in the schema because `Ad.name` is\n * IMMUTABLE — an update must be able to restate the whole content without renaming the ad.\n */\n name: z.string().min(1).max(GOOGLE_ADS_LIMITS.demandGenVideoAd.adNameMax).optional(),\n headlines: z\n .array(z.strictObject({ text: z.string().min(1).max(GOOGLE_ADS_LIMITS.demandGenVideoAd.headlineTextMax) }))\n .min(GOOGLE_ADS_LIMITS.demandGenVideoAd.headlinesMin)\n .max(GOOGLE_ADS_LIMITS.demandGenVideoAd.headlinesMax),\n longHeadlines: z\n .array(z.strictObject({ text: z.string().min(1).max(GOOGLE_ADS_LIMITS.demandGenVideoAd.longHeadlineTextMax) }))\n .min(GOOGLE_ADS_LIMITS.demandGenVideoAd.longHeadlinesMin)\n .max(GOOGLE_ADS_LIMITS.demandGenVideoAd.longHeadlinesMax),\n descriptions: z\n .array(z.strictObject({ text: z.string().min(1).max(GOOGLE_ADS_LIMITS.demandGenVideoAd.descriptionTextMax) }))\n .min(GOOGLE_ADS_LIMITS.demandGenVideoAd.descriptionsMin)\n .max(GOOGLE_ADS_LIMITS.demandGenVideoAd.descriptionsMax),\n businessName: z.string().min(1).max(GOOGLE_ADS_LIMITS.demandGenVideoAd.businessNameMax),\n finalUrls: z.array(httpsUrlSchema).min(1),\n videoAssets: z.array(refSchema).optional(),\n logoImageAssets: z.array(refSchema).optional(),\n callToActionAssets: z.array(refSchema).optional(),\n});\n\n/**\n * Formats Google no longer accepts, and what to do instead — answered in place of zod's bare\n * \"invalid discriminator\", because the agent's next move depends on the route, not the verdict.\n */\nconst RETIRED_AD_FORMATS: Readonly<Record<string, string>> = {\n call: CALL_AD_RETIRED_MESSAGE,\n};\n\n/**\n * A Shopping campaign's product ad. It carries no copy: Google builds each ad from the Merchant\n * Center product it shows, so the format is the whole content.\n */\nconst shoppingProductAdSchema = z.strictObject({ format: z.literal(\"shoppingProduct\") });\n\nexport const SHOPPING_PRODUCT_AD_UPDATE_MESSAGE =\n \"A Shopping product ad has no copy to change — its title, image and price come from the Merchant Center feed. Change the product in Merchant Center, or pause or resume the ad.\";\n\nexport const adContentSchema = z.discriminatedUnion(\n \"format\",\n [\n responsiveSearchAdSchema,\n responsiveDisplayAdSchema,\n appAdSchema,\n videoAdSchema,\n demandGenAdSchema,\n demandGenVideoAdSchema,\n shoppingProductAdSchema,\n ],\n {\n error: (issue) => {\n const input = issue.input;\n const format = typeof input === \"object\" && input !== null ? (input as { format?: unknown }).format : undefined;\n return typeof format === \"string\" ? RETIRED_AD_FORMATS[format] : undefined;\n },\n },\n);\nexport type AdContent = z.infer<typeof adContentSchema>;\nexport type AdFormat = AdContent[\"format\"];\n\nexport const APP_AD_PAUSED_MESSAGE =\n \"An App ad cannot be created paused — Google refuses it (AD_TYPE_CANNOT_BE_PAUSED). Stage it ENABLED (`--status ENABLED`); it serves only once its ad group and campaign are enabled, so keep those paused until the user is ready.\";\n\nexport const adCreateSchema = z\n .strictObject({\n adGroup: refSchema,\n status: stageableStatusSchema.default(\"PAUSED\"),\n content: adContentSchema,\n })\n .refine((p) => !(p.content.format === \"app\" && p.status === \"PAUSED\"), {\n message: APP_AD_PAUSED_MESSAGE,\n path: [\"status\"],\n });\nexport type AdCreate = z.infer<typeof adCreateSchema>;\n\nexport const adUpdateSchema = z\n .strictObject({\n status: z.enum([\"ENABLED\", \"PAUSED\", \"REMOVED\"]).optional(),\n /** Whole-content replacement for RSA-like formats; re-validated against adContentSchema. */\n content: z.record(z.string(), z.unknown()).optional(),\n })\n .refine((p) => Object.values(p).some((v) => v !== undefined), \"update needs at least one field\")\n .refine((p) => p.content?.format !== \"shoppingProduct\", {\n message: SHOPPING_PRODUCT_AD_UPDATE_MESSAGE,\n path: [\"content\"],\n });\nexport type AdUpdate = z.infer<typeof adUpdateSchema>;\n\n// --- Assets & extensions ---\n\nconst textAssetSchema = z.strictObject({ type: z.literal(\"text\"), text: z.string().min(1) });\nconst imageAssetSchema = z.strictObject({\n type: z.literal(\"image\"),\n imageId: z.string().min(1),\n name: z.string().optional(),\n});\nconst youtubeVideoAssetSchema = z.strictObject({\n type: z.literal(\"youtubeVideo\"),\n youtubeVideoId: z.string().min(1),\n name: z.string().optional(),\n});\nconst sitelinkAssetSchema = z.strictObject({\n type: z.literal(\"sitelink\"),\n linkText: z.string().min(1).max(GOOGLE_ADS_LIMITS.asset.sitelinkLinkTextMax),\n description1: z.string().max(GOOGLE_ADS_LIMITS.asset.sitelinkDescriptionMax).optional(),\n description2: z.string().max(GOOGLE_ADS_LIMITS.asset.sitelinkDescriptionMax).optional(),\n finalUrls: z.array(httpsUrlSchema).min(1),\n});\nconst calloutAssetSchema = z.strictObject({\n type: z.literal(\"callout\"),\n calloutText: z.string().min(1).max(GOOGLE_ADS_LIMITS.asset.calloutTextMax),\n});\n/**\n * A structured snippet header is not free text: Google accepts only its own\n * published headers (or their translations) and rejects anything else at publish\n * with an error naming neither the field nor the list. Checked here so an\n * invented header can never be staged, and rewritten to Google's spelling so a\n * casing difference is not a lost asset.\n *\n * The list IS the length limit, so there is no `max()` in front of it. There was\n * one, borrowed from the 25-character cap on a snippet's VALUES, and it made the\n * Russian \"Degree programs\" (29 characters) the one published header Baker could\n * not stage. A cap in front of a closed vocabulary can only reject things the\n * vocabulary already accepts.\n */\nconst structuredSnippetHeaderSchema = z\n .string()\n .min(1)\n .transform((header, ctx) => {\n const canonical = canonicalStructuredSnippetHeader(header);\n if (!canonical) {\n ctx.addIssue({\n code: \"custom\",\n message:\n `Google Ads does not accept \"${header}\" as a structured snippet header. Use one of: ` +\n `${STRUCTURED_SNIPPET_HEADERS_EN.join(\", \")} — or that header in the campaign's language.`,\n });\n return z.NEVER;\n }\n return canonical;\n });\n\nconst structuredSnippetAssetSchema = z.strictObject({\n type: z.literal(\"structuredSnippet\"),\n header: structuredSnippetHeaderSchema,\n values: z\n .array(z.string().min(1).max(GOOGLE_ADS_LIMITS.asset.structuredSnippetValueMax))\n .min(GOOGLE_ADS_LIMITS.asset.structuredSnippetValuesMin)\n .max(GOOGLE_ADS_LIMITS.asset.structuredSnippetValuesMax),\n});\nconst callToActionAssetSchema = z.strictObject({ type: z.literal(\"callToAction\"), callToAction: z.string().min(1) });\n\nexport const assetCreateSchema = z.discriminatedUnion(\"type\", [\n textAssetSchema,\n imageAssetSchema,\n youtubeVideoAssetSchema,\n sitelinkAssetSchema,\n calloutAssetSchema,\n structuredSnippetAssetSchema,\n callToActionAssetSchema,\n]);\nexport type AssetCreate = z.infer<typeof assetCreateSchema>;\n\n/**\n * Flat partial of the mutable fields across every asset type — the caller doesn't repeat the\n * asset's `type` discriminant to amend it. Live publish maps fields to their sub-message via an\n * updateMask (`sitelinkAsset.linkText`, `calloutAsset.calloutText`, …); Google mutates any asset\n * subtype through the same `AssetOperation.update`, and only the fields actually set are masked.\n */\nexport const assetUpdateSchema = z\n .strictObject({\n name: z.string().min(1).optional(),\n linkText: z.string().min(1).max(GOOGLE_ADS_LIMITS.asset.sitelinkLinkTextMax).optional(),\n description1: z.string().max(GOOGLE_ADS_LIMITS.asset.sitelinkDescriptionMax).optional(),\n description2: z.string().max(GOOGLE_ADS_LIMITS.asset.sitelinkDescriptionMax).optional(),\n finalUrls: z.array(httpsUrlSchema).min(1).optional(),\n calloutText: z.string().min(1).max(GOOGLE_ADS_LIMITS.asset.calloutTextMax).optional(),\n header: structuredSnippetHeaderSchema.optional(),\n values: z\n .array(z.string().min(1).max(GOOGLE_ADS_LIMITS.asset.structuredSnippetValueMax))\n .min(GOOGLE_ADS_LIMITS.asset.structuredSnippetValuesMin)\n .max(GOOGLE_ADS_LIMITS.asset.structuredSnippetValuesMax)\n .optional(),\n callToAction: z.string().min(1).optional(),\n text: z.string().min(1).optional(),\n })\n .refine((p) => Object.values(p).some((v) => v !== undefined), \"update needs at least one field\");\nexport type AssetUpdate = z.infer<typeof assetUpdateSchema>;\n\nexport const assetLinkAttachSchema = z\n .strictObject({\n level: z.enum([\"campaign\", \"adGroup\", \"customer\"]),\n parent: refSchema.optional(),\n asset: refSchema,\n // A plain string, not `z.enum(ASSET_FIELD_TYPES)`, so the image refusal below can answer with\n // the reason instead of an enum listing. An agent reaching for AD_IMAGE is following Google's\n // own documentation; \"Invalid option: expected one of …\" sends it to guess another field type,\n // which is the failure this whole refusal exists to end.\n fieldType: z.string().min(1),\n })\n .superRefine((value, ctx) => {\n // Customer-level links attach account-wide; campaign/adGroup links without a parent\n // build a mutate operation missing its required campaign/adGroup and fail at publish.\n if (value.level !== \"customer\" && !value.parent) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: [\"parent\"],\n message: `parent is required for a ${value.level}-level asset link (--parent-ref)`,\n });\n }\n if (value.fieldType === \"BUSINESS_LOGO\" && value.level === \"adGroup\") {\n ctx.addIssue({ code: z.ZodIssueCode.custom, path: [\"fieldType\"], message: BUSINESS_LOGO_LEVEL_MESSAGE });\n } else if (isImageAssetLinkFieldType(value.fieldType)) {\n // Parses, and is decided at stage time: AD_IMAGE is asked of Google per account and stages or\n // hands over; a marketing-image type is sent back to AD_IMAGE. Refusing it HERE cost the user the\n // handover: a schema refusal leaves no chat to record against, and a batch carrying sitelinks\n // alongside the image failed whole. See `ads/google/writes/stage.ts`.\n } else if (!(ASSET_FIELD_TYPES as readonly string[]).includes(value.fieldType)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: [\"fieldType\"],\n message: `expected one of ${ASSET_FIELD_TYPES.join(\" | \")}`,\n });\n }\n });\nexport type AssetLinkAttach = z.infer<typeof assetLinkAttachSchema>;\n\n// --- Performance Max asset groups ---\n\n/**\n * A Performance Max asset group — its own entity, not an ad format. Publish synthesizes a text\n * asset per headline/longHeadline/description/businessName plus one `AssetGroupAsset` link per\n * asset (see the publish builder); staging here only carries the group's copy + image refs.\n */\nexport const assetGroupCreateSchema = z.strictObject({\n campaign: refSchema,\n name: z.string().min(1).max(GOOGLE_ADS_LIMITS.assetGroup.nameMax),\n finalUrls: z.array(httpsUrlSchema).min(1),\n headlines: z\n .array(z.strictObject({ text: z.string().min(1).max(GOOGLE_ADS_LIMITS.assetGroup.headlineTextMax) }))\n .min(GOOGLE_ADS_LIMITS.assetGroup.headlinesMin)\n .max(GOOGLE_ADS_LIMITS.assetGroup.headlinesMax),\n longHeadlines: z\n .array(z.strictObject({ text: z.string().min(1).max(GOOGLE_ADS_LIMITS.assetGroup.longHeadlineTextMax) }))\n .min(GOOGLE_ADS_LIMITS.assetGroup.longHeadlinesMin)\n .max(GOOGLE_ADS_LIMITS.assetGroup.longHeadlinesMax),\n descriptions: z\n .array(z.strictObject({ text: z.string().min(1).max(GOOGLE_ADS_LIMITS.assetGroup.descriptionTextMax) }))\n .min(GOOGLE_ADS_LIMITS.assetGroup.descriptionsMin)\n .max(GOOGLE_ADS_LIMITS.assetGroup.descriptionsMax),\n businessName: z.string().min(1).max(GOOGLE_ADS_LIMITS.assetGroup.businessNameMax),\n imageAssets: z.array(refSchema).optional(),\n squareImageAssets: z.array(refSchema).optional(),\n portraitImageAssets: z.array(refSchema).optional(),\n logoAssets: z.array(refSchema).optional(),\n status: z.enum([\"ENABLED\", \"PAUSED\"]).default(\"PAUSED\"),\n});\nexport type AssetGroupCreate = z.infer<typeof assetGroupCreateSchema>;\n\n/**\n * Link one already-existing asset into an already-existing asset group. `assetGroup.create` links a\n * group's opening set of assets inline, and `assetLink.attach` covers campaign/adGroup/customer\n * links — neither can touch the assets of a group that is already live, which is what a creative\n * refresh actually is. Detach is the plain target-only twin (`google.assetGroupAsset.detach`), whose\n * target is the composite `customers/{cid}/assetGroupAssets/{group}~{asset}~{FIELD_TYPE}`.\n *\n * Swapping a creative is attach-then-detach, and the order they are STAGED in is the order they\n * publish in — `planBatchWindows` sorts by stage index and Google Ads removals carry no dependency\n * edge (docs/publishing.md → Known gap). Detach staged first therefore reaches Google first, and if\n * it was the last asset of that field type the group drops below its per-ratio minimum and the\n * operation is rejected. The attach has to be staged first; nothing reorders it for you.\n */\nexport const assetGroupAssetAttachSchema = z.strictObject({\n assetGroup: refSchema,\n asset: refSchema,\n fieldType: z.enum(ASSET_GROUP_ASSET_FIELD_TYPES),\n});\nexport type AssetGroupAssetAttach = z.infer<typeof assetGroupAssetAttachSchema>;\n\nexport const assetGroupUpdateSchema = z\n .strictObject({\n name: z.string().min(1).max(GOOGLE_ADS_LIMITS.assetGroup.nameMax).optional(),\n finalUrls: z.array(httpsUrlSchema).min(1).optional(),\n status: z.enum([\"ENABLED\", \"PAUSED\", \"REMOVED\"]).optional(),\n })\n .refine((p) => Object.values(p).some((v) => v !== undefined), \"update needs at least one field\");\nexport type AssetGroupUpdate = z.infer<typeof assetGroupUpdateSchema>;\n\n// --- Audiences (user lists) & audience criteria ---\n\n/**\n * One condition a visitor has to meet: a page-URL (`url__`), referrer (`ref_url__`) or custom\n * parameter compared to a value. A text value is a string rule item, a number a number one.\n */\nconst audienceRuleConditionSchema = z.union([\n z.strictObject({\n name: z.string().min(1).default(\"url__\"),\n operator: z.enum(USER_LIST_STRING_OPERATORS),\n value: z.string().min(1),\n }),\n z.strictObject({\n name: z.string().min(1),\n operator: z.enum(USER_LIST_NUMBER_OPERATORS),\n value: z.number(),\n }),\n]);\n\n/**\n * One group of conditions a visitor meets ALL of, within a lookback window. \"Any of\" is several\n * groups under `combine: \"ANY\"`: Google allows one rule-item group per operand, and answered a\n * second one with `TOO_MANY` on `inclusive_operands` (live, v25).\n */\nconst audienceRuleOperandSchema = z.strictObject({\n conditions: z.array(audienceRuleConditionSchema).min(1),\n lookbackWindowDays: z.number().int().min(1).max(GOOGLE_ADS_LIMITS.audience.membershipLifeSpanDaysMax).optional(),\n});\n\n/**\n * A website-visitor list (`rule_based_user_list.flexible_rule_user_list`): people who meet the\n * `include` groups (`ANY` of them by default, or `ALL`) and none of the `exclude` ones. `prefill`\n * asks Google to fill it with the last 30 days of visitors instead of starting empty.\n */\nconst audienceRuleSchema = z.strictObject({\n include: z.array(audienceRuleOperandSchema).min(1),\n combine: z.enum([\"ALL\", \"ANY\"]).default(\"ANY\"),\n exclude: z.array(audienceRuleOperandSchema).optional(),\n prefill: z.boolean().optional(),\n});\nexport type AudienceRule = z.infer<typeof audienceRuleSchema>;\n\n/** A reference that has to name something already in the account — a resource name or a bare id. */\nfunction existingRefSchema(message: string) {\n return z.union([z.string().regex(RESOURCE_NAME_REGEX), z.string().regex(NUMERIC_ID_REGEX)], { error: message });\n}\n\nexport const LOGICAL_OPERAND_MESSAGE =\n \"a combined audience can only be made of audiences that already exist in the account — Google does not find one staged in this same draft. Publish those first, then stage the combination.\";\n\nexport const BASIC_ACTION_MESSAGE =\n \"a converters audience can only be built from conversion actions that already exist in the account — Google refuses one staged in this same draft. Publish the conversion action first, then stage the audience.\";\n\n/** A combined audience: each rule takes ALL, ANY or NONE of its audiences, and every rule must hold. */\nconst audienceLogicSchema = z\n .array(\n z.strictObject({\n operator: z.enum(USER_LIST_LOGICAL_OPERATORS),\n audiences: z.array(existingRefSchema(LOGICAL_OPERAND_MESSAGE)).min(1),\n }),\n )\n .min(1);\n\nexport const LOOKALIKE_SEED_MESSAGE =\n \"a lookalike's seed audiences must already exist in the account — Google takes them by id, which an audience staged in this draft does not have until it publishes. Publish the seed first, then stage the lookalike.\";\n\n/**\n * A lookalike (`lookalike_user_list`, Demand Gen only): people like the seed audiences, in the\n * given countries, reaching as far as `expansion` says.\n */\nconst audienceLookalikeSchema = z.strictObject({\n seedAudiences: z.array(existingRefSchema(LOOKALIKE_SEED_MESSAGE)).min(1),\n expansion: z.enum(LOOKALIKE_EXPANSION_LEVELS).default(\"BALANCED\"),\n countryCodes: z.array(z.string().regex(/^[A-Z]{2}$/, \"a two-letter country code, e.g. ES\")).optional(),\n});\n\n/** What each list type is built from — the one payload field it needs, and nobody else may carry. */\nconst AUDIENCE_TYPE_SOURCE: Readonly<Record<(typeof USER_LIST_TYPES)[number], string | undefined>> = {\n CRM_BASED: undefined,\n RULE_BASED: \"rule\",\n LOGICAL: \"logic\",\n BASIC: \"conversionActions\",\n LOOKALIKE: \"lookalike\",\n};\n\nconst AUDIENCE_SOURCE_NEEDED: Readonly<Record<string, string>> = {\n rule: 'a website-visitor audience (RULE_BASED) needs a \"rule\" — who joins, e.g. {\"include\":[{\"conditions\":[{\"operator\":\"CONTAINS\",\"value\":\"/pricing\"}]}]}',\n logic:\n 'a combined audience (LOGICAL) needs \"logic\" — the audiences it is made of, e.g. [{\"operator\":\"ANY\",\"audiences\":[\"<audience id>\",\"<audience id>\"]}]',\n conversionActions:\n 'a converters audience (BASIC) needs \"conversionActions\" — the conversion actions whose converters join it (Google refuses one with none)',\n lookalike:\n 'a lookalike audience needs \"lookalike\" — {\"seedAudiences\":[\"<audience id>\"],\"expansion\":\"BALANCED\",\"countryCodes\":[\"ES\"]}',\n};\n\n/** Why a membership duration cannot be staged on this list type, or undefined to stage it. */\nfunction membershipLifeSpanRefusal(type: (typeof USER_LIST_TYPES)[number]): string | undefined {\n if (type === \"RULE_BASED\") {\n return \"Google ignores membershipLifeSpanDays on a website-visitor audience — how long someone stays is each include group's lookbackWindowDays. Set it there instead.\";\n }\n if (type === \"LOGICAL\") {\n return \"Google ignores membershipLifeSpanDays on a combined audience — membership follows the audiences it is made of.\";\n }\n return undefined;\n}\n\nexport const audienceCreateSchema = z\n .strictObject({\n name: z.string().min(1).max(GOOGLE_ADS_LIMITS.audience.nameMax),\n type: z.enum(USER_LIST_TYPES).default(\"BASIC\"),\n description: z.string().optional(),\n /** Customer-match members (crm-based) — file-first for large lists. */\n members: z.array(z.record(z.string(), z.string())).optional(),\n sourceFileRef: z.string().optional(),\n /**\n * How long a member stays in a converters or customer list, in days (`membership_life_span`, at\n * most 540). A customer list can no longer be kept forever: Google dropped \"never expires\" (10000)\n * for Customer Match on 2025-04-07 and answers \"Too high.\" Google ignores it on website-visitor\n * and combined lists, so it is refused there.\n */\n membershipLifeSpanDays: z\n .number()\n .int()\n .min(1)\n .max(\n GOOGLE_ADS_LIMITS.audience.membershipLifeSpanDaysMax,\n `membershipLifeSpanDays is 1–${GOOGLE_ADS_LIMITS.audience.membershipLifeSpanDaysMax} — Google no longer keeps anyone on a list forever`,\n )\n .optional(),\n /** RULE_BASED: who joins the list. */\n rule: audienceRuleSchema.optional(),\n /** LOGICAL: the audiences this one combines. */\n logic: audienceLogicSchema.optional(),\n /** BASIC: the conversion actions whose converters join the list. */\n conversionActions: z.array(existingRefSchema(BASIC_ACTION_MESSAGE)).min(1).optional(),\n /** LOOKALIKE: the seed audiences and how far past them to reach. */\n lookalike: audienceLookalikeSchema.optional(),\n })\n .superRefine((p, ctx) => {\n if (p.membershipLifeSpanDays !== undefined) {\n const refusal = membershipLifeSpanRefusal(p.type);\n if (refusal) {\n ctx.addIssue({ code: \"custom\", path: [\"membershipLifeSpanDays\"], message: refusal });\n }\n }\n const own = AUDIENCE_TYPE_SOURCE[p.type];\n for (const field of Object.keys(AUDIENCE_SOURCE_NEEDED)) {\n const present = (p as Record<string, unknown>)[field] !== undefined;\n if (field === own && !present) {\n ctx.addIssue({ code: \"custom\", path: [field], message: AUDIENCE_SOURCE_NEEDED[field] ?? field });\n }\n if (field !== own && present) {\n ctx.addIssue({\n code: \"custom\",\n path: [field],\n message: `\"${field}\" belongs to another audience type, not ${p.type}`,\n });\n }\n }\n });\nexport type AudienceCreate = z.infer<typeof audienceCreateSchema>;\n\n/**\n * Strict, for the same reason `geoTargetTypeSetting` is: a key this schema does not know used to\n * vanish between the command line and the stored payload, and the op published on Google's default.\n * Here that default is the expensive one — an audience criterion whose dimension has no\n * `bid_only: true` restriction RESTRICTS the parent's reach to the list (Google's API default is\n * Targeting mode, unlike the interface, which offers Observation). `bidOnly` and `targetingSetting`\n * were both tried against this op in production and both were silently dropped; the campaign was\n * one publish away from serving only to a 6,700-person remarketing list. Whether the parent\n * restricts is not a property of the criterion at all — it lives on the campaign/ad group, so it is\n * set by `google.targetingSetting.set` and refused here rather than quietly ignored.\n */\nexport const audienceCriterionAttachSchema = z\n .strictObject({\n level: z.enum([\"campaign\", \"adGroup\"]),\n parent: refSchema,\n /** An audience list (`userLists/{id}`, or a `g_temp_*` list staged in this chat). */\n userList: refSchema.optional(),\n /** An interest or in-market segment (`userInterests/{id}`) — read ids with `--preset audiences`. */\n userInterest: z.union([z.string().regex(RESOURCE_NAME_REGEX), z.string().regex(NUMERIC_ID_REGEX)]).optional(),\n /** A custom segment (`customAudiences/{id}`) built in Google Ads. */\n customAudience: z.union([z.string().regex(RESOURCE_NAME_REGEX), z.string().regex(NUMERIC_ID_REGEX)]).optional(),\n negative: z.boolean().default(false),\n })\n .refine(\n (p) => [p.userList, p.userInterest, p.customAudience].filter((v) => v !== undefined).length === 1,\n \"name exactly one audience: userList, userInterest or customAudience\",\n );\nexport type AudienceCriterionAttach = z.infer<typeof audienceCriterionAttachSchema>;\n\n/** The audience an attach names, as a criterion spec — what the builder and the channel matrix read. */\nexport function audienceSegmentOf(payload: AudienceCriterionAttach): CriterionSpec {\n if (payload.userInterest !== undefined) {\n return { criterionType: \"userInterest\", userInterest: payload.userInterest };\n }\n if (payload.customAudience !== undefined) {\n return { criterionType: \"customAudience\", customAudience: payload.customAudience };\n }\n return { criterionType: \"userList\", userList: payload.userList ?? \"\" };\n}\n\n/**\n * One `TargetingSetting.target_restrictions` row: a targeting dimension plus whether criteria in it\n * only move bids (`bidOnly: true`, the interface's \"Observation\") or also restrict who sees the ads\n * (`bidOnly: false`, \"Targeting\").\n */\nconst targetRestrictionSchema = z.strictObject({\n targetingDimension: z.enum(TARGETING_DIMENSIONS),\n bidOnly: z.boolean(),\n});\nexport type GoogleTargetRestriction = z.infer<typeof targetRestrictionSchema>;\n\n/**\n * Switch the AUDIENCE dimension of a campaign's or ad group's targeting setting between Observation\n * and Targeting — the selector the Google Ads interface shows next to an audience, which the API\n * does not default the same way (see `audienceCriterionAttachSchema`).\n *\n * Two things are load-bearing:\n *\n * - **The parent is in the payload, not in `target`.** It has to resolve a `g_temp_*` ref, because\n * the case that costs money most is an ad group created in this same draft: it starts with no\n * AUDIENCE restriction at all, so an audience attached to it publishes in Targeting mode.\n * - **`preserved` is resolved at stage time from the live setting and never supplied by the\n * caller.** `target_restrictions` is a repeated field, and Google replaces it wholesale on write,\n * so the AGE_RANGE / GENDER / PARENTAL_STATUS / INCOME_RANGE rows an account already carries have\n * to be re-sent verbatim or they are wiped along with any bid adjustment behind them. It stays\n * `.optional()` here because that is the truth of the input shape — the request builder refuses\n * to build without it rather than send a write that silently drops the other dimensions.\n */\nexport const targetingSettingSetSchema = z.strictObject({\n level: z.enum([\"campaign\", \"adGroup\"]),\n parent: refSchema,\n audience: z.enum([\"OBSERVATION\", \"TARGETING\"]),\n preserved: z.array(targetRestrictionSchema).optional(),\n});\nexport type TargetingSettingSet = z.infer<typeof targetingSettingSetSchema>;\n\n// --- Conversion actions ---\n\n/**\n * Every field below that Baker fills in when the payload is silent is `.optional()` here and\n * defaulted by `resolveConversionActionCreate` instead — never by `z.default()`.\n *\n * A `.default()` is invisible after the fact: the parsed payload cannot tell \"the agent chose\n * ONE_PER_CLICK\" from \"the agent said nothing\", and that payload is what gets stored, re-read on\n * every amend, and rendered on the review card. Keeping the omission in the stored payload is what\n * lets `collectOpWarnings` surface a filled-in business decision as a reviewable one — and it keeps\n * surviving an amend, which re-parses the STORED payload and would otherwise see five explicit\n * choices the agent never made.\n */\nexport const conversionActionCreateSchema = z.strictObject({\n name: z.string().min(1).max(GOOGLE_ADS_LIMITS.conversionAction.nameMax),\n type: z\n .enum(CONVERSION_ACTION_TYPES, {\n error: retiredChoiceError({ GOOGLE_ANALYTICS_4_CUSTOM: GA4_CONVERSION_CREATE_MESSAGE }),\n })\n .optional(),\n category: z.enum(CONVERSION_ACTION_CATEGORIES).optional(),\n countingType: z.enum(CONVERSION_COUNTING_TYPES).optional(),\n defaultValueMicros: microsSchema.optional(),\n defaultCurrencyCode: z.string().length(3).optional(),\n clickThroughLookbackWindowDays: z.number().int().positive().optional(),\n viewThroughLookbackWindowDays: z.number().int().positive().optional(),\n status: z.enum([\"ENABLED\", \"PAUSED\"]).optional(),\n /**\n * Primary = Google bids toward this conversion; secondary = it is only reported (\"Primary action\n * used for bidding optimization\" / \"Secondary action not used for bidding optimization\" in the UI).\n * Resolves to SECONDARY on create, deliberately: left unset ON THE WIRE, Google picks — and in a\n * live account some actions were born primary and some secondary, so a new action could silently\n * join the bidding target of every Maximize-Conversions campaign and redirect real spend. Nothing\n * exists yet to flip on a create, so a fixed resolved value is safe here in a way it would never be\n * on an update: joining bidding becomes an explicit `primaryForGoal: true`, never an accident.\n */\n primaryForGoal: z.boolean().optional(),\n});\nexport type ConversionActionCreate = z.infer<typeof conversionActionCreateSchema>;\n\n/**\n * What Baker sends for a conversion-action create field the payload left out. Applied on the way OUT\n * — at publish, on the review card, and in the op summary — never on the way in (see the schema\n * above). `primaryForGoal` in particular must always be sent: omitting it on the wire lets Google\n * decide the new action's bidding role.\n */\nexport const CONVERSION_ACTION_CREATE_DEFAULTS = {\n type: \"WEBPAGE\",\n category: \"DEFAULT\",\n countingType: \"ONE_PER_CLICK\",\n status: \"ENABLED\",\n primaryForGoal: false,\n} as const satisfies Partial<ConversionActionCreate>;\n\nexport type ResolvedConversionActionCreate = ConversionActionCreate &\n Required<Pick<ConversionActionCreate, \"type\" | \"category\" | \"countingType\" | \"status\" | \"primaryForGoal\">>;\n\n/** A create payload with every unstated field filled in — what actually reaches Google. */\nexport function resolveConversionActionCreate(payload: ConversionActionCreate): ResolvedConversionActionCreate {\n return {\n ...payload,\n type: payload.type ?? CONVERSION_ACTION_CREATE_DEFAULTS.type,\n category: payload.category ?? CONVERSION_ACTION_CREATE_DEFAULTS.category,\n countingType: payload.countingType ?? CONVERSION_ACTION_CREATE_DEFAULTS.countingType,\n status: payload.status ?? CONVERSION_ACTION_CREATE_DEFAULTS.status,\n primaryForGoal: payload.primaryForGoal ?? CONVERSION_ACTION_CREATE_DEFAULTS.primaryForGoal,\n };\n}\n\n/**\n * An agent reaching for `HIDDEN` wants \"stop counting this without deleting it\", so saying only\n * \"not a valid value\" sends it to `REMOVED` on an action it never meant to retire. Name both real\n * routes instead: demote to secondary keeps the measurement and takes it out of bidding, `REMOVED`\n * stops the measurement.\n */\nconst HIDDEN_CONVERSION_STATUS_ERROR =\n 'Google rejects status HIDDEN on every conversion action write (\"the field\\'s value is on a deny-list\"), so it is not part of this contract. ' +\n \"To stop automated bidding optimizing toward a conversion while it keeps measuring, demote it instead: `baker ads google conversions update --target <id> --no-primary`. \" +\n 'To stop it counting altogether, use `status: \"REMOVED\"`. Pick one of those and carry on with the rest of the job.';\n\nexport const conversionActionUpdateSchema = z\n .strictObject({\n name: z.string().min(1).max(GOOGLE_ADS_LIMITS.conversionAction.nameMax).optional(),\n category: z.enum(CONVERSION_ACTION_CATEGORIES).optional(),\n countingType: z.enum(CONVERSION_COUNTING_TYPES).optional(),\n defaultValueMicros: microsSchema.optional(),\n defaultCurrencyCode: z.string().length(3).optional(),\n clickThroughLookbackWindowDays: z.number().int().positive().optional(),\n viewThroughLookbackWindowDays: z.number().int().positive().optional(),\n /**\n * `HIDDEN` is deliberately not writable. Google returns it — an action hidden long ago reads\n * back as HIDDEN, and every read path keeps it — but it is on the API's deny-list for a write:\n * `conversion_action.status = HIDDEN` fails with \"The field's value is on a deny-list for this\n * field\" even on an ordinary WEBPAGE action with nothing else wrong. Offering it made it the\n * obvious pick for an agent told to retire an action gently, and the whole cleanup published\n * nothing.\n */\n status: z\n .enum([\"ENABLED\", \"REMOVED\"], {\n error: (issue) => (issue.input === \"HIDDEN\" ? HIDDEN_CONVERSION_STATUS_ERROR : undefined),\n })\n .optional(),\n /** Promote to primary (bid toward it) or demote to secondary (report only). No default — an\n * update must never change an existing action's bidding role unless it was asked to. */\n primaryForGoal: z.boolean().optional(),\n })\n .refine((p) => Object.values(p).some((v) => v !== undefined), \"update needs at least one field\")\n .refine(\n (p) => p.status !== \"REMOVED\" || Object.entries(p).every(([k, v]) => k === \"status\" || v === undefined),\n 'removing a conversion action cannot be combined with other edits — `status: \"REMOVED\"` deletes it, so a name or category sent alongside would be silently discarded. Stage the removal on its own.',\n );\nexport type ConversionActionUpdate = z.infer<typeof conversionActionUpdateSchema>;\n\n// --- Account-level conversion goals ---\n\n/**\n * `CustomerConversionGoal` — the account-level half of \"does this conversion drive bidding\".\n *\n * A conversion action steers automated bidding only when BOTH halves agree: the action is\n * `primaryForGoal`, AND the account-level goal for its (category, origin) pair is `biddable`. Google\n * creates one goal row per pair automatically as conversion actions appear, so this op never creates\n * or removes anything — it flips the one writable field on a row that already exists.\n *\n * ONE op per (category, origin), never a bag of pairs. Google's own samples mutate several goals in a\n * single request to make exactly one biddable, but atomicity is not what that buys here: a whole draft\n * already publishes as one `GoogleAdsService.Mutate` batch, so N staged ops land in N operations of the\n * SAME request and get exactly Google's semantics. What a multi-pair payload would cost is everything\n * the surface keys off one-op-one-change — a review card the user reads as a single decision, per-op\n * amend, per-op no-op detection, and per-op error attribution at publish.\n *\n * Both key halves are immutable on the resource, so they are the address, not an edit: only `biddable`\n * ever changes, and it is never defaulted — this op moves what the account bids toward in both\n * directions, and an op that forgot to say which way must fail rather than pick one.\n */\nexport const conversionGoalSetSchema = z.strictObject({\n category: z.enum(CONVERSION_ACTION_CATEGORIES),\n origin: z.enum(CONVERSION_ORIGINS),\n /** True = conversions of this category/origin count toward automated bidding; false = reported only. */\n biddable: z.boolean(),\n});\nexport type ConversionGoalSet = z.infer<typeof conversionGoalSetSchema>;\n\n/** `customers/{cid}/customerConversionGoals/{CATEGORY}~{ORIGIN}` — the goal's resource name is its key. */\nexport function conversionGoalResourceName(customerId: string, category: string, origin: string): string {\n return `customers/${customerId}/customerConversionGoals/${category}~${origin}`;\n}\n\n/** \"PURCHASE\" + \"WEBSITE\" → `Purchase (website)` — how the Goals table names the pair. */\nexport function conversionGoalLabel(category: string, origin: string): string {\n const words = (value: string) => value.toLowerCase().replace(/_/g, \" \");\n const category_ = words(category);\n return `${category_.charAt(0).toUpperCase()}${category_.slice(1)} (${words(origin)})`;\n}\n\n// --- Portfolio bidding strategies ---\n\n/**\n * Google's BiddingStrategy resource carries no target_cpc scheme — Demand Gen's target CPC is\n * campaign-level only. Accepting it on either verb would stage an op that can only fail at publish,\n * inside an atomic batch, taking every co-staged op down with it — so the create and the update\n * refuse it with the same sentence.\n */\nconst PORTFOLIO_TARGET_CPC_MESSAGE =\n \"portfolio strategies cannot be Target CPC — it is set on the Demand Gen campaign itself\";\n\n/** Why this type cannot be a portfolio strategy at all, or undefined. Manual CPC and Target CPC have their own sentences. */\nfunction portfolioTypeRefusal(type: GoogleBiddingStrategyType | undefined): string | undefined {\n if (type === undefined || type === \"MANUAL_CPC\" || type === \"TARGET_CPC\" || PORTFOLIO_STRATEGY_TYPES.includes(type)) {\n return undefined;\n }\n return `a portfolio strategy cannot be ${type} — Google has no portfolio form of it. Portfolios are ${PORTFOLIO_STRATEGY_TYPES.join(\", \")}; set ${type} on the campaign itself.`;\n}\n\nexport const biddingStrategyCreateSchema = z\n .strictObject({\n name: z.string().min(1).max(GOOGLE_ADS_LIMITS.biddingStrategy.nameMax),\n config: biddingConfigSchema,\n })\n .superRefine((p, ctx) => {\n if (p.config.type === \"MANUAL_CPC\") {\n ctx.addIssue({ code: \"custom\", path: [\"config\", \"type\"], message: \"portfolio strategies cannot be Manual CPC\" });\n }\n if (p.config.type === \"TARGET_CPC\") {\n ctx.addIssue({ code: \"custom\", path: [\"config\", \"type\"], message: PORTFOLIO_TARGET_CPC_MESSAGE });\n }\n const typeRefusal = portfolioTypeRefusal(p.config.type);\n if (typeRefusal) {\n ctx.addIssue({ code: \"custom\", path: [\"config\", \"type\"], message: typeRefusal });\n }\n addTargetImpressionShareIssues(p.config, \"config\", ctx);\n });\nexport type BiddingStrategyCreate = z.infer<typeof biddingStrategyCreateSchema>;\n\nexport const biddingStrategyUpdateSchema = z\n .strictObject({\n name: z.string().min(1).max(GOOGLE_ADS_LIMITS.biddingStrategy.nameMax).optional(),\n config: biddingConfigSchema.optional(),\n })\n .superRefine((p, ctx) => {\n if (Object.values(p).every((v) => v === undefined)) {\n ctx.addIssue({ code: \"custom\", message: \"update needs at least one field\" });\n }\n if (p.config?.type === \"TARGET_CPC\") {\n ctx.addIssue({ code: \"custom\", path: [\"config\", \"type\"], message: PORTFOLIO_TARGET_CPC_MESSAGE });\n }\n const typeRefusal = portfolioTypeRefusal(p.config?.type);\n if (typeRefusal) {\n ctx.addIssue({ code: \"custom\", path: [\"config\", \"type\"], message: typeRefusal });\n }\n });\nexport type BiddingStrategyUpdate = z.infer<typeof biddingStrategyUpdateSchema>;\n\n// --- Labels ---\n\nexport const labelCreateSchema = z.strictObject({\n name: z.string().min(1).max(GOOGLE_ADS_LIMITS.label.nameMax),\n backgroundColor: z\n .string()\n .regex(/^#[0-9A-Fa-f]{6}$/)\n .optional(),\n description: z.string().optional(),\n});\nexport type LabelCreate = z.infer<typeof labelCreateSchema>;\n\n/** A label's name, colour or description. `description: \"\"` clears it. Names are unique in the account. */\nexport const labelUpdateSchema = z\n .strictObject({\n name: z.string().min(1).max(GOOGLE_ADS_LIMITS.label.nameMax).optional(),\n backgroundColor: z\n .string()\n .regex(/^#[0-9A-Fa-f]{6}$/)\n .optional(),\n description: z.string().optional(),\n })\n .refine((p) => Object.values(p).some((v) => v !== undefined), \"update needs at least one field\");\nexport type LabelUpdate = z.infer<typeof labelUpdateSchema>;\n\nexport const ASSET_LABEL_MESSAGE =\n \"Google Ads has no labels on assets — its API offers labels on campaigns, ad groups, ads and keywords only. Label the campaign or ad group that uses the asset instead, or name the asset so it can be found; carry on with the rest of the job.\";\nexport const ACCOUNT_LABEL_MESSAGE =\n \"Google puts a label on an account only from the manager account above it, and Baker works inside the advertiser account — so this cannot be staged. Label the campaigns instead, or tell the user to label the account from their manager account in Google Ads; carry on with the rest of the job.\";\n\n/** Where a label goes. `keyword` and `ad` parents are full resource names — their ids are composite. */\nexport const LABEL_LEVELS = [\"campaign\", \"adGroup\", \"ad\", \"keyword\"] as const;\nexport type LabelLevel = (typeof LABEL_LEVELS)[number];\n\n/** The resource-name shape an ad or keyword label parent must have — its id is composite. */\nconst COMPOSITE_LABEL_PARENT: Partial<Record<LabelLevel, { pattern: RegExp; shape: string }>> = {\n ad: { pattern: /^customers\\/\\d+\\/adGroupAds\\/\\d+~\\d+$/, shape: \"customers/{cid}/adGroupAds/{adGroupId}~{adId}\" },\n keyword: {\n pattern: /^customers\\/\\d+\\/adGroupCriteria\\/\\d+~\\d+$/,\n shape: \"customers/{cid}/adGroupCriteria/{adGroupId}~{criterionId}\",\n },\n};\n\nexport const labelAttachSchema = z\n .strictObject({\n level: z.enum(LABEL_LEVELS, {\n error: retiredChoiceError({ asset: ASSET_LABEL_MESSAGE, customer: ACCOUNT_LABEL_MESSAGE }),\n }),\n parent: refSchema,\n label: refSchema,\n })\n .superRefine((p, ctx) => {\n const composite = COMPOSITE_LABEL_PARENT[p.level];\n if (composite && !composite.pattern.test(p.parent)) {\n ctx.addIssue({\n code: \"custom\",\n path: [\"parent\"],\n message: `a label goes on an existing ${p.level === \"ad\" ? \"ad\" : \"keyword\"} named by its full resource name — ${composite.shape} (read it from the row's resource_name). One created in this chat can be labelled after it is published.`,\n });\n }\n });\nexport type LabelAttach = z.infer<typeof labelAttachSchema>;\n\n// --- Criteria (campaign, ad group) and ad-group device bids ---\n\n/**\n * The checks every criterion op runs on its spec: the cross-field rules, whether Google's resource at\n * this level has a field for it at all, and whether an exclusion carries a bid. Channel-dependent\n * rules (`criterionChannelVerdict`) wait for the stage read, where the campaign's type is known.\n */\nfunction refineCriterion(\n level: \"campaign\" | \"adGroup\",\n options: { negative: boolean; viaAudiences?: boolean },\n): (spec: CriterionSpec, ctx: z.RefinementCtx, path: (string | number)[]) => void {\n return (spec, ctx, path) => {\n for (const issue of criterionSpecIssues(spec)) {\n ctx.addIssue({ code: \"custom\", path: [...path, ...issue.path], message: issue.message });\n }\n const message = criterionLevelIssue(spec, level, options) ?? criterionBidIssue(spec, options.negative);\n if (message) {\n ctx.addIssue({ code: \"custom\", path, message });\n }\n };\n}\n\n/**\n * A criterion on a campaign: a location, language, schedule, device, radius, demographic or\n * placement exclusion, content-type or IP exclusion, carrier, operating system, web-page exclusion or\n * brand list. `bidModifier` rides on the criterion where Google takes one (location, ad schedule,\n * device, radius). Audience segments go through `audienceCriterion.attach` instead.\n */\nexport const campaignCriterionAddSchema = z\n .strictObject({\n campaign: refSchema,\n negative: z.boolean().default(false),\n criterion: criterionSpecSchema,\n })\n .superRefine((val, ctx) => {\n refineCriterion(\"campaign\", { negative: val.negative })(val.criterion, ctx, [\"criterion\"]);\n });\nexport type CampaignCriterionAdd = z.infer<typeof campaignCriterionAddSchema>;\n\n/**\n * The one thing a live campaign criterion lets you change.\n *\n * A device criterion can be added and re-bid, but never removed — Google rejects the removal even\n * of one the same account created itself. So \"stop bidding up on desktop\" is an UPDATE of\n * `bid_modifier` back to 1.0 and \"don't serve on desktop\" is an update to 0, where a removal is\n * rejected outright; this op exists to give the agent that route.\n * Everything else on the resource (which geo, which language, negative or not) is create-only:\n * changing what a criterion targets means removing it and adding the replacement.\n */\nexport const campaignCriterionUpdateSchema = z.strictObject({\n bidModifier: bidModifierSchema,\n});\nexport type CampaignCriterionUpdate = z.infer<typeof campaignCriterionUpdateSchema>;\n\n/**\n * A criterion on an ad group: placements, apps, YouTube, topics, demographics, web pages (Dynamic\n * Search Ads), Demand Gen locations/languages and its combined audience, brand lists. `status`\n * pauses a targeting criterion (an exclusion has none); `cpcBidMicros` is a Display placement's or\n * topic's own max CPC.\n */\nexport const adGroupCriterionAddSchema = z\n .strictObject({\n adGroup: refSchema,\n negative: z.boolean().default(false),\n criterion: criterionSpecSchema,\n status: z.enum([\"ENABLED\", \"PAUSED\"]).optional(),\n cpcBidMicros: microsSchema.optional(),\n })\n .superRefine((val, ctx) => {\n refineCriterion(\"adGroup\", { negative: val.negative })(val.criterion, ctx, [\"criterion\"]);\n if (val.negative && (val.status !== undefined || val.cpcBidMicros !== undefined)) {\n ctx.addIssue({\n code: \"custom\",\n path: [val.status !== undefined ? \"status\" : \"cpcBidMicros\"],\n message: \"an exclusion has no status or bid — Google refuses either on a negative criterion\",\n });\n }\n });\nexport type AdGroupCriterionAdd = z.infer<typeof adGroupCriterionAddSchema>;\n\n/** What a live ad-group criterion lets you change: its bid adjustment, own max CPC, or status. */\nexport const adGroupCriterionUpdateSchema = z\n .strictObject({\n bidModifier: criterionBidModifierSchema.optional(),\n cpcBidMicros: microsSchema.optional(),\n status: z.enum([\"ENABLED\", \"PAUSED\"]).optional(),\n })\n .refine((p) => Object.values(p).some((v) => v !== undefined), \"update needs at least one field\");\nexport type AdGroupCriterionUpdate = z.infer<typeof adGroupCriterionUpdateSchema>;\n\n/**\n * An ad group's own device bid adjustment (`AdGroupBidModifier`) — devices are a campaign criterion,\n * so this is how one ad group bids differently on mobile. 0 stops it serving on that device.\n */\nexport const adGroupBidModifierAddSchema = z.strictObject({\n adGroup: refSchema,\n device: z.enum(DEVICE_TYPES),\n bidModifier: bidModifierSchema,\n});\nexport type AdGroupBidModifierAdd = z.infer<typeof adGroupBidModifierAddSchema>;\n\nexport const adGroupBidModifierUpdateSchema = z.strictObject({ bidModifier: bidModifierSchema });\nexport type AdGroupBidModifierUpdate = z.infer<typeof adGroupBidModifierUpdateSchema>;\n\n/**\n * An exclusion for the WHOLE account (`CustomerNegativeCriterion`): a placement, app, app category,\n * YouTube channel or video, content type, IP address, or an account-level negative keyword list. It\n * applies to every campaign Google lets it reach — including Performance Max, which takes no\n * placement exclusion of its own. Exclusion only; nothing here targets.\n */\nexport const customerNegativeCriterionAddSchema = z\n .strictObject({ criterion: criterionSpecSchema })\n .superRefine((val, ctx) => {\n for (const issue of criterionSpecIssues(val.criterion)) {\n ctx.addIssue({ code: \"custom\", path: [\"criterion\", ...issue.path], message: issue.message });\n }\n const message =\n criterionLevelIssue(val.criterion, \"account\", { negative: true }) ?? criterionBidIssue(val.criterion, true);\n if (message) {\n ctx.addIssue({ code: \"custom\", path: [\"criterion\"], message });\n }\n });\nexport type CustomerNegativeCriterionAdd = z.infer<typeof customerNegativeCriterionAddSchema>;\n\n/**\n * A Performance Max asset group's signal (`AssetGroupSignal`): a search theme, or the one combined\n * audience (`audiences/{id}`) the group is pointed at. A signal steers who Google looks for; it\n * narrows nothing. There is no update — changing one is a remove plus an add.\n */\nexport const assetGroupSignalAddSchema = z\n .strictObject({ assetGroup: refSchema, criterion: criterionSpecSchema })\n .superRefine((val, ctx) => {\n for (const issue of criterionSpecIssues(val.criterion)) {\n ctx.addIssue({ code: \"custom\", path: [\"criterion\", ...issue.path], message: issue.message });\n }\n const message = criterionLevelIssue(val.criterion, \"assetGroup\") ?? criterionBidIssue(val.criterion, false);\n if (message) {\n ctx.addIssue({ code: \"custom\", path: [\"criterion\"], message });\n }\n });\nexport type AssetGroupSignalAdd = z.infer<typeof assetGroupSignalAddSchema>;\n\n// --- The op union ---\n\nexport const GOOGLE_DRAFT_OP_KINDS = [\n \"google.customer.update\",\n \"google.budget.create\",\n \"google.budget.update\",\n \"google.budget.remove\",\n \"google.campaign.create\",\n \"google.campaign.update\",\n \"google.campaign.pause\",\n \"google.campaign.resume\",\n \"google.campaign.remove\",\n \"google.campaign.enableBrandGuidelines\",\n \"google.adGroup.create\",\n \"google.adGroup.update\",\n \"google.adGroup.pause\",\n \"google.adGroup.resume\",\n \"google.adGroup.remove\",\n \"google.keyword.add\",\n \"google.keyword.update\",\n \"google.keyword.remove\",\n \"google.negativeKeyword.add\",\n \"google.negativeKeyword.update\",\n \"google.negativeKeyword.remove\",\n \"google.sharedSet.create\",\n \"google.sharedSet.update\",\n \"google.sharedSet.remove\",\n \"google.sharedSetMember.add\",\n \"google.sharedSetMember.remove\",\n \"google.campaignSharedSet.attach\",\n \"google.campaignSharedSet.detach\",\n \"google.ad.create\",\n \"google.ad.update\",\n \"google.ad.pause\",\n \"google.ad.resume\",\n \"google.ad.remove\",\n \"google.asset.create\",\n \"google.asset.update\",\n \"google.assetLink.attach\",\n \"google.assetLink.detach\",\n \"google.assetGroup.create\",\n \"google.assetGroup.update\",\n \"google.assetGroupAsset.attach\",\n \"google.assetGroupAsset.detach\",\n \"google.assetGroupSignal.add\",\n \"google.assetGroupSignal.remove\",\n \"google.audience.create\",\n \"google.audienceCriterion.attach\",\n \"google.audienceCriterion.detach\",\n \"google.targetingSetting.set\",\n \"google.conversionAction.create\",\n \"google.conversionAction.update\",\n \"google.conversionAction.goal\",\n \"google.conversion.upload\",\n \"google.biddingStrategy.create\",\n \"google.biddingStrategy.update\",\n \"google.biddingStrategy.remove\",\n \"google.label.create\",\n \"google.label.update\",\n \"google.label.remove\",\n \"google.label.attach\",\n \"google.label.detach\",\n \"google.campaignCriterion.add\",\n \"google.campaignCriterion.update\",\n \"google.campaignCriterion.remove\",\n \"google.adGroupCriterion.add\",\n \"google.adGroupCriterion.update\",\n \"google.adGroupCriterion.remove\",\n \"google.adGroupBidModifier.add\",\n \"google.adGroupBidModifier.update\",\n \"google.adGroupBidModifier.remove\",\n \"google.customerNegativeCriterion.add\",\n \"google.customerNegativeCriterion.remove\",\n] as const;\nexport const googleDraftOpKindSchema = z.enum(GOOGLE_DRAFT_OP_KINDS);\nexport type GoogleDraftOpKind = z.infer<typeof googleDraftOpKindSchema>;\n\nfunction createOp<K extends GoogleDraftOpKind, P extends z.ZodTypeAny>(kind: K, payload: P) {\n return z.object({ kind: z.literal(kind), customerId: customerIdSchema, payload });\n}\nfunction updateOp<K extends GoogleDraftOpKind, P extends z.ZodTypeAny>(kind: K, payload: P) {\n return z.object({ kind: z.literal(kind), customerId: customerIdSchema, target: targetRefSchema, payload });\n}\n/** `confirmBudgetIncrease` is accepted and ignored: only the person's answer approves a large raise (`convex/ads/budgetJump.ts`). */\nfunction budgetUpdateOp<K extends GoogleDraftOpKind, P extends z.ZodTypeAny>(kind: K, payload: P) {\n return updateOp(kind, payload).extend({ confirmBudgetIncrease: z.boolean().optional() });\n}\n/** Pause/resume/remove/detach ops carry only a target — no payload. */\nfunction targetOp<K extends GoogleDraftOpKind>(kind: K) {\n return z.object({ kind: z.literal(kind), customerId: customerIdSchema, target: targetRefSchema });\n}\n\nexport const googleDraftOpInputSchema = z.discriminatedUnion(\"kind\", [\n z\n .object({\n kind: z.literal(\"google.customer.update\"),\n customerId: customerIdSchema,\n target: z.string(),\n payload: customerUpdateSchema,\n })\n .refine((op) => op.target.replace(/^customers\\//, \"\") === op.customerId, {\n path: [\"target\"],\n message: CUSTOMER_TARGET_MESSAGE,\n }),\n createOp(\"google.budget.create\", budgetCreateSchema),\n budgetUpdateOp(\"google.budget.update\", budgetUpdateSchema),\n targetOp(\"google.budget.remove\"),\n createOp(\"google.campaign.create\", campaignCreateSchema),\n updateOp(\"google.campaign.update\", campaignUpdateSchema),\n targetOp(\"google.campaign.pause\"),\n targetOp(\"google.campaign.resume\"),\n targetOp(\"google.campaign.remove\"),\n updateOp(\"google.campaign.enableBrandGuidelines\", campaignEnableBrandGuidelinesSchema),\n createOp(\"google.adGroup.create\", adGroupCreateSchema),\n updateOp(\"google.adGroup.update\", adGroupUpdateSchema),\n targetOp(\"google.adGroup.pause\"),\n targetOp(\"google.adGroup.resume\"),\n targetOp(\"google.adGroup.remove\"),\n createOp(\"google.keyword.add\", keywordAddSchema),\n updateOp(\"google.keyword.update\", keywordUpdateSchema),\n targetOp(\"google.keyword.remove\"),\n createOp(\"google.negativeKeyword.add\", negativeKeywordAddSchema),\n updateOp(\"google.negativeKeyword.update\", negativeKeywordUpdateSchema),\n targetOp(\"google.negativeKeyword.remove\"),\n createOp(\"google.sharedSet.create\", sharedSetCreateSchema),\n updateOp(\"google.sharedSet.update\", sharedSetUpdateSchema),\n targetOp(\"google.sharedSet.remove\"),\n createOp(\"google.sharedSetMember.add\", sharedSetMemberAddSchema),\n targetOp(\"google.sharedSetMember.remove\"),\n createOp(\"google.campaignSharedSet.attach\", campaignSharedSetAttachSchema),\n targetOp(\"google.campaignSharedSet.detach\"),\n createOp(\"google.ad.create\", adCreateSchema),\n updateOp(\"google.ad.update\", adUpdateSchema),\n targetOp(\"google.ad.pause\"),\n targetOp(\"google.ad.resume\"),\n targetOp(\"google.ad.remove\"),\n createOp(\"google.asset.create\", assetCreateSchema),\n updateOp(\"google.asset.update\", assetUpdateSchema),\n createOp(\"google.assetLink.attach\", assetLinkAttachSchema),\n targetOp(\"google.assetLink.detach\"),\n createOp(\"google.assetGroup.create\", assetGroupCreateSchema),\n updateOp(\"google.assetGroup.update\", assetGroupUpdateSchema),\n createOp(\"google.assetGroupAsset.attach\", assetGroupAssetAttachSchema),\n targetOp(\"google.assetGroupAsset.detach\"),\n createOp(\"google.assetGroupSignal.add\", assetGroupSignalAddSchema),\n targetOp(\"google.assetGroupSignal.remove\"),\n createOp(\"google.audience.create\", audienceCreateSchema),\n createOp(\"google.audienceCriterion.attach\", audienceCriterionAttachSchema),\n targetOp(\"google.audienceCriterion.detach\"),\n createOp(\"google.targetingSetting.set\", targetingSettingSetSchema),\n createOp(\"google.conversionAction.create\", conversionActionCreateSchema),\n updateOp(\"google.conversionAction.update\", conversionActionUpdateSchema),\n createOp(\"google.conversionAction.goal\", conversionGoalSetSchema),\n createOp(\"google.conversion.upload\", conversionUploadSchema),\n createOp(\"google.biddingStrategy.create\", biddingStrategyCreateSchema),\n updateOp(\"google.biddingStrategy.update\", biddingStrategyUpdateSchema),\n targetOp(\"google.biddingStrategy.remove\"),\n createOp(\"google.label.create\", labelCreateSchema),\n updateOp(\"google.label.update\", labelUpdateSchema),\n targetOp(\"google.label.remove\"),\n createOp(\"google.label.attach\", labelAttachSchema),\n targetOp(\"google.label.detach\"),\n createOp(\"google.campaignCriterion.add\", campaignCriterionAddSchema),\n updateOp(\"google.campaignCriterion.update\", campaignCriterionUpdateSchema),\n targetOp(\"google.campaignCriterion.remove\"),\n createOp(\"google.adGroupCriterion.add\", adGroupCriterionAddSchema),\n updateOp(\"google.adGroupCriterion.update\", adGroupCriterionUpdateSchema),\n targetOp(\"google.adGroupCriterion.remove\"),\n createOp(\"google.adGroupBidModifier.add\", adGroupBidModifierAddSchema),\n updateOp(\"google.adGroupBidModifier.update\", adGroupBidModifierUpdateSchema),\n targetOp(\"google.adGroupBidModifier.remove\"),\n createOp(\"google.customerNegativeCriterion.add\", customerNegativeCriterionAddSchema),\n targetOp(\"google.customerNegativeCriterion.remove\"),\n]);\nexport type GoogleDraftOpInput = z.infer<typeof googleDraftOpInputSchema>;\n\nexport type GoogleDraftEntity =\n | \"customer\"\n | \"budget\"\n | \"campaign\"\n | \"adGroup\"\n | \"keyword\"\n | \"negativeKeyword\"\n | \"sharedSet\"\n | \"sharedSetMember\"\n | \"campaignSharedSet\"\n | \"ad\"\n | \"asset\"\n | \"assetLink\"\n | \"assetGroup\"\n | \"assetGroupAsset\"\n | \"assetGroupSignal\"\n | \"audience\"\n | \"audienceCriterion\"\n | \"targetingSetting\"\n | \"conversionAction\"\n | \"conversion\"\n | \"biddingStrategy\"\n | \"label\"\n | \"campaignCriterion\"\n | \"adGroupCriterion\"\n | \"adGroupBidModifier\"\n | \"customerNegativeCriterion\";\n\nexport function entityOfKind(kind: GoogleDraftOpKind): GoogleDraftEntity {\n return kind.split(\".\")[1] as GoogleDraftEntity;\n}\n\nexport function verbOfKind(kind: GoogleDraftOpKind): string {\n return kind.split(\".\")[2] ?? \"\";\n}\n\nexport function isCreateKind(kind: GoogleDraftOpKind): boolean {\n const verb = verbOfKind(kind);\n return verb === \"create\" || verb === \"add\" || verb === \"attach\";\n}\n\nexport function isTargetOnlyKind(kind: GoogleDraftOpKind): boolean {\n const verb = verbOfKind(kind);\n return verb === \"pause\" || verb === \"resume\" || verb === \"remove\" || verb === \"detach\";\n}\n\n/**\n * The status a `pause`/`resume` will set, or undefined for every other verb. These kinds\n * carry no payload, so their intent lives only in the kind — both the before/after diff\n * and stage-time no-op detection have to read it from here to know what the op will do.\n */\nexport function impliedStatusOfKind(kind: GoogleDraftOpKind): \"ENABLED\" | \"PAUSED\" | undefined {\n const verb = verbOfKind(kind);\n if (verb === \"pause\") {\n return \"PAUSED\";\n }\n return verb === \"resume\" ? \"ENABLED\" : undefined;\n}\n\n// --- Temp-ref dependency collection ---\n\ntype TempRefDep = { ref: string; entity: GoogleDraftEntity };\n\nfunction isTempRef(value: unknown): value is string {\n return typeof value === \"string\" && TEMP_REF_REGEX.test(value);\n}\n\n/** The image/logo/video asset refs an ad's own content references, keyed by the format. Empty for formats with none. */\nfunction contentAssetRefs(content: AdContent): string[] {\n switch (content.format) {\n case \"responsiveDisplay\":\n return [\n ...(content.marketingImageAssets ?? []),\n ...(content.squareMarketingImageAssets ?? []),\n ...(content.logoImageAssets ?? []),\n ];\n case \"video\":\n return [...content.videoAssets, ...(content.logoImageAssets ?? [])];\n case \"demandGen\":\n return [...(content.imageAssets ?? []), ...(content.squareImageAssets ?? []), ...(content.logoImageAssets ?? [])];\n case \"demandGenVideo\":\n return [\n ...(content.videoAssets ?? []),\n ...(content.logoImageAssets ?? []),\n ...(content.callToActionAssets ?? []),\n ];\n case \"app\":\n return [...(content.images ?? []), ...(content.youtubeVideos ?? [])];\n default:\n return [];\n }\n}\n\n/**\n * The image refs an ad op puts on an App ad's `AppAdInfo.images`, or `[]` for any other op or\n * format. Google validates each one's shape and rejects the WHOLE ad mutate if any is wrong, so\n * the stage-time shape check needs exactly this list — no other format's images are affected.\n */\nexport function appAdImageRefs(op: GoogleDraftOpInput): string[] {\n if (op.kind === \"google.ad.create\") {\n return op.payload.content.format === \"app\" ? [...(op.payload.content.images ?? [])] : [];\n }\n if (op.kind !== \"google.ad.update\" || op.payload.content === undefined) {\n return [];\n }\n const parsed = adContentSchema.safeParse(op.payload.content);\n return parsed.success && parsed.data.format === \"app\" ? [...(parsed.data.images ?? [])] : [];\n}\n\n/**\n * Asset refs inside an ad.update's LOOSE content bag. `adUpdateSchema.content` is a `Record` so a\n * partial patch can merge into a staged op, which means the typed `contentAssetRefs` can't read it —\n * scan its array fields for refs instead. Undercounting here would stage an ad update that consumes\n * a `g_temp_*` asset with an empty `dependsOn`: the reference passes unchecked, discarding the asset\n * create leaves the ad pointing at nothing, and publish order is left to luck.\n */\nfunction looseContentAssetRefs(content: unknown): string[] {\n if (content === null || typeof content !== \"object\" || Array.isArray(content)) {\n return [];\n }\n return Object.values(content as Record<string, unknown>)\n .filter((value): value is unknown[] => Array.isArray(value))\n .flat()\n .filter((value): value is string => typeof value === \"string\");\n}\n\n/** The image/square-image/portrait-image/logo asset refs an asset group's own payload references. */\nfunction assetGroupImageRefs(payload: AssetGroupCreate): string[] {\n return [\n ...(payload.imageAssets ?? []),\n ...(payload.squareImageAssets ?? []),\n ...(payload.portraitImageAssets ?? []),\n ...(payload.logoAssets ?? []),\n ];\n}\n\n/** The entity a `level` names — campaign or ad group — for the ops that hang off either. */\nfunction levelEntity(level: string): GoogleDraftEntity {\n return level === \"adGroup\" ? \"adGroup\" : \"campaign\";\n}\n\n/** Temp refs an op consumes, keyed by the entity kind each ref must resolve to. */\nexport function collectTempRefDeps(op: GoogleDraftOpInput): TempRefDep[] {\n const deps: TempRefDep[] = [];\n const add = (value: unknown, entity: GoogleDraftEntity) => {\n if (isTempRef(value)) {\n deps.push({ ref: value, entity });\n }\n };\n switch (op.kind) {\n case \"google.campaign.create\":\n add(op.payload.budget, \"budget\");\n add(op.payload.biddingStrategy, \"biddingStrategy\");\n break;\n case \"google.campaign.update\":\n add(op.payload.budget, \"budget\");\n add(op.payload.biddingStrategy, \"biddingStrategy\");\n break;\n case \"google.adGroup.create\":\n add(op.payload.campaign, \"campaign\");\n break;\n case \"google.keyword.add\":\n add(op.payload.adGroup, \"adGroup\");\n break;\n case \"google.negativeKeyword.add\":\n add(op.payload.parent, levelEntity(op.payload.level));\n break;\n case \"google.sharedSetMember.add\":\n add(op.payload.sharedSet, \"sharedSet\");\n break;\n case \"google.targetingSetting.set\":\n add(op.payload.parent, levelEntity(op.payload.level));\n break;\n case \"google.campaignSharedSet.attach\":\n add(op.payload.campaign, \"campaign\");\n add(op.payload.sharedSet, \"sharedSet\");\n break;\n case \"google.ad.create\":\n add(op.payload.adGroup, \"adGroup\");\n // A responsive display / video / demand gen ad references its assets by ref on its own\n // content — a staged `asset.create` must land before the ad, so its temp refs are real deps.\n for (const ref of contentAssetRefs(op.payload.content)) {\n add(ref, \"asset\");\n }\n break;\n case \"google.ad.update\":\n // A content update replaces the ad's assets too, so the same asset creates are real deps.\n for (const ref of looseContentAssetRefs(op.payload.content)) {\n add(ref, \"asset\");\n }\n break;\n case \"google.assetLink.attach\":\n add(op.payload.parent, op.payload.level === \"adGroup\" ? \"adGroup\" : \"campaign\");\n add(op.payload.asset, \"asset\");\n break;\n case \"google.assetGroup.create\":\n add(op.payload.campaign, \"campaign\");\n for (const ref of assetGroupImageRefs(op.payload)) {\n add(ref, \"asset\");\n }\n break;\n case \"google.assetGroupAsset.attach\":\n add(op.payload.assetGroup, \"assetGroup\");\n add(op.payload.asset, \"asset\");\n break;\n case \"google.audienceCriterion.attach\":\n add(op.payload.parent, op.payload.level === \"adGroup\" ? \"adGroup\" : \"campaign\");\n add(op.payload.userList, \"audience\");\n break;\n case \"google.label.attach\":\n add(op.payload.parent, op.payload.level);\n add(op.payload.label, \"label\");\n break;\n case \"google.campaignCriterion.add\":\n case \"google.adGroupCriterion.add\":\n case \"google.adGroupBidModifier.add\":\n case \"google.customerNegativeCriterion.add\":\n case \"google.assetGroupSignal.add\":\n deps.push(...criterionOpDeps(op));\n break;\n default:\n break;\n }\n return deps;\n}\n\n/** A criterion op's parent (when it has one) and whatever its criterion names. */\nfunction criterionOpDeps(op: GoogleDraftOpInput): TempRefDep[] {\n const parent: TempRefDep[] = [];\n const own = (ref: string, entity: GoogleDraftEntity) => {\n if (isTempRef(ref)) {\n parent.push({ ref, entity });\n }\n };\n switch (op.kind) {\n case \"google.campaignCriterion.add\":\n own(op.payload.campaign, \"campaign\");\n return [...parent, ...criterionTempRefs(op.payload.criterion)];\n case \"google.adGroupCriterion.add\":\n own(op.payload.adGroup, \"adGroup\");\n return [...parent, ...criterionTempRefs(op.payload.criterion)];\n case \"google.adGroupBidModifier.add\":\n own(op.payload.adGroup, \"adGroup\");\n return parent;\n case \"google.customerNegativeCriterion.add\":\n return criterionTempRefs(op.payload.criterion);\n case \"google.assetGroupSignal.add\":\n own(op.payload.assetGroup, \"assetGroup\");\n return [...parent, ...criterionTempRefs(op.payload.criterion)];\n default:\n return [];\n }\n}\n\n// --- Whole-content replacement gate (blocking) ---\n\n/**\n * Why an `ad.update` content payload can't be persisted as-is, or undefined when it's fine.\n *\n * `adUpdateSchema.content` is a loose bag ON PURPOSE: a partial patch has to be able to merge into a\n * staged create or a staged update. But whatever is finally STORED as a `google.ad.update` is sent to\n * Google as a whole-content replacement, so at that point it must be a complete `AdContent` — the\n * `format` discriminator included. Every persist point runs this, so a half-content update is\n * rejected the moment it's staged instead of surfacing as an unpublishable draft much later.\n */\nexport function incompleteAdContentReason(op: GoogleDraftOpInput): string | undefined {\n if (op.kind !== \"google.ad.update\" || op.payload.content === undefined) {\n return undefined;\n }\n const parsed = adContentSchema.safeParse(op.payload.content);\n if (parsed.success) {\n return undefined;\n }\n const unknownFields = unrecognizedContentKeys(parsed.error.issues);\n if (unknownFields.length > 0) {\n const format = readFormat(op.payload.content);\n const accepted = format ? AD_CONTENT_ASSET_FIELDS[format] : undefined;\n // A format with no creative fields at all (responsiveSearch) has an EMPTY list, which is\n // truthy — falling through to the field-naming branch built \"carries its creative on .\" Send\n // those to the schema instead, which is where the answer actually is.\n const where =\n accepted && accepted.length > 0\n ? `a ${format} ad carries its creative on ${accepted.map((f) => `\\`${f}\\``).join(\" / \")}`\n : \"check the format's fields with `baker schema ads.google.ads.update`\";\n return `${unknownFields.map((f) => `\\`${f}\\``).join(\", \")} ${unknownFields.length === 1 ? \"is not a field\" : \"are not fields\"} of this ad's content — ${where}. Unknown fields are dropped, so publishing would have shipped the copy without the assets.`;\n }\n const detail = parsed.error.issues\n .slice(0, 4)\n .map((issue) => (issue.path.length > 0 ? `content.${issue.path.join(\".\")}: ${issue.message}` : issue.message))\n .join(\"; \");\n return `an ad content update replaces the ad's whole content — send every field of the format (starting with \\`format\\`), not only the ones you are changing: ${detail}`;\n}\n\n/** Each content format in the words a user reads — one map, so a card and a summary cannot disagree. */\nexport const AD_FORMAT_LABELS: Readonly<Record<AdFormat, string>> = {\n responsiveSearch: \"Responsive search ad\",\n responsiveDisplay: \"Responsive display ad\",\n app: \"App ad\",\n video: \"Video ad\",\n demandGen: \"Demand Gen ad\",\n demandGenVideo: \"Demand Gen video ad\",\n shoppingProduct: \"Shopping product ad\",\n};\n\n/**\n * Google's live `ad_group_ad.ad.type` → the content format that writes it. An ad's format is chosen\n * by whoever stages the update, and nothing else compares it to the ad on the account: naming the\n * wrong one builds a mutate against a DIFFERENT ad message, which Google refuses at publish, long\n * after the Session moved on. Every writable type is here, so a type that is absent is either one\n * Baker cannot write ({@link UNWRITABLE_AD_TYPES}) or one it has never seen.\n */\nexport const AD_FORMAT_BY_AD_TYPE: Readonly<Record<string, AdFormat>> = {\n RESPONSIVE_SEARCH_AD: \"responsiveSearch\",\n RESPONSIVE_DISPLAY_AD: \"responsiveDisplay\",\n APP_AD: \"app\",\n VIDEO_RESPONSIVE_AD: \"video\",\n DEMAND_GEN_MULTI_ASSET_AD: \"demandGen\",\n DEMAND_GEN_VIDEO_RESPONSIVE_AD: \"demandGenVideo\",\n SHOPPING_PRODUCT_AD: \"shoppingProduct\",\n};\n\n/**\n * Live ad types Baker has no content format for, in the words a refusal uses. Named rather than left\n * to fall through, because \"Baker cannot edit this ad\" is an answer the agent can act on — reporting\n * the copy as a finding, or replacing the ad — and a publish failure is not.\n */\nexport const UNWRITABLE_AD_TYPES: Readonly<Record<string, string>> = {\n CALL_AD: \"call ad\",\n DEMAND_GEN_CAROUSEL_AD: \"Demand Gen carousel ad\",\n DEMAND_GEN_PRODUCT_AD: \"Demand Gen product ad\",\n EXPANDED_TEXT_AD: \"expanded text ad\",\n IMAGE_AD: \"image ad\",\n VIDEO_AD: \"video ad (the legacy format)\",\n LEGACY_RESPONSIVE_DISPLAY_AD: \"legacy responsive display ad\",\n SMART_CAMPAIGN_AD: \"Smart campaign ad\",\n};\n\n/**\n * Why a staged ad-content format cannot be the content of the ad it targets, or undefined when it\n * can (or when the live type was never read — a missing read is never an accusation).\n */\nexport function adContentFormatRefusal(liveAdType: string | undefined, format: AdFormat): string | undefined {\n if (!liveAdType) {\n return undefined;\n }\n const unwritable = UNWRITABLE_AD_TYPES[liveAdType];\n if (unwritable) {\n return (\n `This ad is a ${unwritable} (${liveAdType}), and Baker has no content format that writes one — ` +\n \"publishing this would be refused by Google. Change this ad in the Google Ads interface, or replace it \" +\n \"with an ad in a format Baker writes, and report the copy as a finding either way.\"\n );\n }\n const expected = AD_FORMAT_BY_AD_TYPE[liveAdType];\n if (!expected || expected === format) {\n return undefined;\n }\n return (\n `This ad is a ${liveAdType}, whose content is \\`format: \"${expected}\"\\` — this update carries ` +\n `\\`format: \"${format}\"\\`, which builds a different ad message and would be refused at publish. ` +\n `Re-stage it with --format ${expected} and that format's own fields (\\`baker schema ads.google.ads.update\\`).`\n );\n}\n\n/** The creative fields each ad format accepts, so an unknown-field error can name the right one. */\nconst AD_CONTENT_ASSET_FIELDS: Record<AdFormat, string[]> = {\n responsiveSearch: [],\n responsiveDisplay: [\"marketingImageAssets\", \"squareMarketingImageAssets\", \"logoImageAssets\"],\n app: [\"images\", \"youtubeVideos\"],\n video: [\"videoAssets\", \"logoImageAssets\"],\n demandGen: [\"imageAssets\", \"squareImageAssets\", \"logoImageAssets\"],\n demandGenVideo: [\"videoAssets\", \"logoImageAssets\", \"callToActionAssets\"],\n shoppingProduct: [],\n};\n\nfunction readFormat(content: unknown): AdFormat | undefined {\n if (content === null || typeof content !== \"object\") {\n return undefined;\n }\n const format = (content as Record<string, unknown>).format;\n return typeof format === \"string\" && format in AD_CONTENT_ASSET_FIELDS ? (format as AdFormat) : undefined;\n}\n\n/** Field names the strict content schemas rejected, deduped in payload order. */\nfunction unrecognizedContentKeys(issues: readonly z.core.$ZodIssue[]): string[] {\n const keys = new Set<string>();\n for (const issue of issues) {\n if (issue.code === \"unrecognized_keys\") {\n for (const key of issue.keys) {\n keys.add(key);\n }\n }\n }\n return [...keys];\n}\n\n// --- Stage-time warnings (non-blocking) ---\n\n/**\n * `{_source}` in a tracking template resolves from the custom parameters defined on the campaign,\n * ad group or ad. Baker can only see what this op stages, so an undefined tag is a warning, not a\n * rejection — it may legitimately be defined further down. Left unwarned it publishes an empty\n * value into every tracked click.\n */\nfunction urlCustomParameterWarnings(\n template: string | undefined,\n params: ReadonlyArray<{ key: string }> | undefined,\n): string[] {\n if (!template) {\n return [];\n }\n const defined = new Set((params ?? []).map((p) => p.key));\n const referenced = [...template.matchAll(/\\{_([A-Za-z0-9_]+)\\}/g)].map((m) => m[1] ?? \"\");\n const missing = [...new Set(referenced.filter((key) => !defined.has(key)))];\n return missing.length === 0\n ? []\n : [\n `tracking template references {_${missing.join(\"}, {_\")}} but this campaign defines no such custom parameter — define it here (--custom-param ${missing[0]}=…) or make sure the ad group or ad does, or it resolves empty`,\n ];\n}\n\nfunction campaignUpdateWarnings(p: CampaignUpdate): string[] {\n return [\n ...urlCustomParameterWarnings(p.trackingUrlTemplate, p.urlCustomParameters),\n ...biddingTargetWarnings(p.bidding),\n ];\n}\n\nfunction campaignCreateWarnings(p: CampaignCreate): string[] {\n const warnings: string[] = urlCustomParameterWarnings(p.trackingUrlTemplate, p.urlCustomParameters);\n if (p.bidding && (p.bidding.type === \"MAXIMIZE_CONVERSIONS\" || p.bidding.type === \"MAXIMIZE_CONVERSION_VALUE\")) {\n warnings.push(\"automated bidding needs conversion tracking live before it can optimize\");\n }\n if (p.channelType === \"PERFORMANCE_MAX\") {\n warnings.push(\"Performance Max needs an asset group (stage one with `asset-groups create`) before it can serve\");\n }\n if (p.brandGuidelines?.enabled) {\n warnings.push(BRAND_GUIDELINES_LINKS_WARNING);\n }\n warnings.push(...biddingTargetWarnings(p.bidding));\n return warnings;\n}\n\nexport const BRAND_GUIDELINES_LINKS_WARNING =\n 'Brand guidelines are on: link the business name and a square logo to THIS campaign in the same draft — `assets attach --file \\'{\"level\":\"campaign\",\"parent\":\"<campaign ref>\",\"asset\":\"<asset id>\",\"fieldType\":\"BUSINESS_NAME\"}\\'` and the same with `\"fieldType\":\"LOGO\"` — or Google refuses the campaign (Baker holds the publish until both are staged).';\n\nfunction budgetCreateWarnings(p: BudgetCreate): string[] {\n if (p.amountMicros !== undefined && p.amountMicros < PLAYBOOK_DAILY_BUDGET_FLOOR_MICROS) {\n return [`budget ${p.amountMicros / 1_000_000} is very low — campaigns rarely exit learning below ~10/day`];\n }\n return [];\n}\n\n/**\n * Bidding strategies whose delivery is driven by a target the advertiser sets.\n *\n * Since 17 August 2026 a campaign limited by its budget delivers toward that TARGET rather than\n * toward the cost per conversion it has recently been achieving (Google Ads Help 17061251: a $10\n * Target CPA on a campaign running at $5 moves toward $10). A generous target used to be capped in\n * practice by the budget and is not any more.\n *\n * Deliberately excludes MANUAL_CPC, TARGET_IMPRESSION_SHARE, TARGET_CPM and TARGET_SPEND: Google's\n * note scopes the change to target CPA / target ROAS / target CPC, so warning on the others would\n * be noise on a change the release never touched.\n */\nconst TARGET_DRIVEN_BIDDING_TYPES: ReadonlySet<GoogleBiddingStrategyType> = new Set<GoogleBiddingStrategyType>([\n \"TARGET_CPA\",\n \"TARGET_ROAS\",\n \"TARGET_CPC\",\n \"MAXIMIZE_CONVERSIONS\",\n \"MAXIMIZE_CONVERSION_VALUE\",\n]);\n\n/**\n * Exported so the stage layer can drop it when it has the campaign's live target and can say the\n * same thing with both numbers in it — the dashboard renders only the first warning on an op, so\n * two near-identical sentences means the vague one hides the exact one.\n */\nexport const LOOSE_TARGET_WARNING =\n \"a campaign limited by its budget now delivers close to this target instead of to the cost per conversion it has been achieving, so a target set above what this campaign actually does today raises that cost rather than leaving it alone. Set the target from the campaign's own recent performance, and check whether it is limited by budget first: `baker ads google query --preset budget-limited`.\";\n\nfunction biddingTargetWarnings(bidding: BiddingConfig | undefined): string[] {\n if (!bidding || !TARGET_DRIVEN_BIDDING_TYPES.has(bidding.type)) {\n return [];\n }\n if (\n bidding.targetCpaMicros === undefined &&\n bidding.targetRoas === undefined &&\n bidding.targetCpcMicros === undefined\n ) {\n return [];\n }\n return [LOOSE_TARGET_WARNING];\n}\n\n/**\n * A budget update carries no bidding config and no live budget, so the only thing decidable from\n * the payload alone is the same floor `budget.create` warns about. The August 2026 interaction —\n * raising a budget on a campaign whose target sits above its actual performance — needs the live\n * amount to know a raise from a cut, so it lives in `writes/biddingTarget.ts` where the owning\n * campaign's snapshot is already read. Warning here unconditionally would have fired on every\n * decrease too, and called it a raise.\n */\nfunction budgetUpdateWarnings(p: BudgetUpdate): string[] {\n if (p.amountMicros !== undefined && p.amountMicros < PLAYBOOK_DAILY_BUDGET_FLOOR_MICROS) {\n return [`budget ${p.amountMicros / 1_000_000} is very low — campaigns rarely exit learning below ~10/day`];\n }\n return [];\n}\n\nfunction responsiveSearchAdWarnings(content: AdContent): string[] {\n if (content.format !== \"responsiveSearch\") {\n return [];\n }\n const warnings: string[] = [];\n if (content.headlines.length < 8) {\n warnings.push(`only ${content.headlines.length} headlines — Google recommends 8-15 for best Ad Strength`);\n }\n const pins = content.headlines.filter((h) => h.pinnedField).length;\n if (pins > content.headlines.length / 2) {\n warnings.push(\"pinning most headlines limits Google's optimization — pin sparingly\");\n }\n return warnings;\n}\n\n/**\n * The two conversion-action fields Baker fills in that the person approving the change would want a\n * say in. Both fire on the payload being SILENT, never on the value — an agent that chose\n * `ONE_PER_CLICK` on purpose made the decision this warning exists to surface.\n *\n * Only two of the five filled-in fields warn. `type` is plumbing (a website conversion is a website\n * conversion — the other types come with a whole different setup the agent has to ask for anyway),\n * `status` has nothing to decide (an action is created in order to measure), and `primaryForGoal`\n * already says itself on every card: the summary line always ends \"· secondary\" and the card carries\n * an \"Action optimization\" row. Warning on all five would put four notices on every conversion card\n * and teach the reader to skip them.\n */\nfunction conversionActionCreateWarnings(p: ConversionActionCreate): string[] {\n const warnings: string[] = [];\n if (p.category === undefined) {\n warnings.push(\n 'no conversion category was chosen, so this is filed as \"Default\" — the category decides which account-level goal the conversion belongs to, and so whether automated bidding ever optimizes toward it. Set the one that matches what the customer did (purchase, lead, sign-up, phone call, booking…) if \"Default\" is not where it belongs.',\n );\n }\n if (p.countingType === undefined) {\n warnings.push(\n \"nothing said how often this should count, so one conversion is counted per click — right for a lead or a sign-up, wrong for sales, where a customer who buys twice from the same click should count twice. Ask for every conversion to be counted if repeat purchases should each count.\",\n );\n }\n return warnings;\n}\n\nexport const AUTO_TAGGING_OFF_WARNING =\n \"Turning auto-tagging off stops Google adding the click id (gclid) to every landing page: Google Ads conversion tracking, uploaded offline conversions and the Google Analytics link all lose the click they match on. Stage it only if the user asked for it, and say what it costs.\";\n\nexport function collectOpWarnings(op: GoogleDraftOpInput): string[] {\n switch (op.kind) {\n case \"google.customer.update\":\n return op.payload.autoTaggingEnabled === false ? [AUTO_TAGGING_OFF_WARNING] : [];\n case \"google.budget.create\":\n return budgetCreateWarnings(op.payload);\n case \"google.budget.update\":\n return budgetUpdateWarnings(op.payload);\n case \"google.campaign.create\":\n return campaignCreateWarnings(op.payload);\n case \"google.campaign.update\":\n return campaignUpdateWarnings(op.payload);\n case \"google.biddingStrategy.create\":\n return biddingTargetWarnings(op.payload.config);\n case \"google.biddingStrategy.update\":\n return biddingTargetWarnings(op.payload.config);\n case \"google.ad.create\":\n return responsiveSearchAdWarnings(op.payload.content);\n case \"google.conversionAction.create\":\n return conversionActionCreateWarnings(op.payload);\n default:\n return [];\n }\n}\n","/**\n * Wire contract for `/api/ads/google/draft*` — staging, listing, and removing\n * draft Google Ads write ops. Ops stage per chat and apply only when the chat\n * publishes as a single atomic `GoogleAdsService.Mutate` batch;\n * `mode: \"simulated\"` means publish completes the full lifecycle without\n * calling Google (feature flag off).\n */\nimport { z } from \"zod\";\nimport { googleDraftOpInputSchema, googleDraftOpKindSchema } from \"./ops\";\n\nexport const googleWriteModeSchema = z.enum([\"live\", \"simulated\"]);\nexport type GoogleWriteMode = z.infer<typeof googleWriteModeSchema>;\n\n/**\n * Read-back check run AFTER the publish finalized: the entity is re-read from\n * the platform and compared against what the op declared. It never contradicts\n * `status` — a change that applied stays applied. `unconfirmed` means Baker\n * could not see the change, which on an eventually consistent platform is not\n * the same as it not having happened.\n */\nexport const publishVerificationSchema = z.object({\n status: z.enum([\"confirmed\", \"unconfirmed\", \"drifted\"]),\n note: z.string().optional(),\n checkedAt: z.number(),\n});\nexport type PublishVerification = z.infer<typeof publishVerificationSchema>;\n\nexport const googleDraftOpResultSchema = z.object({\n status: z.enum([\"applied\", \"simulated\", \"failed\", \"skipped\"]),\n resourceName: z.string().optional(),\n error: z.string().optional(),\n skippedBecause: z.string().optional(),\n executedAt: z.number().optional(),\n verification: publishVerificationSchema.optional(),\n /** A customer list's people upload: Google Data Manager's request id(s), comma-joined. */\n requestId: z.string().optional(),\n});\nexport type GoogleDraftOpResult = z.infer<typeof googleDraftOpResultSchema>;\n\n// --- POST /api/ads/google/draft/stage ---\n\nexport const googleDraftStageRequestSchema = z.object({\n chatId: z.string(),\n op: googleDraftOpInputSchema,\n});\nexport type GoogleDraftStageRequest = z.infer<typeof googleDraftStageRequestSchema>;\n\n/**\n * `staged: false` is a NO-OP, not a failure: every field the op asks for already\n * holds that value on the live account, so nothing was appended to the draft and\n * publish has nothing to send. `reason` says which state it already had.\n */\nexport const googleDraftStageResponseSchema = z.discriminatedUnion(\"staged\", [\n z.object({\n staged: z.literal(true),\n ref: z.string(),\n kind: googleDraftOpKindSchema,\n mode: googleWriteModeSchema,\n dependsOn: z.array(z.string()),\n summary: z.string(),\n warnings: z.array(z.string()),\n /** True when the op amended an already-staged op in place instead of appending a new one. */\n amended: z.boolean().optional(),\n }),\n z.object({\n staged: z.literal(false),\n noop: z.literal(true),\n kind: googleDraftOpKindSchema,\n mode: googleWriteModeSchema,\n summary: z.string(),\n reason: z.string(),\n }),\n]);\nexport type GoogleDraftStageResponse = z.infer<typeof googleDraftStageResponseSchema>;\n\n// --- POST /api/ads/google/draft/amend ---\n\n/**\n * Generic in-place amend: `patch` RFC-7386-merges into the staged op's payload (plain objects\n * deep-merge, `null` deletes the key, arrays/scalars replace), the merged payload re-validates\n * against the op's own kind, and `dependsOn` recomputes fresh from the merge (a re-parent drops\n * the old parent dep instead of unioning). `ref` matches the staged op's ref or, for staged\n * updates, its target — same lookup `findAmendTarget` uses.\n */\nexport const googleDraftAmendRequestSchema = z.object({\n chatId: z.string(),\n ref: z.string(),\n patch: z.record(z.string(), z.unknown()),\n});\nexport type GoogleDraftAmendRequest = z.infer<typeof googleDraftAmendRequestSchema>;\n\n// --- POST /api/ads/google/draft/show ---\n\nexport const googleDraftShowRequestSchema = z.object({\n chatId: z.string(),\n ref: z.string(),\n});\nexport type GoogleDraftShowRequest = z.infer<typeof googleDraftShowRequestSchema>;\n\n// --- POST /api/ads/google/draft/stage-batch ---\n\n/** Batch ceiling — negative lists routinely carry hundreds of keywords; one request stages them all. */\nexport const GOOGLE_DRAFT_BATCH_MAX = 500;\n\n/**\n * The largest one staged change may be. A draft holds any number of changes (each is its own\n * record), but one record holds at most 1 MiB, and publish writes a result onto it after Google has\n * applied the change — so a change is refused at staging well short of that. Ordinary changes are\n * a few KB; what comes near this is a payload carrying a whole list (a big Customer Match upload).\n */\nexport const GOOGLE_DRAFT_OP_MAX_BYTES = 512_000;\n/** How every too-large refusal starts — the CLI keys its `error.fix` off it. */\nexport const OP_TOO_LARGE_MESSAGE_START = \"This Google Ads change is too large to stage\";\n/** What to do about a change that is too large, for the CLI's `error.fix`. */\nexport const OP_TOO_LARGE_FIX =\n \"Nothing from this call was staged. Do not retry it as it is. Split the change that is too large into several smaller ones (for an audience upload, several smaller lists of members), stage those, and carry on with the rest of the job.\";\n\nexport const googleDraftStageBatchRequestSchema = z.object({\n chatId: z.string(),\n ops: z.array(googleDraftOpInputSchema).min(1).max(GOOGLE_DRAFT_BATCH_MAX),\n});\nexport type GoogleDraftStageBatchRequest = z.infer<typeof googleDraftStageBatchRequestSchema>;\n\n/**\n * All-or-nothing on validity: every valid op staged, or the whole batch rejected — no\n * partial drafts to reason about. `skipped` is separate from that contract: those ops\n * were valid but already hold the requested value on the live account, so they were\n * dropped rather than staged. `count` is what actually entered the draft.\n */\nexport const googleDraftStageBatchResponseSchema = z.object({\n staged: z.literal(true),\n mode: googleWriteModeSchema,\n count: z.number(),\n ops: z.array(\n z.object({\n ref: z.string(),\n kind: googleDraftOpKindSchema,\n dependsOn: z.array(z.string()),\n summary: z.string(),\n warnings: z.array(z.string()),\n }),\n ),\n skipped: z.array(z.object({ kind: googleDraftOpKindSchema, summary: z.string(), reason: z.string() })).optional(),\n});\nexport type GoogleDraftStageBatchResponse = z.infer<typeof googleDraftStageBatchResponseSchema>;\n\n// --- POST /api/ads/google/draft/amend-batch ---\n\n/**\n * Many generic amends in one request — each `{ ref, patch }` exactly as `/draft/amend` takes it,\n * checked in order against the draft as the amends before it left it, and written all or none.\n */\nexport const googleDraftAmendBatchRequestSchema = z.object({\n chatId: z.string(),\n amends: z\n .array(z.object({ ref: z.string().min(1), patch: z.record(z.string(), z.unknown()) }))\n .min(1)\n .max(GOOGLE_DRAFT_BATCH_MAX),\n});\nexport type GoogleDraftAmendBatchRequest = z.infer<typeof googleDraftAmendBatchRequestSchema>;\n\nexport const googleDraftAmendBatchResponseSchema = z.object({\n amended: z.literal(true),\n mode: googleWriteModeSchema,\n count: z.number(),\n ops: z.array(\n z.object({\n ref: z.string(),\n kind: googleDraftOpKindSchema,\n dependsOn: z.array(z.string()),\n summary: z.string(),\n warnings: z.array(z.string()),\n }),\n ),\n});\nexport type GoogleDraftAmendBatchResponse = z.infer<typeof googleDraftAmendBatchResponseSchema>;\n\n// --- POST /api/ads/google/draft (list) ---\n\nexport const googleDraftOpViewSchema = z.object({\n ref: z.string(),\n kind: googleDraftOpKindSchema,\n customerId: z.string(),\n target: z.string().optional(),\n dependsOn: z.array(z.string()),\n summary: z.string(),\n stagedAt: z.number(),\n result: googleDraftOpResultSchema.optional(),\n});\nexport type GoogleDraftOpView = z.infer<typeof googleDraftOpViewSchema>;\n\n// --- POST /api/ads/google/draft/show (response) ---\n\n/** The staged op's full payload as its \"receipt\" — verify a change looks right before publish. */\nexport const googleDraftShowResponseSchema = z.object({\n op: googleDraftOpViewSchema.extend({\n payload: z.unknown().optional(),\n warnings: z.array(z.string()).optional(),\n annotations: z.unknown().optional(),\n }),\n});\nexport type GoogleDraftShowResponse = z.infer<typeof googleDraftShowResponseSchema>;\n\nexport const googleDraftListRequestSchema = z.object({\n chatId: z.string(),\n /** Every op as `draft show` prints it, payload included — one call instead of a show per op. */\n full: z.boolean().optional(),\n});\nexport type GoogleDraftListRequest = z.infer<typeof googleDraftListRequestSchema>;\n\n/** A non-blocking completeness nudge for the staged draft (mirrors DraftAdvisory in completeness.ts). */\nexport const googleDraftAdvisorySchema = z.object({\n scope: z.enum([\"campaign\", \"adGroup\"]),\n message: z.string(),\n});\nexport type GoogleDraftAdvisory = z.infer<typeof googleDraftAdvisorySchema>;\n\n/** One member-collection rollup on a status node (e.g. \"Keywords in list\", \"Sitelinks\"). */\nexport const googleDraftStatusCollectionSchema = z.object({\n label: z.string(),\n added: z.number(),\n removed: z.number(),\n /** Members that stay in the set with a changed value — a device's bid adjustment. Optional: a\n * status tree built by an older backend carries no such count. */\n updated: z.number().optional(),\n existing: z.number(),\n});\nexport type GoogleDraftStatusCollection = z.infer<typeof googleDraftStatusCollectionSchema>;\n\n/** A node in the CLI status tree — the same campaign ▸ ad group ▸ ad grouping the dashboard renders. */\nexport interface GoogleDraftStatusNode {\n entity: string;\n name: string;\n /** The ad account this node lives in — one draft may span several. */\n customerId: string;\n operation?: GoogleDraftChangeOperationValue;\n existing: boolean;\n collections: GoogleDraftStatusCollection[];\n children: GoogleDraftStatusNode[];\n /** Non-blocking warnings on this node's heading op (e.g. \"target not found on the account\"). */\n warnings?: string[];\n}\nconst googleDraftChangeOperationSchema = z.enum([\"create\", \"update\", \"pause\", \"resume\", \"remove\", \"upload\"]);\ntype GoogleDraftChangeOperationValue = z.infer<typeof googleDraftChangeOperationSchema>;\nexport const googleDraftStatusNodeSchema: z.ZodType<GoogleDraftStatusNode> = z.lazy(() =>\n z.object({\n entity: z.string(),\n name: z.string(),\n customerId: z.string(),\n operation: googleDraftChangeOperationSchema.optional(),\n existing: z.boolean(),\n collections: z.array(googleDraftStatusCollectionSchema),\n children: z.array(googleDraftStatusNodeSchema),\n warnings: z.array(z.string()).optional(),\n }),\n);\n\nexport const googleDraftListResponseSchema = z.object({\n status: z.enum([\"active\", \"publishing\", \"applied\", \"discarded\", \"none\"]),\n mode: googleWriteModeSchema,\n count: z.number(),\n /** Payload, warnings and annotations only when the request asked for `full`. */\n ops: z.array(googleDraftShowResponseSchema.shape.op),\n /** Grouped campaign ▸ ad group ▸ ad tree for the readable CLI status view. */\n tree: z.array(googleDraftStatusNodeSchema).optional(),\n /** Non-blocking completeness advisories for the whole draft. */\n advisories: z.array(googleDraftAdvisorySchema).optional(),\n});\nexport type GoogleDraftListResponse = z.infer<typeof googleDraftListResponseSchema>;\n\n// --- POST /api/ads/google/draft/remove ---\n\nexport const googleDraftRemoveRequestSchema = z.object({\n chatId: z.string(),\n ref: z.string(),\n});\nexport type GoogleDraftRemoveRequest = z.infer<typeof googleDraftRemoveRequestSchema>;\n\nexport const googleDraftRemoveResponseSchema = z.object({\n /** The requested ref plus any dependents removed by cascade. */\n removed: z.array(z.string()),\n});\nexport type GoogleDraftRemoveResponse = z.infer<typeof googleDraftRemoveResponseSchema>;\n\n// --- POST /api/ads/google/draft/import ---\n\n/**\n * Move another open chat's staged ops into this chat's draft and out of that one, unchanged. `refs`\n * picks which (default: all); `exclude` leaves some behind. Ops tied by a `g_temp_*` dependency move\n * together.\n */\nexport const googleDraftImportRequestSchema = z.object({\n chatId: z.string(),\n fromChatId: z.string().min(1),\n refs: z.array(z.string().min(1)).min(1).optional(),\n exclude: z.array(z.string().min(1)).min(1).optional(),\n});\nexport type GoogleDraftImportRequest = z.infer<typeof googleDraftImportRequestSchema>;\n\nexport const googleDraftImportResponseSchema = z.object({\n /** Refs now staged on this chat, in the order the other chat staged them. */\n moved: z.array(z.string()),\n /** How many ops the other chat still has staged. */\n sourceRemaining: z.number(),\n});\nexport type GoogleDraftImportResponse = z.infer<typeof googleDraftImportResponseSchema>;\n\n// --- POST /api/ads/google/draft/clear ---\n\nexport const googleDraftClearRequestSchema = z.object({\n chatId: z.string(),\n});\nexport type GoogleDraftClearRequest = z.infer<typeof googleDraftClearRequestSchema>;\n\nexport const googleDraftClearResponseSchema = z.object({\n cleared: z.number(),\n});\nexport type GoogleDraftClearResponse = z.infer<typeof googleDraftClearResponseSchema>;\n\n// --- POST /api/ads/google/draft/validate ---\n\n/**\n * Ask Google about the whole staged draft without applying anything: every op is built, windowed\n * and sent exactly as publish would send it, with `validateOnly: true`. `full` adds each op's built\n * request and Google's raw answer for its window.\n */\nexport const googleDraftValidateRequestSchema = z.object({\n chatId: z.string(),\n full: z.boolean().optional(),\n});\nexport type GoogleDraftValidateRequest = z.infer<typeof googleDraftValidateRequestSchema>;\n\n/**\n * - `accepted` — Google accepted the op as publish would send it.\n * - `refused` — the op itself would fail at publish: Google refused it, or Baker would not send it.\n * - `blocked` — the op is fine on its own but would not apply, because something it depends on (or\n * shares an all-or-nothing request with) was refused.\n * - `unchecked` — this op cannot be asked about without applying something; publish is its check.\n * - `applied` — an earlier publish already applied it; it is not sent again.\n */\nexport const GOOGLE_DRAFT_VERDICTS = [\"accepted\", \"refused\", \"blocked\", \"unchecked\", \"applied\"] as const;\nexport const googleDraftVerdictSchema = z.enum(GOOGLE_DRAFT_VERDICTS);\nexport type GoogleDraftVerdict = z.infer<typeof googleDraftVerdictSchema>;\n\nexport const googleDraftOpVerdictSchema = z.object({\n ref: z.string(),\n summary: z.string(),\n verdict: googleDraftVerdictSchema,\n /** Why it was not accepted, in the words publish would record. */\n reason: z.string().optional(),\n /** `full` only. */\n kind: googleDraftOpKindSchema.optional(),\n customerId: z.string().optional(),\n request: z.unknown().optional(),\n response: z.unknown().optional(),\n});\nexport type GoogleDraftOpVerdict = z.infer<typeof googleDraftOpVerdictSchema>;\n\nexport const googleDraftValidateResponseSchema = z.object({\n status: z.enum([\"active\", \"publishing\", \"applied\", \"discarded\", \"none\"]),\n /** Requests sent to Google — one per publish window. */\n requests: z.number(),\n counts: z.record(googleDraftVerdictSchema, z.number()),\n /** Publish would send nothing: Baker holds the whole first publish when any op is refused before sending. */\n publishHeld: z.boolean(),\n ops: z.array(googleDraftOpVerdictSchema),\n});\nexport type GoogleDraftValidateResponse = z.infer<typeof googleDraftValidateResponseSchema>;\n\n// --- Structured validation errors (400) ---\n\nexport const googleFieldErrorSchema = z.object({\n path: z.string(),\n message: z.string(),\n});\nexport type GoogleFieldError = z.infer<typeof googleFieldErrorSchema>;\n\nexport const googleDraftErrorResponseSchema = z.object({\n code: z.string(),\n error: z.string(),\n fields: z.array(googleFieldErrorSchema).optional(),\n});\nexport type GoogleDraftErrorResponse = z.infer<typeof googleDraftErrorResponseSchema>;\n"],"mappings":"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AAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AACV;AAEO,IAAM,qBAA6C;AAAA,EACxD,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAA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,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,CAAC;AAC1xC,IAAM,YAA0B,oBAAI,YAAY,CAAC,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,OAAM,OAAM,OAAM,OAAM,KAAK,CAAC;AAC7/F,IAAM,aAA2B,oBAAI,WAAW,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,GAAE,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,IAAG,IAAG,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,IAAG,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,IAAG,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,IAAG,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,IAAG,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,IAAG,GAAE,IAAG,IAAG,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,IAAG,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,CAAC,CAAC;AACnosB,IAAM,YAA0B,oBAAI,YAAY,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,GAAE,KAAI,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,GAAE,KAAI,GAAE,IAAG,KAAI,KAAI,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,IAAG,IAAG,IAAG,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,IAAG,IAAG,KAAI,KAAI,IAAG,IAAG,KAAI,IAAG,IAAG,KAAI,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,IAAG,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,KAAI,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,KAAI,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,KAAI,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,KAAI,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,KAAI,KAAI,IAAG,GAAE,IAAG,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,GAAE,GAAE,KAAI,GAAE,KAAI,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,IAAG,KAAI,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,IAAG,GAAE,GAAE,GAAE,KAAI,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,GAAE,IAAG,GAAE,KAAI,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,KAAI,GAAE,GAAE,KAAI,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,GAAE,KAAI,GAAE,GAAE,IAAG,KAAI,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,KAAI,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,GAAE,KAAI,GAAE,KAAI,GAAE,KAAI,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,KAAI,KAAI,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,KAAI,KAAI,GAAE,KAAI,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,KAAI,KAAI,KAAI,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,GAAE,KAAI,GAAE,GAAE,GAAE,IAAG,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,KAAI,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,IAAG,KAAI,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,IAAG,KAAI,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,KAAI,KAAI,GAAE,GAAE,IAAG,IAAG,GAAE,KAAI,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,IAAG,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,GAAE,GAAE,IAAG,KAAI,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,GAAE,KAAI,KAAI,KAAI,KAAI,KAAI,GAAE,KAAI,KAAI,KAAI,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,IAAG,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,IAAG,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,KAAI,KAAI,KAAI,KAAI,GAAE,GAAE,IAAG,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,GAAE,KAAI,KAAI,KAAI,KAAI,GAAE,GAAE,IAAG,IAAG,KAAI,KAAI,KAAI,KAAI,GAAE,KAAI,KAAI,KAAI,KAAI,GAAE,IAAG,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,IAAG,KAAI,GAAE,KAAI,KAAI,KAAI,KAAI,GAAE,KAAI,KAAI,KAAI,GAAE,IAAG,GAAE,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,GAAE,KAAI,KAAI,KAAI,GAAE,KAAI,KAAI,GAAE,KAAI,GAAE,IAAG,GAAE,GAAE,KAAI,IAAG,GAAE,KAAI,KAAI,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,KAAI,KAAI,KAAI,GAAE,KAAI,KAAI,KAAI,KAAI,GAAE,IAAG,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,IAAG,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,GAAE,IAAG,KAAI,IAAG,GAAE,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,IAAG,GAAE,KAAI,KAAI,KAAI,KAAI,KAAI,IAAG,KAAI,KAAI,KAAI,IAAG,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,GAAE,IAAG,KAAI,GAAE,KAAI,KAAI,KAAI,IAAG,KAAI,IAAG,GAAE,KAAI,KAAI,KAAI,KAAI,KAAI,IAAG,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,GAAE,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,IAAG,KAAI,IAAG,KAAI,KAAI,KAAI,KAAI,GAAE,KAAI,KAAI,KAAI,IAAG,KAAI,IAAG,IAAG,KAAI,IAAG,GAAE,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,GAAE,KAAI,IAAG,IAAG,KAAI,KAAI,GAAE,IAAG,KAAI,GAAE,KAAI,KAAI,KAAI,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,GAAE,GAAE,IAAG,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,G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CjE,gBAAgB;AAAA,EAClB;AACF;;;AChkBO,IAAM,gCAAgC;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGA,IAAM,uCAA0D;AAAA,EAC9D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAC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","names":["z","z","z","z","extractHostname","suffixLookup","edge","z","z","z","z","refSchema","z","refSchema","existingRefSchema","z","refSchema","z","z","refSchema","z","z","z"]}
1
+ {"version":3,"sources":["../../api/src/ads-google/limits.ts","../../api/src/ads-google/conversion-upload.ts","../../api/src/ads-google/bidding-matrix.ts","../../api/src/ads-google/channel-settings.ts","../../api/src/ads-google/geo-constants.ts","../../../node_modules/.pnpm/tldts-core@7.4.15/node_modules/tldts-core/src/domain.ts","../../../node_modules/.pnpm/tldts-core@7.4.15/node_modules/tldts-core/src/domain-without-suffix.ts","../../../node_modules/.pnpm/tldts-core@7.4.15/node_modules/tldts-core/src/extract-hostname.ts","../../../node_modules/.pnpm/tldts-core@7.4.15/node_modules/tldts-core/src/is-ip.ts","../../../node_modules/.pnpm/tldts-core@7.4.15/node_modules/tldts-core/src/is-special-use.ts","../../../node_modules/.pnpm/tldts-core@7.4.15/node_modules/tldts-core/src/is-valid.ts","../../../node_modules/.pnpm/tldts-core@7.4.15/node_modules/tldts-core/src/options.ts","../../../node_modules/.pnpm/tldts-core@7.4.15/node_modules/tldts-core/src/subdomain.ts","../../../node_modules/.pnpm/tldts-core@7.4.15/node_modules/tldts-core/src/factory.ts","../../../node_modules/.pnpm/tldts-core@7.4.15/node_modules/tldts-core/src/lookup/fast-path.ts","../../../node_modules/.pnpm/tldts@7.4.15/node_modules/tldts/src/data/trie.ts","../../../node_modules/.pnpm/tldts@7.4.15/node_modules/tldts/src/suffix-trie.ts","../../../node_modules/.pnpm/tldts@7.4.15/node_modules/tldts/index.ts","../../api/src/ads-google/criteria.ts","../../api/src/ads-google/structured-snippet-headers.ts","../../api/src/ads-google/ops.ts","../../api/src/ads-google/wire.ts"],"sourcesContent":["/**\n * Single source of truth for Google Ads API write constraints (v23). Every zod\n * schema in `ops.ts` reads from here — no scattered literals. Money is in\n * micros (major currency × 1,000,000) everywhere the API expects it.\n */\n\nexport const GOOGLE_ADS_LIMITS = {\n budget: {\n nameMax: 255,\n amountMicrosMin: 1,\n },\n campaign: {\n nameMax: 255,\n /** `campaign.final_url_suffix` — the query string appended to every final URL under the campaign. */\n finalUrlSuffixMax: 2048,\n /** `campaign.tracking_url_template` — the click-measurement URL every ad routes through. */\n trackingUrlTemplateMax: 2048,\n /** `campaign.url_custom_parameters` — Google caps a single entity at 8 `{_name}` parameters. */\n urlCustomParametersMax: 8,\n urlCustomParameterKeyMax: 16,\n urlCustomParameterValueMax: 250,\n /** `campaign.text_guidelines.term_exclusions` — words AI Max and Performance Max must never write. */\n termExclusionsMax: 25,\n termExclusionMax: 30,\n /** `campaign.text_guidelines.messaging_restrictions` — freeform rules for generated text. */\n messagingRestrictionsMax: 40,\n messagingRestrictionMax: 300,\n },\n adGroup: {\n nameMax: 255,\n },\n keyword: {\n textMax: 80,\n wordsMax: 10,\n },\n responsiveSearchAd: {\n headlinesMin: 3,\n headlinesMax: 15,\n headlineTextMax: 30,\n descriptionsMin: 2,\n descriptionsMax: 4,\n descriptionTextMax: 90,\n pathMax: 15,\n },\n responsiveDisplayAd: {\n headlinesMin: 1,\n headlinesMax: 5,\n headlineTextMax: 30,\n longHeadlineTextMax: 90,\n descriptionsMin: 1,\n descriptionsMax: 5,\n descriptionTextMax: 90,\n businessNameMax: 25,\n },\n appAd: {\n headlinesMin: 1,\n headlinesMax: 5,\n headlineTextMax: 30,\n descriptionsMin: 1,\n descriptionsMax: 5,\n descriptionTextMax: 90,\n imagesMax: 20,\n youtubeVideosMax: 20,\n },\n /** `DemandGenMultiAssetAdInfo` — the image-carrying Demand Gen ad. No long headline exists on it. */\n demandGenAd: {\n adNameMax: 255,\n headlinesMin: 1,\n headlinesMax: 5,\n headlineTextMax: 40,\n descriptionsMin: 1,\n descriptionsMax: 5,\n descriptionTextMax: 90,\n businessNameMax: 25,\n },\n /**\n * `DemandGenVideoResponsiveAdInfo` — the Demand Gen ad that runs a YouTube video. It is the only\n * ad format with BOTH a headline list and a long-headline list, which is why its copy has no home\n * in `demandGenAd`: every content schema is strict, so a payload naming `longHeadlines` there is\n * refused, and before this format existed a served Demand Gen video ad could not be edited at all.\n */\n demandGenVideoAd: {\n adNameMax: 255,\n headlinesMin: 1,\n headlinesMax: 5,\n headlineTextMax: 40,\n longHeadlinesMin: 1,\n longHeadlinesMax: 5,\n longHeadlineTextMax: 90,\n descriptionsMin: 1,\n descriptionsMax: 5,\n descriptionTextMax: 90,\n businessNameMax: 25,\n },\n sharedSet: {\n nameMax: 255,\n },\n asset: {\n sitelinkLinkTextMax: 25,\n sitelinkDescriptionMax: 35,\n calloutTextMax: 25,\n // A snippet's HEADER has no length limit of its own — it has to be one of\n // Google's published headers (`structured-snippet-headers.ts`), the longest\n // of which is 29 characters. Only the values are capped.\n structuredSnippetValuesMin: 3,\n structuredSnippetValuesMax: 10,\n /**\n * Per VALUE, not per asset. Google rejects a 26-character value with a bare \"Too long.\" at\n * `structured_snippet_asset.values[i]` — one red row inside an otherwise clean publish, plus\n * every link that depends on the asset. Confirmed live on v23: \"Bases de datos vectoriales\"\n * (26) rejected, its four neighbours accepted.\n */\n structuredSnippetValueMax: 25,\n },\n conversionAction: {\n nameMax: 255,\n },\n audience: {\n nameMax: 255,\n /** `membership_life_span` and a rule's lookback window top out at 540 days. */\n membershipLifeSpanDaysMax: 540,\n },\n biddingStrategy: {\n nameMax: 255,\n },\n label: {\n nameMax: 255,\n },\n assetGroup: {\n nameMax: 255,\n headlinesMin: 3,\n headlinesMax: 15,\n headlineTextMax: 30,\n longHeadlinesMin: 1,\n longHeadlinesMax: 5,\n longHeadlineTextMax: 90,\n descriptionsMin: 2,\n descriptionsMax: 5,\n descriptionTextMax: 90,\n businessNameMax: 25,\n },\n /** A Performance Max asset group's signals: its search themes and its one combined audience. */\n assetGroupSignal: {\n searchThemesMax: 25,\n searchThemeTextMax: 80,\n audiencesMax: 1,\n },\n} as const;\n\n/**\n * Most rows one `/api/ads/google/query` read returns — the route refuses a larger `pageSize`, the CLI a\n * larger `--limit` or statement LIMIT. Google pages at 10000, but a Convex function returns at most 8192\n * array items, so a larger page fails the route as a bare internal error.\n */\nexport const GOOGLE_ADS_QUERY_MAX_PAGE_SIZE = 8192;\n\nexport const KEYWORD_MATCH_TYPES = [\"EXACT\", \"PHRASE\", \"BROAD\"] as const;\nexport type GoogleKeywordMatchType = (typeof KEYWORD_MATCH_TYPES)[number];\n\n/**\n * The campaign types Baker can CREATE. Its one consumer is `campaignCreateSchema.channelType`, so\n * this is a write-side allowlist, not a vocabulary — GAQL reads never pass through it.\n *\n * A type is here only once its required settings are staged fields with a builder and, where they\n * name something outside the campaign, a stage-time precheck (`channel-settings.ts`; backend\n * `channelLinks.ts`). Every other channel was sent to Google as a validateOnly create on v25\n * (2026-10-08) and refused, so each is answered by {@link CHANNEL_CREATE_REFUSALS} with why and what\n * to do instead: VIDEO is `MUTATE_NOT_ALLOWED` for every sub-type and bidding; LOCAL's\n * `local_campaign_setting` is `OPERATION_NOT_PERMITTED_FOR_CONTEXT` (Local campaigns became\n * Performance Max); SMART's business setting is `RESOURCE_DOES_NOT_SUPPORT_VALIDATE_ONLY`, so no\n * draft holding one could be validated.\n */\nexport const ADVERTISING_CHANNEL_TYPES = [\n \"SEARCH\",\n \"DISPLAY\",\n \"PERFORMANCE_MAX\",\n \"DEMAND_GEN\",\n \"SHOPPING\",\n \"MULTI_CHANNEL\",\n \"TRAVEL\",\n \"HOTEL\",\n] as const;\nexport type GoogleAdvertisingChannelType = (typeof ADVERTISING_CHANNEL_TYPES)[number];\n\n/** Why each channel Baker does not create is refused — the route, in words a marketer acts on. */\nexport const CHANNEL_CREATE_REFUSALS: Readonly<Record<string, string>> = {\n VIDEO:\n \"Google does not allow Video campaigns to be created through its API. To run video on YouTube, stage a Demand Gen campaign with a Demand Gen video ad; for a Video views or reach campaign, ask the user to create it in Google Ads.\",\n LOCAL:\n \"Google retired Local campaigns — they became Performance Max. Stage a PERFORMANCE_MAX campaign with store-visit goals instead.\",\n APP: \"An App campaign is channel MULTI_CHANNEL with channelSubType APP_CAMPAIGN (installs) or APP_CAMPAIGN_FOR_ENGAGEMENT, plus appCampaignSetting.\",\n SMART:\n \"Baker can't create Smart campaigns: their business details (phone, website, business profile) are a setting Google refuses to check before publishing, so the change could never be validated. Stage a Search or Performance Max campaign instead, or ask the user to create the Smart campaign in Google Ads.\",\n LOCAL_SERVICES:\n \"Local Services campaigns are created by Google's own Local Services setup, not through the API. Ask the user to set it up in Google Ads.\",\n DISCOVERY: \"Discovery campaigns are now Demand Gen — stage a DEMAND_GEN campaign instead.\",\n};\n\n/**\n * Sub-types still accepted on a channel Google lets the API create (validateOnly creates on v25):\n * DISPLAY_MOBILE_APP with Manual CPC; APP_CAMPAIGN and APP_CAMPAIGN_FOR_ENGAGEMENT (one is required on\n * an App campaign); TRAVEL_ACTIVITIES (required on Travel — sent when a Travel create leaves it out).\n */\nexport const ADVERTISING_CHANNEL_SUB_TYPES = [\n \"DISPLAY_MOBILE_APP\",\n \"APP_CAMPAIGN\",\n \"APP_CAMPAIGN_FOR_ENGAGEMENT\",\n \"TRAVEL_ACTIVITIES\",\n] as const;\n\n/** The channel each sub-type belongs to — a sub-type on any other channel is refused. */\nexport const SUB_TYPE_CHANNEL: Readonly<Record<(typeof ADVERTISING_CHANNEL_SUB_TYPES)[number], string>> = {\n DISPLAY_MOBILE_APP: \"DISPLAY\",\n APP_CAMPAIGN: \"MULTI_CHANNEL\",\n APP_CAMPAIGN_FOR_ENGAGEMENT: \"MULTI_CHANNEL\",\n TRAVEL_ACTIVITIES: \"TRAVEL\",\n};\n\nconst RETIRED_SUB_TYPE = \"Google retired this campaign sub-type — it can no longer be created.\";\n\n/**\n * Sub-types Google refuses on v25, each answered live (2026-10-08): Express and Gmail are\n * `MUTATE_NOT_ALLOWED` / `ENUM_VALUE_NOT_PERMITTED`, Smart Display and Smart Shopping are not\n * permitted, Video's are part of a channel the API cannot create, and two are not in v25's enum at\n * all (a request-level 400 for the whole window).\n */\nexport const SUB_TYPE_CREATE_REFUSALS: Readonly<Record<string, string>> = {\n SEARCH_EXPRESS: `${RETIRED_SUB_TYPE} Stage a standard Search campaign (leave the sub-type out).`,\n DISPLAY_EXPRESS: `${RETIRED_SUB_TYPE} Stage a standard Display campaign (leave the sub-type out).`,\n DISPLAY_GMAIL_AD: `${RETIRED_SUB_TYPE} Gmail ads now run through Demand Gen — stage a DEMAND_GEN campaign.`,\n DISPLAY_SMART_CAMPAIGN: `${RETIRED_SUB_TYPE} Stage a standard Display campaign, or Performance Max.`,\n SHOPPING_SMART_ADS: `${RETIRED_SUB_TYPE} Smart Shopping became Performance Max — stage a PERFORMANCE_MAX campaign.`,\n SHOPPING_COMPARISON_LISTING_ADS: `${RETIRED_SUB_TYPE} Ask the user to create a comparison-listing campaign in Google Ads.`,\n SEARCH_MOBILE_APP: `${RETIRED_SUB_TYPE} App promotion runs through App campaigns — stage MULTI_CHANNEL with sub-type APP_CAMPAIGN.`,\n SEARCH_MOBILE_APP_ENGAGEMENT: `${RETIRED_SUB_TYPE} App promotion runs through App campaigns — stage MULTI_CHANNEL with sub-type APP_CAMPAIGN_FOR_ENGAGEMENT.`,\n APP_CAMPAIGN_FOR_PRE_REGISTRATION:\n \"Baker does not stage pre-registration App campaigns: Google needs the app open for pre-registration and goal settings Baker cannot set. Ask the user to create it in Google Ads.\",\n VIDEO_ACTION: `${RETIRED_SUB_TYPE} Video action campaigns became Demand Gen — stage a DEMAND_GEN campaign.`,\n VIDEO_NON_SKIPPABLE: CHANNEL_CREATE_REFUSALS.VIDEO ?? RETIRED_SUB_TYPE,\n VIDEO_OUTSTREAM: CHANNEL_CREATE_REFUSALS.VIDEO ?? RETIRED_SUB_TYPE,\n LOCAL_CAMPAIGN: CHANNEL_CREATE_REFUSALS.LOCAL ?? RETIRED_SUB_TYPE,\n};\nexport type GoogleAdvertisingChannelSubType = (typeof ADVERTISING_CHANNEL_SUB_TYPES)[number];\n\nexport const BIDDING_STRATEGY_TYPES = [\n \"MANUAL_CPC\",\n \"MAXIMIZE_CONVERSIONS\",\n \"MAXIMIZE_CONVERSION_VALUE\",\n \"TARGET_SPEND\",\n \"TARGET_CPA\",\n \"TARGET_ROAS\",\n \"TARGET_IMPRESSION_SHARE\",\n \"MANUAL_CPM\",\n \"MANUAL_CPV\",\n \"PERCENT_CPC\",\n // Demand Gen's \"maximize clicks at a target CPC\" — `Campaign.target_cpc`, overridable per ad\n // group via `AdGroup.target_cpc_micros`. Confirmed present in v23.\n // It is one of the target-driven strategies governed by the August 2026 budget-limited\n // change, so modelling it as a strategy without a target would leave a Demand Gen\n // campaign's exposure invisible to `biddingTargetWarnings`.\n \"TARGET_CPC\",\n] as const;\nexport type GoogleBiddingStrategyType = (typeof BIDDING_STRATEGY_TYPES)[number];\n\n/**\n * v25 `BrandSafetySuitability` — the account's video inventory setting\n * (`customer.video_brand_safety_suitability`, writable on the customer since v25): expanded shows\n * ads beside the widest range of content, limited beside the narrowest.\n */\nexport const VIDEO_BRAND_SAFETY_LEVELS = [\"EXPANDED_INVENTORY\", \"STANDARD_INVENTORY\", \"LIMITED_INVENTORY\"] as const;\n\n/** v25 `TargetImpressionShareLocation` — where on the results page the share is counted. */\nexport const TARGET_IMPRESSION_SHARE_LOCATIONS = [\"ANYWHERE_ON_PAGE\", \"TOP_OF_PAGE\", \"ABSOLUTE_TOP_OF_PAGE\"] as const;\n\n/**\n * Channels where Google folded the standalone Target CPA / Target ROAS strategies into Maximize\n * conversions / Maximize conversion value (2021). On one of these, the target lives at\n * `campaign.maximize_conversions.target_cpa_micros`, and writing the legacy `campaign.target_cpa`\n * comes back `ContextError.OPERATION_NOT_PERMITTED_FOR_CONTEXT` — confirmed live on v23 against a\n * Search campaign (request GphdG5HKabzlUWQqjGne9w, at\n * `mutate_operations[109].campaign_operation.update.target_cpa`).\n *\n * `SEARCH` alone, deliberately. Google's own announcement of the merge covers Search campaigns, and\n * the field is still the live one on App, Display and Video, where a blanket refusal would block a\n * legitimate edit. The June 2026 relabel that brings \"Target CPA\" back as its own option in the UI\n * is cosmetic — it renames the same Maximize-conversions-with-a-target strategy and does not make\n * `campaign.target_cpa` settable again. Widen this set only against a live rejection, the way this\n * entry was earned.\n */\nconst MERGED_TARGET_STRATEGY_CHANNELS = new Set([\"SEARCH\"]);\n\n/**\n * Shared by the CLI-boundary refusal on a campaign create, the stage-time refusal on a campaign\n * update, and the publish-time humanizer — so all three tell the user the same thing.\n *\n * Names the route, because the strategy the user asked for is not gone: it is the same bidding under\n * the name Google now files it under, one flag away. Saying only \"not allowed\" would send a marketer\n * looking for a setting that no longer exists.\n */\nexport const MERGED_TARGET_CPA_MESSAGE =\n \"Google doesn't accept Target CPA as a bidding strategy of its own on a Search campaign — the target sits inside Maximize conversions. Choose Maximize conversions and give it the same target CPA; it bids exactly the same.\";\n\n/** The Target ROAS half of {@link MERGED_TARGET_CPA_MESSAGE}. */\nexport const MERGED_TARGET_ROAS_MESSAGE =\n \"Google doesn't accept Target ROAS as a bidding strategy of its own on a Search campaign — the target sits inside Maximize conversion value. Choose Maximize conversion value and give it the same target ROAS; it bids exactly the same.\";\n\n/**\n * Why this inline bidding strategy can't be set on this campaign, or undefined to let it through.\n *\n * Only a positively-read channel refuses: an unknown channel (a stage-time read that missed, an\n * op that never carried one) falls through to publish, where the partial-failure isolation and the\n * humanized message are the backstop. Blocking a legitimate change is worse than failing one.\n *\n * Portfolio strategies are not covered on purpose — `BiddingStrategy` still takes a standalone\n * `target_cpa` / `target_roas`, and a Search campaign may point at one.\n */\nexport function mergedTargetStrategyRefusal(\n channelType: string | undefined,\n biddingType: string | undefined,\n): string | undefined {\n if (channelType === undefined || !MERGED_TARGET_STRATEGY_CHANNELS.has(channelType)) {\n return undefined;\n }\n if (biddingType === \"TARGET_CPA\") {\n return MERGED_TARGET_CPA_MESSAGE;\n }\n return biddingType === \"TARGET_ROAS\" ? MERGED_TARGET_ROAS_MESSAGE : undefined;\n}\n\n/**\n * The route out of {@link EMBEDDED_TARGET_CPA_DEMAND_GEN_MESSAGE} — named, not just refused, because\n * the bidding the user asked for is available here, under the other spelling.\n */\nexport const EMBEDDED_TARGET_CPA_DEMAND_GEN_MESSAGE =\n \"Google doesn't accept a target CPA inside Maximize conversions on a Demand Gen campaign — there the target is its own bidding strategy. Choose Target CPA and give it the same target; it bids exactly the same.\";\n\n/**\n * The exact inverse of {@link mergedTargetStrategyRefusal}, and the reason both have to exist.\n *\n * On Search, Google merged Target CPA into Maximize conversions, so the target rides inside that\n * strategy and a standalone `TARGET_CPA` is refused. On Demand Gen the opposite holds: the target is\n * its own strategy, and `maximize_conversions.target_cpa_micros` is refused. So the single rule\n * \"put the target inside Maximize conversions\" — correct on Search, and the one the CLI's own\n * `--target-cpa` help teaches — publishes a rejected op the moment it is applied to a Demand Gen\n * campaign. That is not hypothetical: two campaigns on one account, both\n * `{\"maximizeConversions\":{\"targetCpaMicros\":…}}` with `updateMask` `maximizeConversions.targetCpaMicros`,\n * both answered `OPERATION_NOT_PERMITTED_FOR_CONTEXT` (\"The operation is not allowed for the given\n * context.\") after the Session had already merged and gone live.\n *\n * `DEMAND_GEN` alone, and Target CPA alone, deliberately — the same discipline the Search entry\n * documents. Maximize conversion value's embedded `target_roas` was refused here too once Google was\n * asked (v25, 2026-10-09); that one lives with the other channels' in `embeddedTargetRefusal`.\n */\nexport function embeddedTargetOnDemandGenRefusal(\n channelType: string | undefined,\n bidding: { type?: string; targetCpaMicros?: number } | undefined,\n): string | undefined {\n if (channelType !== \"DEMAND_GEN\" || bidding?.type !== \"MAXIMIZE_CONVERSIONS\") {\n return undefined;\n }\n return bidding.targetCpaMicros === undefined ? undefined : EMBEDDED_TARGET_CPA_DEMAND_GEN_MESSAGE;\n}\n\n/** The route out of {@link manualCpcOnDemandGenRefusal}, naming bidding that has been published on this channel. */\nexport const MANUAL_CPC_DEMAND_GEN_MESSAGE =\n \"Google doesn't accept Manual CPC on a Demand Gen campaign. Choose Maximize conversions (with a Target CPA as its own strategy if you have a target), or Target CPC, which exists on this channel alone.\";\n\n/**\n * Manual CPC on Demand Gen, the third per-channel bidding rule and the one that was being actively\n * taught: the Demand Gen playbook that ships in every sandbox said to use `MANUAL_CPC` \"as the click\n * proxy\" for prospecting. Google answers the create with `OPERATION_NOT_PERMITTED_FOR_CONTEXT` at\n * `campaign_operation.create.manual_cpc`, and because a campaign create is one operation inside an\n * atomic batch, the ad group, the ad and every asset staged with it fail too. Confirmed live on v23,\n * then confirmed the other way by publishing the same campaign with `MAXIMIZE_CONVERSIONS`.\n *\n * Same discipline as its siblings: `DEMAND_GEN` alone, `MANUAL_CPC` alone, and an unread channel\n * falls through to publish.\n */\nexport function manualCpcOnDemandGenRefusal(\n channelType: string | undefined,\n biddingType: string | undefined,\n): string | undefined {\n return channelType === \"DEMAND_GEN\" && biddingType === \"MANUAL_CPC\" ? MANUAL_CPC_DEMAND_GEN_MESSAGE : undefined;\n}\n\n/** The Demand-Gen-only half of {@link MERGED_TARGET_CPA_MESSAGE}, and named the same way: route, not verdict. */\nexport const TARGET_CPC_DEMAND_GEN_MESSAGE =\n \"Google only accepts Target CPC on a Demand Gen campaign — no other campaign type has a target CPC. Pick the bidding this campaign's type supports (Maximize conversions with a target CPA on Search), or set the target CPC on the Demand Gen campaign that should carry it.\";\n\n/**\n * The mirror image of {@link mergedTargetStrategyRefusal}: that one names the channels a strategy is\n * refused ON, this one names the only channel a strategy is accepted on. `Campaign.target_cpc` exists\n * on Demand Gen alone, so the same op staged against Search, Display or Video passes every payload\n * check and then fails the whole atomic publish batch.\n *\n * Same conservatism, for the same reason: an unknown channel falls through to publish rather than\n * blocking a change that may well be legitimate.\n */\nexport function demandGenOnlyStrategyRefusal(\n channelType: string | undefined,\n biddingType: string | undefined,\n): string | undefined {\n if (biddingType !== \"TARGET_CPC\" || channelType === undefined || channelType === \"DEMAND_GEN\") {\n return undefined;\n }\n return TARGET_CPC_DEMAND_GEN_MESSAGE;\n}\n\n/**\n * `campaign.geo_target_type_setting` — Google's \"Location options\": who a location targets.\n *\n * `PRESENCE_OR_INTEREST` is what Google applies when the setting is omitted on a create, so a\n * campaign staged without it goes live reaching people merely *interested* in the location.\n * `SEARCH_INTEREST` is in the proto but no longer settable (Google retired it in 2023), so it is\n * deliberately absent — offering it would stage an op that fails the whole atomic publish batch.\n */\nexport const POSITIVE_GEO_TARGET_TYPES = [\"PRESENCE_OR_INTEREST\", \"PRESENCE\"] as const;\nexport type GooglePositiveGeoTargetType = (typeof POSITIVE_GEO_TARGET_TYPES)[number];\n\n/** Exclusions: `PRESENCE` (Google's default) excludes only people in the location. */\nexport const NEGATIVE_GEO_TARGET_TYPES = [\"PRESENCE_OR_INTEREST\", \"PRESENCE\"] as const;\nexport type GoogleNegativeGeoTargetType = (typeof NEGATIVE_GEO_TARGET_TYPES)[number];\n\n/**\n * `STANDARD` alone. Google still STORES an `ACCELERATED` budget, but refuses to attach one to a\n * campaign — \"Cannot use accelerated delivery method on this budget\" on a real PAUSED Search create\n * (v25, 2026-10-08) — so it could only publish a budget nothing can spend, or fail the campaign\n * staged with it. A validateOnly request on the budget alone says yes, which is why it lasted.\n */\nexport const BUDGET_DELIVERY_METHODS = [\"STANDARD\"] as const;\nexport type GoogleBudgetDeliveryMethod = (typeof BUDGET_DELIVERY_METHODS)[number];\n\nexport const ACCELERATED_DELIVERY_MESSAGE =\n \"Google no longer runs accelerated delivery: a budget set to it cannot be attached to any campaign. Leave delivery at STANDARD (Google paces the budget across the day); to spend faster, raise the daily amount instead.\";\n\n/**\n * A zod `error` map for a retired enum value: the value's own explanation, or undefined to keep\n * zod's message for anything else. A retired value is answered with the route, not a bare\n * \"invalid option\", because the agent's next move depends on it.\n */\nexport function retiredChoiceError(retired: Readonly<Record<string, string>>) {\n return (issue: { input?: unknown }): string | undefined =>\n typeof issue.input === \"string\" ? retired[issue.input] : undefined;\n}\n\n/**\n * Mirrors v23's `AdGroupTypeEnum.AdGroupType`. Two values that were here are not in it:\n * `DEMAND_GEN_AD` and `VIDEO_OUTSTREAM`.\n *\n * `DEMAND_GEN_AD` was rejected live while publishing a Demand Gen video ad, with a request-level\n * `Invalid value at '…ad_group_operation.create.type'` — not a partial failure: it takes the WHOLE\n * mutate batch down, so the budget, campaign, asset and ad staged alongside it all failed with the\n * ad group's error. `VIDEO_OUTSTREAM` was never published, so it was confirmed the cheap way\n * instead — the API refuses a query filtering `ad_group.type = 'VIDEO_OUTSTREAM'` where\n * `'VIDEO_RESPONSIVE'` answers, and neither the name nor its old enum number is in v23.\n * `VIDEO_RESPONSIVE` and `VIDEO_EFFICIENT_REACH` are two v23 values Baker never offered.\n *\n * **A Demand Gen ad group has no type of its own**: the enum has no value for it, and Google derives\n * it from the campaign's channel when `type` is left unset — which is why `type` is now optional\n * rather than defaulted (see `adGroupCreateSchema`).\n */\nexport const AD_GROUP_TYPES = [\n \"SEARCH_STANDARD\",\n \"DISPLAY_STANDARD\",\n \"SHOPPING_PRODUCT_ADS\",\n \"VIDEO_BUMPER\",\n \"VIDEO_TRUE_VIEW_IN_STREAM\",\n \"VIDEO_TRUE_VIEW_IN_DISPLAY\",\n \"VIDEO_NON_SKIPPABLE_IN_STREAM\",\n \"VIDEO_RESPONSIVE\",\n \"VIDEO_EFFICIENT_REACH\",\n] as const;\nexport type GoogleAdGroupType = (typeof AD_GROUP_TYPES)[number];\n\nexport const SHARED_SET_TYPES = [\n \"NEGATIVE_KEYWORDS\",\n \"NEGATIVE_PLACEMENTS\",\n \"ACCOUNT_LEVEL_NEGATIVE_KEYWORDS\",\n \"BRANDS\",\n] as const;\nexport type GoogleSharedSetType = (typeof SHARED_SET_TYPES)[number];\n\nexport const AD_FORMATS = [\n \"responsiveSearch\",\n \"responsiveDisplay\",\n \"performanceMaxAssetGroup\",\n \"demandGen\",\n \"app\",\n \"video\",\n] as const;\nexport type GoogleAdFormat = (typeof AD_FORMATS)[number];\n\n/**\n * Google removed the call ad from the API — v25's `Ad` message has no `call_ad`, and a staged one is\n * answered `Unknown name \"callAd\"`: a request-level 400 that fails every change sent with it, not\n * just the ad. A call-only ad cannot be created or edited any more; the phone number now rides on a\n * call asset beside an ordinary responsive search ad.\n */\nexport const CALL_AD_RETIRED_MESSAGE =\n \"Google retired call ads: they can no longer be created or edited. To take phone calls from search, stage a responsive search ad and add the phone number as a call asset in Google Ads (Baker cannot stage call assets yet) — and tell the user that is the one manual step.\";\n\nexport const ENTITY_STATUSES = [\"ENABLED\", \"PAUSED\", \"REMOVED\"] as const;\nexport type GoogleEntityStatus = (typeof ENTITY_STATUSES)[number];\n\n/** Statuses a create op may carry — a create can't be born REMOVED. */\nexport const STAGEABLE_CREATE_STATUSES = [\"ENABLED\", \"PAUSED\"] as const;\n\nexport const PINNED_FIELDS = [\"HEADLINE_1\", \"HEADLINE_2\", \"HEADLINE_3\", \"DESCRIPTION_1\", \"DESCRIPTION_2\"] as const;\nexport type GooglePinnedField = (typeof PINNED_FIELDS)[number];\n\nexport const CONVERSION_ACTION_CATEGORIES = [\n \"DEFAULT\",\n \"PAGE_VIEW\",\n \"PURCHASE\",\n \"SIGNUP\",\n \"LEAD\",\n \"DOWNLOAD\",\n \"ADD_TO_CART\",\n \"BEGIN_CHECKOUT\",\n \"SUBSCRIBE_PAID\",\n \"PHONE_CALL_LEAD\",\n \"SUBMIT_LEAD_FORM\",\n \"BOOK_APPOINTMENT\",\n \"REQUEST_QUOTE\",\n \"CONTACT\",\n] as const;\n\n/**\n * Conversion action types the API can CREATE. `GOOGLE_ANALYTICS_4_CUSTOM` was here and Google answers\n * every create of it \"Creation of this conversion action type isn't supported by Google Ads API\" (v23\n * and v25): GA4 conversions come into Google Ads by importing the property's key events, not by\n * creating an action — see {@link GA4_CONVERSION_CREATE_MESSAGE}.\n */\nexport const CONVERSION_ACTION_TYPES = [\"WEBPAGE\", \"UPLOAD_CLICKS\", \"UPLOAD_CALLS\", \"WEBSITE_CALL\"] as const;\n\nexport const GA4_CONVERSION_CREATE_MESSAGE =\n \"Google Analytics conversions can't be created through Google's API — they are imported. Mark the event as a key event in Google Analytics, make sure the property is linked to Google Ads, and ask the user to import it in Google Ads (Goals → Conversions → New conversion action → Import → Google Analytics 4). To track it with a Google Ads tag instead, create a WEBPAGE conversion.\";\n\nexport const CONVERSION_COUNTING_TYPES = [\"ONE_PER_CLICK\", \"MANY_PER_CLICK\"] as const;\n\n/**\n * Google's `ConversionOrigin` — WHERE a conversion happens. Together with a `ConversionActionCategory`\n * it is the whole key of a `CustomerConversionGoal`, the account-level switch that decides whether a\n * conversion category counts toward automated bidding at all.\n *\n * `UNSPECIFIED` and `UNKNOWN` are deliberately absent. Google returns them, but never keys a real goal\n * on one, so an op carrying either could only address a goal that does not exist — and it would spend\n * a publish to find that out.\n */\nexport const CONVERSION_ORIGINS = [\n \"WEBSITE\",\n \"GOOGLE_HOSTED\",\n \"APP\",\n \"CALL_FROM_ADS\",\n \"STORE\",\n \"YOUTUBE_HOSTED\",\n] as const;\nexport type GoogleConversionOrigin = (typeof CONVERSION_ORIGINS)[number];\n\nexport const USER_LIST_TYPES = [\"CRM_BASED\", \"RULE_BASED\", \"LOGICAL\", \"BASIC\", \"LOOKALIKE\"] as const;\n\n/** Each kind of audience in a marketer's words — never Google's type code on a review or a summary. */\nexport const USER_LIST_TYPE_LABELS: Readonly<Record<(typeof USER_LIST_TYPES)[number], string>> = {\n CRM_BASED: \"Customer list\",\n RULE_BASED: \"Website visitors\",\n LOGICAL: \"Combined audience\",\n BASIC: \"People who converted\",\n LOOKALIKE: \"Lookalike audience\",\n};\n\nexport function userListTypeLabel(type: string): string | undefined {\n return (USER_LIST_TYPE_LABELS as Readonly<Record<string, string>>)[type];\n}\n\n/** v25 `UserListStringRuleItemOperator` — how a website-visitor rule compares a URL or parameter. */\nexport const USER_LIST_STRING_OPERATORS = [\n \"CONTAINS\",\n \"EQUALS\",\n \"STARTS_WITH\",\n \"ENDS_WITH\",\n \"NOT_EQUALS\",\n \"NOT_CONTAINS\",\n \"NOT_STARTS_WITH\",\n \"NOT_ENDS_WITH\",\n] as const;\n\n/** v25 `UserListNumberRuleItemOperator`, for a numeric custom parameter. */\nexport const USER_LIST_NUMBER_OPERATORS = [\n \"GREATER_THAN\",\n \"GREATER_THAN_OR_EQUAL\",\n \"EQUALS\",\n \"NOT_EQUALS\",\n \"LESS_THAN\",\n \"LESS_THAN_OR_EQUAL\",\n] as const;\n\n/** v25 `UserListLogicalRuleOperator`: a combined audience's rule takes ALL, ANY or NONE of its lists. */\nexport const USER_LIST_LOGICAL_OPERATORS = [\"ALL\", \"ANY\", \"NONE\"] as const;\n\n/** v25 `LookalikeExpansionLevel` — how far past the seed lists a lookalike reaches. */\nexport const LOOKALIKE_EXPANSION_LEVELS = [\"NARROW\", \"BALANCED\", \"BROAD\"] as const;\n\n/**\n * The targeting dimensions a `TargetingSetting.target_restrictions` row can name. Baker only ever\n * SETS the AUDIENCE one; the rest are here because a write replaces the whole repeated field, so\n * every dimension already on the account has to be readable in order to be sent back untouched.\n */\nexport const TARGETING_DIMENSIONS = [\n \"KEYWORD\",\n \"AUDIENCE\",\n \"TOPIC\",\n \"GENDER\",\n \"AGE_RANGE\",\n \"PLACEMENT\",\n \"PARENTAL_STATUS\",\n \"INCOME_RANGE\",\n] as const;\nexport type GoogleTargetingDimension = (typeof TARGETING_DIMENSIONS)[number];\n\nexport const ASSET_TYPES = [\n \"text\",\n \"image\",\n \"youtubeVideo\",\n \"sitelink\",\n \"callout\",\n \"structuredSnippet\",\n \"callToAction\",\n] as const;\nexport type GoogleAssetType = (typeof ASSET_TYPES)[number];\n\nexport const ASSET_FIELD_TYPES = [\n \"SITELINK\",\n \"CALLOUT\",\n \"STRUCTURED_SNIPPET\",\n \"CALL\",\n \"PRICE\",\n \"PROMOTION\",\n \"MOBILE_APP\",\n \"HEADLINE\",\n \"DESCRIPTION\",\n \"LOGO\",\n /**\n * Kept because a draft staged before {@link IMAGE_ASSET_LINK_MESSAGE} shipped may still carry one,\n * and because it is the field type an asset-group image occupies. It is refused on an\n * `assetLink.attach` — see that message for what Google actually does with it.\n */\n \"MARKETING_IMAGE\",\n \"BUSINESS_NAME\",\n /**\n * The one image link a Search campaign takes. It carries the advertiser's logo beside the ad and\n * is the only image field type that survives Google's field-type check at all — swept live on v23\n * and v25, campaign and customer level both answer `CUSTOMER_NOT_VERIFIED` (an account fact,\n * fixed by advertiser verification) rather than a field-type refusal. Ad group level is not a\n * level Google links it at — see {@link BUSINESS_LOGO_LEVEL_MESSAGE}.\n */\n \"BUSINESS_LOGO\",\n] as const;\n\n/** The levels Google links a `BUSINESS_LOGO` at: campaign and customer, never ad group. */\nexport const BUSINESS_LOGO_LEVELS = [\"campaign\", \"customer\"] as const;\n\nexport const BUSINESS_LOGO_LEVEL_MESSAGE =\n \"Google links a BUSINESS_LOGO at campaign or customer level only — an ad group link comes back \" +\n \"UNSUPPORTED_FIELD_TYPE. Attach it to the campaign instead.\";\n\n/**\n * The image field types an `assetLink.attach` can name. `AD_IMAGE` is the Search image extension and\n * is decided per account at stage time; the marketing-image ones are Performance Max asset-group\n * slots that no Search link takes.\n */\nconst IMAGE_ASSET_LINK_FIELD_TYPES = new Set([\n \"MARKETING_IMAGE\",\n \"SQUARE_MARKETING_IMAGE\",\n \"PORTRAIT_MARKETING_IMAGE\",\n \"AD_IMAGE\",\n]);\n\n/**\n * Google opens `AD_IMAGE` links (image extensions on Search) per advertiser account, and says so\n * nowhere a read can see. Checked live with `validate_only` on v25, Oct 2026:\n *\n * - Our harness account 3865083115 (no Search spend) answers `UNSUPPORTED_FIELD_TYPE` — \"not\n * supported to be added directly through asset links\" — at campaign, ad group and customer level,\n * on every campaign, on v23–v25. Google's v12 notes ship the field type \"for allowlisted\n * customers\"; the Help Center opens Search images to accounts with 60+ days of history and recent\n * Search spend.\n * - A client account with Search spend validates the very same six-image campaign link clean (200).\n *\n * So the stage asks Google (`adImageLinkVerdict`, `ads/google/writes/stage.ts`): accepted → the link\n * stages and applies at publish like a sitelink; refused → it is skipped with this message and Baker\n * stages the handover Task. `MARKETING_IMAGE` on a Search campaign is always refused\n * (`FIELD_TYPE_INCOMPATIBLE_WITH_CAMPAIGN_TYPE` — the six red rows of the production publish that\n * started this) and is sent back to `AD_IMAGE` with {@link SEARCH_IMAGE_FIELD_TYPE_MESSAGE}.\n *\n * **The upload half is never blocked, and saying otherwise costs the user real work.** In that\n * production publish all six uploads applied and only the links failed, while Baker told the\n * advertiser to upload the images. So a refusal ends in a handover, not a dead end.\n */\nexport const IMAGE_ASSET_LINK_MESSAGE =\n \"Google refuses the LINK, not the upload — so do not stop at this refusal, finish the handover. \" +\n \"Google opens image extensions on Search per advertiser account, and it answered that this account \" +\n \"does not take them through Baker. So stage the image assets anyway: `assets create` with an image \" +\n \"still publishes, and the image lands in the advertiser's Google Ads asset library. This link is skipped rather than \" +\n \"stored, so it costs nothing, and it is what records which images go on which campaign: Baker has \" +\n \"staged the handover Task from it, so do not stage a second one with `baker actions`. Tell the user \" +\n \"the images are already in their Google Ads account and only need adding to the campaign under \" +\n \"Assets — name them. Never tell them to upload the images; they are uploaded. The other image a \" +\n \"Search campaign takes through a link is the advertiser's logo — BUSINESS_LOGO at campaign or \" +\n \"customer level, on a verified account.\";\n\n/**\n * The `AD_IMAGE` link was not confirmed either way: Google's check failed for a reason that is not the\n * account gate, or could not be asked. The handover Task is still staged — a minute in Google Ads\n * beats images left off the campaign — but the agent is not told Google refuses, because it may not.\n */\nexport const IMAGE_LINK_UNCONFIRMED_MESSAGE =\n \"Not staged: Baker could not confirm with Google that this account takes image links on Search \" +\n \"(the check failed for a reason other than the account's own setting), so it staged the handover Task \" +\n \"instead — do not stage a second one with `baker actions`. The images are already in the advertiser's \" +\n \"Google Ads account; tell the user they only need adding to the campaign under Assets, and name them. \" +\n \"Do not tell them Google refuses images on their account — that was not established.\";\n\n/** A marketing-image field type on a campaign/ad group/customer link, which no Search campaign takes. */\nexport const SEARCH_IMAGE_FIELD_TYPE_MESSAGE =\n 'Not staged: a Search image extension links as AD_IMAGE — restage this link with \"fieldType\":\"AD_IMAGE\" in its --file payload. ' +\n \"MARKETING_IMAGE, SQUARE_MARKETING_IMAGE and PORTRAIT_MARKETING_IMAGE are Performance Max asset-group \" +\n \"slots (`asset-groups attach`); Google refuses them on a Search campaign.\";\n\n/** Whether this asset-link field type is an image slot Google refuses through an asset link. */\nexport function isImageAssetLinkFieldType(fieldType: string): boolean {\n return IMAGE_ASSET_LINK_FIELD_TYPES.has(fieldType);\n}\n\n/**\n * `AssetGroupAsset.AssetFieldType` — the field types an asset can occupy inside a Performance Max\n * asset group. A different enum from `ASSET_FIELD_TYPES` above, which types campaign/adGroup/customer\n * `AssetLink`s: this one carries the PMax-only ratios and LONG_HEADLINE, and drops the extension\n * field types (SITELINK/CALLOUT/PRICE/…) that cannot live on an asset group.\n */\nexport const ASSET_GROUP_ASSET_FIELD_TYPES = [\n \"MARKETING_IMAGE\",\n \"SQUARE_MARKETING_IMAGE\",\n \"PORTRAIT_MARKETING_IMAGE\",\n \"LOGO\",\n \"LANDSCAPE_LOGO\",\n \"YOUTUBE_VIDEO\",\n \"HEADLINE\",\n \"LONG_HEADLINE\",\n \"DESCRIPTION\",\n \"BUSINESS_NAME\",\n \"CALL_TO_ACTION_SELECTION\",\n] as const;\nexport type GoogleAssetGroupAssetFieldType = (typeof ASSET_GROUP_ASSET_FIELD_TYPES)[number];\n\nexport const DEVICE_TYPES = [\"MOBILE\", \"TABLET\", \"DESKTOP\", \"CONNECTED_TV\", \"OTHER\"] as const;\nexport const DAYS_OF_WEEK = [\"MONDAY\", \"TUESDAY\", \"WEDNESDAY\", \"THURSDAY\", \"FRIDAY\", \"SATURDAY\", \"SUNDAY\"] as const;\n\n/** Google Ads UI objective — advisory only (drives warnings, not an API field). */\nexport const CAMPAIGN_OBJECTIVES = [\n \"SALES\",\n \"LEADS\",\n \"WEBSITE_TRAFFIC\",\n \"PRODUCT_BRAND_CONSIDERATION\",\n \"BRAND_AWARENESS_REACH\",\n \"APP_PROMOTION\",\n \"LOCAL_STORE_VISITS\",\n] as const;\nexport type GoogleCampaignObjective = (typeof CAMPAIGN_OBJECTIVES)[number];\n\nexport const MICROS_PER_UNIT = 1_000_000;\n\nexport function toMicros(amount: number): number {\n return Math.round(amount * MICROS_PER_UNIT);\n}\n\nexport function fromMicros(micros: number): number {\n return micros / MICROS_PER_UNIT;\n}\n\n/** Indicative daily-budget floor (advisory warning; Google enforces real minimums at apply). */\nexport const PLAYBOOK_DAILY_BUDGET_FLOOR_MICROS = 10 * MICROS_PER_UNIT;\n\nexport const TEMP_REF_PREFIX = \"g_temp_\";\nexport const TEMP_REF_REGEX = /^g_temp_[A-Za-z0-9_-]{2,}$/;\nexport const NUMERIC_ID_REGEX = /^\\d+$/;\n/** A Google Ads resource name, e.g. customers/123/campaigns/456. */\nexport const RESOURCE_NAME_REGEX = /^customers\\/\\d+\\/[A-Za-z]+\\/[-\\w~]+$/;\nexport const GEO_TARGET_CONSTANT_REGEX = /^geoTargetConstants\\/\\d+$/;\nexport const LANGUAGE_CONSTANT_REGEX = /^languageConstants\\/\\d+$/;\n\nexport const SIMULATED_RESOURCE_PREFIX = \"simulated-\";\n\n/**\n * The only image shapes an App campaign ad accepts (`AppAdInfo.images`): landscape 1.91:1,\n * square 1:1, portrait 4:5. A 16:9 image is NOT a landscape App image — it is 7% off 1.91:1\n * and Google rejects the whole ad mutate with \"The aspect ratio of the image does not match\n * the expected aspect ratios provided in the asset spec\", naming nothing.\n */\nexport const APP_AD_IMAGE_ASPECT_RATIOS = [\n { label: \"1.91:1\", ratio: 1.91 },\n { label: \"1:1\", ratio: 1 },\n { label: \"4:5\", ratio: 0.8 },\n] as const;\n\n/**\n * The shapes an `AD_IMAGE` link (a Search image extension) takes: landscape and square. Narrower than\n * the App-ad set on purpose — a shape Google might also take costs a handover Task, a shape it refuses\n * costs a publish failure with the Task already withdrawn.\n */\nexport const SEARCH_IMAGE_ASPECT_RATIOS = [\n { label: \"1.91:1\", ratio: 1.91 },\n { label: \"1:1\", ratio: 1 },\n] as const;\n\n/** Relative tolerance Google allows around each accepted ratio — wide enough for rounding, narrow enough to reject 16:9. */\nexport const APP_AD_IMAGE_ASPECT_TOLERANCE = 0.02;\n","/**\n * Manual conversion upload — the contract for re-sending conversions Google never received.\n *\n * Every other staged Google op describes a change to the ACCOUNT's configuration and applies as a\n * `GoogleAdsService.Mutate` operation. This one describes measurement that already happened and\n * applies through Data Manager `events:ingest` — the same endpoint the server-side tag\n * (`sideEffects/googleAdsCapi`) posts to on every live conversion. It exists for the case that\n * endpoint failed: a connection that had lost the `datamanager` scope, an outage, a tag that was\n * misconfigured for a week. The conversions are real, the account simply never heard about them.\n *\n * Because a conversion is only ever uploaded to REPAIR a gap, the row's `orderId` is required and is\n * the same order id the original submission carried. Google recognises an upload it has already\n * recorded by that id, so a re-send of something that did land is a correction rather than a second\n * conversion — which is what makes a backfill safe to run when nobody is sure how much was lost.\n *\n * Identifiers are hashed before anything is stored: the staged draft, the publish request and the\n * write log all hold SHA-256 hex, never an address. See `writes/conversionUpload.ts`.\n */\nimport { z } from \"zod\";\nimport { NUMERIC_ID_REGEX, RESOURCE_NAME_REGEX } from \"./limits\";\n\n/**\n * Rows per staged op. Well under what `events:ingest` accepts in one request — the ceiling that\n * matters here is the review: a draft card nobody can read is not a change anybody approved, and a\n * backfill larger than this is several days' repair that should stage (and fail) day by day.\n */\nexport const CONVERSION_UPLOAD_MAX_ROWS = 200;\n\n/** A SHA-256 hex digest — what a hashed identifier looks like once `stageConversionUpload` is done with it. */\nexport const SHA256_HEX_REGEX = /^[0-9a-f]{64}$/i;\n\n/** The conversion action the rows are recorded against: a bare numeric id or its full resource name. */\nexport const conversionUploadActionSchema = z.union([\n z.string().regex(NUMERIC_ID_REGEX, \"expected the numeric conversion action id\"),\n z.string().regex(RESOURCE_NAME_REGEX, \"expected a customers/…/conversionActions/… resource name\"),\n]);\n\n/**\n * Google's click identifiers are URL-safe tokens. Validated by shape rather than by provider —\n * a `gclid` copied out of a spreadsheet routinely arrives wrapped in quotes or with a stray `?gclid=`\n * still attached, and both reach Google as an id it has never issued, where the upload is accepted\n * and attributed to nothing.\n */\nconst clickIdSchema = z\n .string()\n .min(1)\n .max(512)\n .regex(/^[A-Za-z0-9_.-]+$/, \"a click id is letters, digits, '-', '_' and '.' only — paste the id, not the URL\");\n\n/**\n * An instant, with its offset stated. A bare `2026-08-01T10:00:00` is refused on purpose: it reads as\n * local time to the person who typed it and as UTC to everything downstream, and a conversion filed\n * two hours from where it happened lands in the wrong day's reporting with nothing to show for it.\n */\nconst conversionDateTimeSchema = z\n .string()\n .regex(\n /^\\d{4}-\\d{2}-\\d{2}[T ]\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(Z|[+-]\\d{2}:\\d{2})$/,\n \"expected an ISO-8601 instant WITH a timezone, e.g. 2026-08-01T10:00:00Z or 2026-08-01T12:00:00+02:00\",\n )\n .refine((value) => Number.isFinite(Date.parse(value)), \"not a real date\");\n\n/** An email address, or the SHA-256 hex it is stored as once staged. */\nconst emailSchema = z\n .string()\n .min(3)\n .max(320)\n .refine(\n (value) => SHA256_HEX_REGEX.test(value) || /^[^@\\s]+@[^@\\s]+\\.[^@\\s]+$/.test(value),\n \"expected an email address\",\n );\n\n/**\n * A phone number in E.164, or the SHA-256 hex it is stored as once staged.\n *\n * The leading `+` and country code are required, not tidied up. A number stored the way a client's\n * CRM holds it — `600111222`, no country code — hashes to a different digest from the one Google\n * holds for that person, so the upload is accepted, reports as applied, and matches nobody. There is\n * no way to detect that afterwards from either end, and no way to guess the country from the digits.\n */\nconst phoneSchema = z\n .string()\n .min(4)\n .max(64)\n .refine(\n (value) => SHA256_HEX_REGEX.test(value) || /^\\+\\d[\\d\\s().-]{6,}$/.test(value),\n \"expected a phone number in E.164 with its country code, e.g. +34600111222 — a local number hashes to something Google cannot match\",\n );\n\n/**\n * A name, or the SHA-256 hex it is stored as. Google hashes given/family name after lowercasing and\n * stripping punctuation and whitespace, so what a CRM exports is normalized on the way in — the\n * caller sends \"Van Der Berg\" and Baker sends the digest of `vanderberg`.\n */\nconst nameSchema = z.string().min(1).max(120);\n\n/**\n * Google's address identifier requires all four of givenName, familyName, regionCode and postalCode\n * together — a partial address is not a weaker match, it is not a match at all, and Google rejects\n * the identifier rather than degrading it. City, region and street are optional refinements on top.\n */\nconst addressSchema = z\n .strictObject({\n givenName: nameSchema,\n familyName: nameSchema,\n /** ISO-3166-1 alpha-2, sent in the clear — it is not identifying on its own. */\n regionCode: z.string().regex(/^[A-Z]{2}$/, \"expected a 2-letter country code, e.g. ES\"),\n /** Sent in the clear, like the country: Google matches on it as a plain string. */\n postalCode: z.string().min(2).max(16),\n addressLine: z.string().min(1).max(200).optional(),\n city: z.string().min(1).max(100).optional(),\n /** State / province / region, whatever the country calls it. */\n administrativeArea: z.string().min(1).max(100).optional(),\n })\n .describe(\"advanced matching by name and address\");\n\n/**\n * How many conversions this one row stands for.\n *\n * Only meaningful on a conversion action whose counting type is EVERY — a lead action counts one per\n * click whatever is sent. Left unset it is one, which is what a repaired Form submission is; a\n * backfilled basket of three items sold in one order is three.\n */\nconst conversionCountSchema = z.number().int().positive().max(10_000);\n\n/**\n * Where the conversion happened. Defaults to WEB, which is what a repaired tag gap always is — the\n * others exist because a backfill of phone or in-store conversions arrives the same way and reads\n * wrong filed as web traffic.\n */\nexport const CONVERSION_EVENT_SOURCES = [\"WEB\", \"APP\", \"IN_STORE\", \"PHONE\", \"OTHER\"] as const;\n\nexport const conversionUploadRowSchema = z\n .strictObject({\n /**\n * The order id the original conversion carried — Baker's server-side tag sends the Form\n * submission id here, so a repair reuses that. Required: without it Google has no way to tell a\n * re-send from a new conversion, and the only way to find out is to double-count.\n */\n orderId: z.string().min(1).max(64),\n conversionDateTime: conversionDateTimeSchema,\n gclid: clickIdSchema.optional(),\n gbraid: clickIdSchema.optional(),\n wbraid: clickIdSchema.optional(),\n email: emailSchema.optional(),\n phone: phoneSchema.optional(),\n address: addressSchema.optional(),\n conversionCount: conversionCountSchema.optional(),\n eventSource: z.enum(CONVERSION_EVENT_SOURCES).optional(),\n value: z.number().nonnegative().optional(),\n currency: z\n .string()\n .regex(/^[A-Z]{3}$/, \"expected a 3-letter currency code, e.g. EUR\")\n .optional(),\n })\n .refine(\n (row) => Boolean(row.gclid ?? row.gbraid ?? row.wbraid ?? row.email ?? row.phone ?? row.address),\n \"every conversion needs something to match on: a click id (gclid / gbraid / wbraid), or a customer's email, phone or name+address\",\n )\n .refine(\n (row) => [row.gclid, row.gbraid, row.wbraid].filter(Boolean).length <= 1,\n \"pass at most one click id per conversion — gclid, gbraid and wbraid are three ways of naming the same click\",\n )\n // Currency is not optional next to a value: Google reads a value with no currency in the ACCOUNT's\n // currency, so a EUR order uploaded from a USD account silently changes what the campaign is worth.\n .refine(\n (row) => row.value === undefined || row.currency !== undefined,\n \"a conversion with a value needs its currency too\",\n )\n .refine((row) => row.currency === undefined || row.value !== undefined, \"currency was given with no value\");\nexport type ConversionUploadRow = z.infer<typeof conversionUploadRowSchema>;\n\nexport const conversionUploadSchema = z\n .strictObject({\n conversionAction: conversionUploadActionSchema,\n conversions: z.array(conversionUploadRowSchema).min(1).max(CONVERSION_UPLOAD_MAX_ROWS),\n })\n // Two rows with one order id are one conversion described twice — Google keeps one of them and\n // never says which, so the count the upload reports and the count the account records diverge.\n .refine((payload) => {\n const ids = payload.conversions.map((row) => row.orderId);\n return new Set(ids).size === ids.length;\n }, \"two conversions share an order id — each order id can appear once per upload\");\nexport type ConversionUpload = z.infer<typeof conversionUploadSchema>;\n\n/** The conversion action id an upload records against, whichever way it was named. */\nexport function conversionUploadActionId(payload: ConversionUpload): string {\n return payload.conversionAction.split(\"/\").pop() ?? payload.conversionAction;\n}\n\nexport interface ConversionUploadTotals {\n count: number;\n /** How many rows carry a value at all — the rest upload as a conversion with no revenue. */\n valued: number;\n /** Summed value, present only when every valued row agrees on one currency. */\n total?: { amount: number; currency: string };\n currencies: string[];\n}\n\n/**\n * Add money in minor units, then come back.\n *\n * Both call sites interpolate this straight into a label a reviewer reads as money, and a plain\n * float sum does not survive that: 12.10 + 3.30 is 15.399999999999999 in binary, and with up to\n * 200 decimal rows a set that sums exactly is the exception.\n */\nfunction sumMoney(values: number[]): number {\n return values.reduce((sum, value) => sum + Math.round(value * 100), 0) / 100;\n}\n\n/** What an upload adds up to, for the summary line and the review card. */\nexport function conversionUploadTotals(payload: ConversionUpload): ConversionUploadTotals {\n const valuedRows = payload.conversions.filter((row) => row.value !== undefined);\n const currencies = [...new Set(valuedRows.map((row) => row.currency ?? \"\"))].filter(Boolean).sort();\n const only = currencies.length === 1 ? currencies[0] : undefined;\n return {\n count: payload.conversions.length,\n valued: valuedRows.length,\n // Mixed currencies deliberately produce no total: adding EUR to USD gives a number that is wrong\n // in both, and this line is read as money.\n ...(only ? { total: { amount: sumMoney(valuedRows.map((row) => row.value ?? 0)), currency: only } } : {}),\n currencies,\n };\n}\n\n/** Order ids dated in the future — a conversion that has not happened yet is a typo, not a backfill. */\nexport function futureConversionRows(payload: ConversionUpload, nowMs: number): string[] {\n return payload.conversions.filter((row) => Date.parse(row.conversionDateTime) > nowMs).map((row) => row.orderId);\n}\n\nconst MS_PER_DAY = 24 * 60 * 60 * 1000;\n\n/**\n * Order ids older than the conversion action's own click-through window. Google attributes an upload\n * to the click it names only while that click is still inside the window the action is configured\n * for, so anything past it is accepted and then counted against nothing. The number comes off the\n * account, never off a constant here — the window is a per-action setting the client can change.\n */\nexport function staleConversionRows(payload: ConversionUpload, lookbackDays: number, nowMs: number): string[] {\n const cutoff = nowMs - lookbackDays * MS_PER_DAY;\n return payload.conversions.filter((row) => Date.parse(row.conversionDateTime) < cutoff).map((row) => row.orderId);\n}\n\n/** How many rows match on a click id versus on a hashed customer identifier — stated on the review card. */\nexport function conversionUploadMatchCounts(payload: ConversionUpload): { byClick: number; byCustomer: number } {\n let byClick = 0;\n let byCustomer = 0;\n for (const row of payload.conversions) {\n if (row.gclid ?? row.gbraid ?? row.wbraid) {\n byClick += 1;\n } else {\n // Email, phone and name+address all reach Google as customer details under the same terms, so\n // they count as one kind here — the per-row table is where WHICH of them is stated.\n byCustomer += 1;\n }\n }\n return { byClick, byCustomer };\n}\n\nconst MONTHS = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"] as const;\n\n/**\n * One instant as a date a marketer reads. Hand-rolled rather than `Intl`, because this string is\n * built once at stage time and then stored on the draft and shown back unchanged — a value that\n * varied with the runtime's locale would make the same upload read differently in the chat, in\n * History and in a test.\n *\n * UTC, and the clock time is dropped: an upload covers a period, and \"2026-08-20T10:14:00Z\" tells\n * the person approving it nothing that \"20 Aug 2026\" does not.\n */\nfunction conversionUploadDay(instant: string): string {\n const date = new Date(instant);\n if (Number.isNaN(date.getTime())) {\n return instant;\n }\n return `${date.getUTCDate()} ${MONTHS[date.getUTCMonth()]} ${date.getUTCFullYear()}`;\n}\n\n/**\n * One instant as a date and time a person reads, in UTC.\n *\n * UTC and said so at the column header, rather than each row's own offset: a backfill routinely\n * mixes `Z` rows exported from one system with `+02:00` rows typed by hand, and a table that renders\n * each in its own zone cannot be scanned for the out-of-order row that is the whole point of reading\n * it. Same hand-rolled formatting as the range label, for the same reason.\n */\nexport function conversionUploadInstantLabel(instant: string): string {\n const date = new Date(instant);\n if (Number.isNaN(date.getTime())) {\n return instant;\n }\n const hh = String(date.getUTCHours()).padStart(2, \"0\");\n const mm = String(date.getUTCMinutes()).padStart(2, \"0\");\n return `${date.getUTCDate()} ${MONTHS[date.getUTCMonth()]} ${date.getUTCFullYear()}, ${hh}:${mm}`;\n}\n\n/**\n * The two days the upload runs between, as the label renders them.\n *\n * One definition of \"which day is this row on\", shared by the label and by the multi-day check, so\n * the phrase and the decision to show it cannot disagree: a warning that says \"Covers conversions\n * dated 1 Sep 2026\" is one that decided a one-day window spans several.\n */\nfunction conversionUploadDayEnds(payload: ConversionUpload): { start: string; end: string } {\n const { from, to } = conversionUploadRange(payload);\n return { start: conversionUploadDay(from), end: conversionUploadDay(to) };\n}\n\n/** The window an upload covers, as one phrase: \"20 Aug 2026 – 28 Aug 2026\", or one date if it is all one day. */\nexport function conversionUploadRangeLabel(payload: ConversionUpload): string {\n const { start, end } = conversionUploadDayEnds(payload);\n return start === end ? start : `${start} – ${end}`;\n}\n\n/**\n * Whether the upload really covers more than one day.\n *\n * The days, never the instants. Comparing the two ends of the range as timestamps answers \"are these\n * two rows the same moment\", which is a different question and is false for almost every upload —\n * a single afternoon's repair has rows at 10:00 and 15:45. Read that way, the multi-day heads-up\n * fired on everything with two rows in it and said \"Covers conversions dated 1 Sep 2026\", warning\n * about a window that is one day wide.\n */\nexport function conversionUploadSpansSeveralDays(payload: ConversionUpload): boolean {\n const { start, end } = conversionUploadDayEnds(payload);\n return start !== end;\n}\n\n/**\n * A conversion's value as money, with its cents kept: \"89.90 EUR\", never \"89.9 EUR\".\n *\n * These numbers are read straight off the client's own export and checked against it row by row, so\n * a trailing zero that JavaScript drops turns €89.90 into something that does not match the line the\n * reviewer is comparing it to. Two decimals for every currency: a zero-decimal one (JPY) reads a\n * little odd, which is a much smaller cost than a euro amount that looks like a different number.\n */\nexport function conversionValueLabel(amount: number, currency: string | undefined): string {\n return currency ? `${amount.toFixed(2)} ${currency}` : amount.toFixed(2);\n}\n\n/** The window an upload covers, as the earliest and latest instant in it. */\nexport function conversionUploadRange(payload: ConversionUpload): { from: string; to: string } {\n const sorted = [...payload.conversions].sort(\n (a, b) => Date.parse(a.conversionDateTime) - Date.parse(b.conversionDateTime),\n );\n const from = sorted[0]?.conversionDateTime ?? \"\";\n const to = sorted[sorted.length - 1]?.conversionDateTime ?? \"\";\n return { from, to };\n}\n\n/** Which identifiers a row actually carries, in the order Google prefers them. Never their values. */\nexport function conversionRowIdentifiers(row: ConversionUploadRow): string[] {\n const carried: string[] = [];\n if (row.gclid) carried.push(\"gclid\");\n if (row.gbraid) carried.push(\"gbraid\");\n if (row.wbraid) carried.push(\"wbraid\");\n if (row.email) carried.push(\"email\");\n if (row.phone) carried.push(\"phone\");\n if (row.address) carried.push(\"name + address\");\n return carried;\n}\n","/**\n * Which bidding Google takes on which campaign type — channel (× sub-type) → strategies.\n *\n * Every row is what Google ANSWERED, not what its docs imply: each pair was sent as a validateOnly\n * campaign create on v25 against 3865083115 (2026-10-08, `scripts/dev/google-ads-matrix`\n * `bidding-matrix` fixture), and a strategy is listed only if Google accepted it. Where the docs and\n * the API disagree the API wins — Google's \"Bidding strategy types\" page\n * (developers.google.com/google-ads/api/docs/campaigns/bidding/strategy-types) lists Maximize\n * conversions as a portfolio strategy for Performance Max, and attaching one is\n * `CANNOT_ATTACH_TO_BIDDING_STRATEGY`.\n *\n * Refusals Google gave and this table encodes: Manual CPM / CPV and Percent CPC are\n * `OPERATION_NOT_PERMITTED_FOR_CONTEXT` on every creatable channel but Display (Manual CPM);\n * Target impression share on anything but Search; Maximize clicks on Performance Max; a standalone\n * Target CPA / ROAS on Search and Performance Max (the target rides inside Maximize conversions /\n * conversion value there); any portfolio strategy on Performance Max or Demand Gen; Maximize\n * conversions / conversion value portfolios on Display. \"Customer does not have enough conversions\"\n * is an eligibility answer about the ACCOUNT, not the pair, so those pairs stay allowed.\n *\n * A channel with no row (Video, Shopping, App… — Baker does not create them) refuses nothing: an\n * update to such a campaign falls through to publish, where the humanized error is the backstop.\n * Blocking a change that would have worked is worse than failing one.\n */\nimport type { GoogleBiddingStrategyType } from \"./limits\";\n\ntype Strategies = readonly GoogleBiddingStrategyType[];\n\n/** Inline (standard) bidding a campaign of this type takes. `CHANNEL/SUB_TYPE` rows override the channel's. */\nexport const STANDARD_BIDDING_BY_CHANNEL: Readonly<Record<string, Strategies>> = {\n SEARCH: [\n \"MANUAL_CPC\",\n \"MAXIMIZE_CONVERSIONS\",\n \"MAXIMIZE_CONVERSION_VALUE\",\n \"TARGET_SPEND\",\n \"TARGET_IMPRESSION_SHARE\",\n ],\n DISPLAY: [\n \"MANUAL_CPC\",\n \"MAXIMIZE_CONVERSIONS\",\n \"MAXIMIZE_CONVERSION_VALUE\",\n \"TARGET_SPEND\",\n \"TARGET_CPA\",\n \"TARGET_ROAS\",\n \"MANUAL_CPM\",\n ],\n // Accepted with Manual CPC; Maximize conversions was OPERATION_NOT_PERMITTED_FOR_CONTEXT. Nothing\n // else was tried, so nothing else is claimed.\n \"DISPLAY/DISPLAY_MOBILE_APP\": [\"MANUAL_CPC\"],\n // Target ROAS answered \"not enough conversions\" — eligibility, so it stays.\n SHOPPING: [\"MANUAL_CPC\", \"TARGET_SPEND\", \"TARGET_ROAS\", \"MAXIMIZE_CONVERSION_VALUE\"],\n // Which one depends on the App goal (`APP_CAMPAIGN_GOALS`, channel-settings.ts); Manual CPC and\n // the rest were OPERATION_NOT_PERMITTED_FOR_CONTEXT.\n MULTI_CHANNEL: [\"TARGET_CPA\", \"MAXIMIZE_CONVERSIONS\", \"TARGET_ROAS\"],\n // With a target ROAS inside (required). Manual CPC, Maximize clicks, Target ROAS / CPA, Maximize\n // conversions and Percent CPC were all OPERATION_NOT_PERMITTED_FOR_CONTEXT. Hotel has no row: the\n // account cannot create one, so nothing was answered.\n TRAVEL: [\"MAXIMIZE_CONVERSION_VALUE\"],\n PERFORMANCE_MAX: [\"MAXIMIZE_CONVERSIONS\", \"MAXIMIZE_CONVERSION_VALUE\"],\n DEMAND_GEN: [\n \"MAXIMIZE_CONVERSIONS\",\n \"MAXIMIZE_CONVERSION_VALUE\",\n \"TARGET_SPEND\",\n \"TARGET_CPA\",\n \"TARGET_ROAS\",\n \"TARGET_CPC\",\n ],\n};\n\n/** Portfolio strategies a campaign of this type can be attached to. Empty = none at all. */\nexport const PORTFOLIO_BIDDING_BY_CHANNEL: Readonly<Record<string, Strategies>> = {\n SEARCH: [\n \"MAXIMIZE_CONVERSIONS\",\n \"MAXIMIZE_CONVERSION_VALUE\",\n \"TARGET_CPA\",\n \"TARGET_ROAS\",\n \"TARGET_SPEND\",\n \"TARGET_IMPRESSION_SHARE\",\n ],\n DISPLAY: [\"TARGET_CPA\", \"TARGET_ROAS\", \"TARGET_SPEND\"],\n SHOPPING: [\"MAXIMIZE_CONVERSION_VALUE\", \"TARGET_ROAS\", \"TARGET_SPEND\"],\n MULTI_CHANNEL: [],\n PERFORMANCE_MAX: [],\n DEMAND_GEN: [],\n};\n\n/**\n * The strategy types a portfolio (`BiddingStrategy`) can BE. Manual CPM, Manual CPV and Percent CPC\n * have no field on that resource at all — staging one sent `manualCpm` to Google, which answered\n * \"Unknown name\" and refused the whole request, every op in its window with it. Manual CPC and\n * Target CPC are refused with their own sentences in `biddingStrategyCreateSchema`.\n */\nexport const PORTFOLIO_STRATEGY_TYPES: Strategies = [\n \"MAXIMIZE_CONVERSIONS\",\n \"MAXIMIZE_CONVERSION_VALUE\",\n \"TARGET_CPA\",\n \"TARGET_ROAS\",\n \"TARGET_SPEND\",\n \"TARGET_IMPRESSION_SHARE\",\n];\n\n/** A strategy as the Google Ads interface names it, with the value to pass so the agent can act on it. */\nexport const BIDDING_STRATEGY_LABELS: Readonly<Record<GoogleBiddingStrategyType, string>> = {\n MANUAL_CPC: \"Manual CPC (MANUAL_CPC)\",\n MAXIMIZE_CONVERSIONS: \"Maximize conversions (MAXIMIZE_CONVERSIONS)\",\n MAXIMIZE_CONVERSION_VALUE: \"Maximize conversion value (MAXIMIZE_CONVERSION_VALUE)\",\n TARGET_SPEND: \"Maximize clicks (TARGET_SPEND)\",\n TARGET_CPA: \"Target CPA (TARGET_CPA)\",\n TARGET_ROAS: \"Target ROAS (TARGET_ROAS)\",\n TARGET_IMPRESSION_SHARE: \"Target impression share (TARGET_IMPRESSION_SHARE)\",\n MANUAL_CPM: \"Manual CPM (MANUAL_CPM)\",\n MANUAL_CPV: \"Manual CPV (MANUAL_CPV)\",\n PERCENT_CPC: \"Percent CPC (PERCENT_CPC)\",\n TARGET_CPC: \"Target CPC (TARGET_CPC)\",\n};\n\nconst CHANNEL_LABELS: Readonly<Record<string, string>> = {\n SEARCH: \"Search\",\n DISPLAY: \"Display\",\n PERFORMANCE_MAX: \"Performance Max\",\n DEMAND_GEN: \"Demand Gen\",\n SHOPPING: \"Shopping\",\n MULTI_CHANNEL: \"App\",\n TRAVEL: \"Travel\",\n HOTEL: \"Hotel\",\n};\n\nfunction labelOf(strategy: string): string {\n return BIDDING_STRATEGY_LABELS[strategy as GoogleBiddingStrategyType] ?? strategy;\n}\n\nfunction rowFor(\n table: Readonly<Record<string, Strategies>>,\n channelType: string,\n channelSubType: string | undefined,\n): Strategies | undefined {\n return (channelSubType ? table[`${channelType}/${channelSubType}`] : undefined) ?? table[channelType];\n}\n\n/**\n * Which targets a channel refuses INSIDE Maximize conversions (`cpa`) / conversion value (`roas`) —\n * there the target is a strategy of its own. Each was OPERATION_NOT_PERMITTED_FOR_CONTEXT at the\n * embedded field on a validateOnly create: Shopping at `maximize_conversion_value.target_roas`;\n * Display at `maximize_conversions.target_cpa_micros` (it took a target ROAS inside Maximize\n * conversion value) and Demand Gen at `maximize_conversion_value.target_roas` (v25, 2026-10-09).\n * Demand Gen's target CPA has its own rule (`embeddedTargetOnDemandGenRefusal`). A channel with no\n * row lets it through.\n */\nconst EMBEDDED_TARGETS_REFUSED: Readonly<Record<string, ReadonlyArray<\"cpa\" | \"roas\">>> = {\n SHOPPING: [\"cpa\", \"roas\"],\n MULTI_CHANNEL: [\"cpa\", \"roas\"],\n DISPLAY: [\"cpa\"],\n DEMAND_GEN: [\"roas\"],\n};\n\n/** Why this campaign type refuses a target inside Maximize conversions / conversion value, or undefined. */\nexport function embeddedTargetRefusal(\n channelType: string | undefined,\n bidding: { type: string; targetCpaMicros?: number; targetRoas?: number } | undefined,\n): string | undefined {\n const refused = channelType ? EMBEDDED_TARGETS_REFUSED[channelType] : undefined;\n if (!channelType || !bidding || !refused) {\n return undefined;\n }\n const channel = CHANNEL_LABELS[channelType] ?? channelType;\n const standalone = (strategy: GoogleBiddingStrategyType) =>\n STANDARD_BIDDING_BY_CHANNEL[channelType]?.includes(strategy)\n ? ` — choose ${labelOf(strategy)} with the same target instead.`\n : \".\";\n if (bidding.type === \"MAXIMIZE_CONVERSION_VALUE\" && bidding.targetRoas !== undefined && refused.includes(\"roas\")) {\n return `Google doesn't take a target ROAS inside Maximize conversion value on ${channel} campaigns${standalone(\"TARGET_ROAS\")}`;\n }\n if (bidding.type === \"MAXIMIZE_CONVERSIONS\" && bidding.targetCpaMicros !== undefined && refused.includes(\"cpa\")) {\n return `Google doesn't take a target CPA inside Maximize conversions on ${channel} campaigns${standalone(\"TARGET_CPA\")}`;\n }\n return undefined;\n}\n\nexport interface BiddingMatrixQuery {\n channelType: string | undefined;\n channelSubType?: string | undefined;\n strategy: string | undefined;\n /** `portfolio` asks about attaching the campaign to a portfolio strategy of this type. */\n portfolio?: boolean;\n}\n\n/**\n * Why Google will not take this bidding on this campaign type, or undefined to let it through.\n * An unread channel, a channel with no row and an absent strategy all let it through.\n */\nexport function biddingMatrixRefusal(query: BiddingMatrixQuery): string | undefined {\n const { channelType, channelSubType, strategy, portfolio = false } = query;\n if (!channelType || !strategy) {\n return undefined;\n }\n const row = rowFor(\n portfolio ? PORTFOLIO_BIDDING_BY_CHANNEL : STANDARD_BIDDING_BY_CHANNEL,\n channelType,\n channelSubType,\n );\n if (!row || row.includes(strategy as GoogleBiddingStrategyType)) {\n return undefined;\n }\n const channel = CHANNEL_LABELS[channelType] ?? channelType;\n if (portfolio && row.length === 0) {\n const own = rowFor(STANDARD_BIDDING_BY_CHANNEL, channelType, channelSubType) ?? [];\n return `Google doesn't let a ${channel} campaign use a portfolio bid strategy. Give it its own bidding instead: ${own.map(labelOf).join(\", \")}.`;\n }\n const kind = portfolio ? \"portfolio strategy\" : \"bidding\";\n return `Google doesn't accept ${labelOf(strategy)} as ${kind} on a ${channel} campaign. It takes: ${row.map(labelOf).join(\", \")}.`;\n}\n","/**\n * The settings a campaign type cannot be created without, and the per-channel settings Google takes\n * only on some campaign types — each with the rule that says where it belongs.\n *\n * Every rule here is what Google ANSWERED to a validateOnly campaign create on v25 against\n * 3865083115 (2026-10-08), not what its docs imply. The account-level half (is the Merchant Center\n * linked, is there a travel link, is Hotel available) needs a live read and lives in the backend's\n * stage-time precheck (`writes/channelLinks.ts`).\n */\nimport { z } from \"zod\";\nimport { NUMERIC_ID_REGEX, RESOURCE_NAME_REGEX } from \"./limits\";\n\n/** Merchant Center ids are int64 in Google's API; carried as digit strings so nothing rounds them. */\nconst int64IdSchema = (what: string) => z.string().regex(NUMERIC_ID_REGEX, `${what} must be the bare numeric id`);\n\n/**\n * Shopping priority — \"Low\" (0), \"Medium\" (1), \"High\" (2). Google requires one on a Shopping create;\n * a create that leaves it out is sent as Low, Google Ads' own default in its interface.\n */\nexport const SHOPPING_CAMPAIGN_PRIORITIES = [0, 1, 2] as const;\nexport const SHOPPING_PRIORITY_LABELS: Readonly<Record<number, string>> = { 0: \"Low\", 1: \"Medium\", 2: \"High\" };\n\n/**\n * `campaign.shopping_setting` on a create. `merchantId` is the Merchant Center account whose products\n * the campaign advertises (it must be linked to this Google Ads account — checked at staging);\n * `feedLabel` narrows it to one feed (a country code or a label set in Merchant Center).\n */\nexport const shoppingSettingSchema = z.strictObject({\n merchantId: int64IdSchema(\"merchantId\"),\n feedLabel: z.string().trim().min(1).max(20).optional(),\n /** Shopping only. Which Shopping campaign wins when several advertise the same product. */\n campaignPriority: z\n .number()\n .int()\n .refine(\n (value) => (SHOPPING_CAMPAIGN_PRIORITIES as readonly number[]).includes(value),\n \"campaignPriority is 0, 1 or 2\",\n )\n .optional(),\n /** Shopping only. Local inventory ads — products in nearby stores. Only `true` is ever sent. */\n enableLocal: z.boolean().optional(),\n});\nexport type ShoppingSetting = z.infer<typeof shoppingSettingSchema>;\n\n/**\n * `shopping_setting` on an existing campaign. The Merchant Center account is fixed at creation; the\n * feed label (`\"\"` clears it), and on Shopping the priority and local inventory, can change.\n */\nexport const shoppingSettingUpdateSchema = z\n .strictObject({\n feedLabel: z.union([z.string().trim().min(1).max(20), z.literal(\"\")]).optional(),\n campaignPriority: shoppingSettingSchema.shape.campaignPriority,\n enableLocal: z.boolean().optional(),\n })\n .refine((p) => Object.values(p).some((v) => v !== undefined), \"shoppingSetting needs a field to change\");\nexport type ShoppingSettingUpdate = z.infer<typeof shoppingSettingUpdateSchema>;\n\nexport const APP_STORES = [\"GOOGLE_APP_STORE\", \"APPLE_APP_STORE\"] as const;\n\n/**\n * What an App campaign optimizes for, and the one bidding strategy Google pairs with each — any other\n * pair is `INCOMPATIBLE_BIDDING_STRATEGY_AND_BIDDING_STRATEGY_GOAL_TYPE`. The in-app and value goals\n * also need the app's conversion actions (`AT_LEAST_ONE_CONVERSION_MUST_BE_SELECTED` without them).\n * Pre-registration is left out: it needs an app open for pre-registration and goal settings Baker\n * does not stage.\n */\nexport const APP_CAMPAIGN_GOALS = {\n OPTIMIZE_INSTALLS_TARGET_INSTALL_COST: { strategy: \"TARGET_CPA\", needsConversions: false },\n OPTIMIZE_INSTALLS_WITHOUT_TARGET_INSTALL_COST: { strategy: \"MAXIMIZE_CONVERSIONS\", needsConversions: false },\n OPTIMIZE_IN_APP_CONVERSIONS_TARGET_INSTALL_COST: { strategy: \"TARGET_CPA\", needsConversions: true },\n OPTIMIZE_IN_APP_CONVERSIONS_TARGET_CONVERSION_COST: { strategy: \"TARGET_CPA\", needsConversions: true },\n OPTIMIZE_RETURN_ON_ADVERTISING_SPEND: { strategy: \"TARGET_ROAS\", needsConversions: true },\n} as const;\nexport type AppCampaignGoal = keyof typeof APP_CAMPAIGN_GOALS;\nconst APP_CAMPAIGN_GOAL_TYPES = Object.keys(APP_CAMPAIGN_GOALS) as [AppCampaignGoal, ...AppCampaignGoal[]];\n\n/** An App campaign's app — fixed at creation — and what it optimizes for. */\nexport const appCampaignSettingSchema = z.strictObject({\n /** Android package name (`com.example.app`) or the App Store's numeric id. */\n appId: z.string().trim().min(1).max(200),\n appStore: z.enum(APP_STORES),\n biddingStrategyGoalType: z.enum(APP_CAMPAIGN_GOAL_TYPES),\n});\nexport type AppCampaignSetting = z.infer<typeof appCampaignSettingSchema>;\n\n/** The app's conversion actions an in-app or value goal optimizes toward. Existing ids only. */\nexport const selectiveOptimizationSchema = z.strictObject({\n conversionActions: z\n .array(\n z.union([z.string().regex(RESOURCE_NAME_REGEX), z.string().regex(NUMERIC_ID_REGEX)], {\n error: \"conversionActions are the app's existing conversion actions — an id or resource name\",\n }),\n )\n .min(1),\n});\nexport type SelectiveOptimization = z.infer<typeof selectiveOptimizationSchema>;\n\n/** App sub-types Google still creates: installs (and their in-app follow-ons) and engagement. */\nconst APP_SUB_TYPES = new Set([\"APP_CAMPAIGN\", \"APP_CAMPAIGN_FOR_ENGAGEMENT\"]);\n\nexport const APP_SETTING_REQUIRED_MESSAGE =\n \"An App campaign (MULTI_CHANNEL) needs appCampaignSetting — appId, appStore (GOOGLE_APP_STORE | APPLE_APP_STORE) and biddingStrategyGoalType — and channelSubType APP_CAMPAIGN (installs) or APP_CAMPAIGN_FOR_ENGAGEMENT.\";\nexport const APP_SETTING_CHANNEL_MESSAGE =\n \"appCampaignSetting and selectiveOptimization belong to an App campaign (MULTI_CHANNEL) only.\";\nexport const APP_CONVERSIONS_REQUIRED_MESSAGE =\n \"This App goal optimizes toward in-app conversions — list the app's conversion actions in selectiveOptimization.conversionActions (Google refuses the campaign without them).\";\nexport const APP_ENGAGEMENT_GOAL_MESSAGE =\n \"An engagement App campaign (APP_CAMPAIGN_FOR_ENGAGEMENT) optimizes toward in-app actions — use an in-app or return-on-ad-spend goal, not an installs goal.\";\n\nfunction appGoalBiddingMessage(goal: AppCampaignGoal): string {\n return `The App goal ${goal} bids with ${APP_CAMPAIGN_GOALS[goal].strategy} only — Google refuses any other strategy with it.`;\n}\n\n/** A Travel campaign's travel account (Things to do). It must be linked to this Google Ads account. */\nexport const travelCampaignSettingsSchema = z.strictObject({ travelAccountId: int64IdSchema(\"travelAccountId\") });\n/** A Hotel campaign's Hotel Center account. The Google Ads account must be linked to Hotel Center. */\nexport const hotelSettingSchema = z.strictObject({ hotelCenterId: int64IdSchema(\"hotelCenterId\") });\n\nexport const TRAVEL_SETTING_REQUIRED_MESSAGE =\n \"A Travel campaign needs travelCampaignSettings.travelAccountId — the travel account linked to this Google Ads account.\";\nexport const HOTEL_SETTING_REQUIRED_MESSAGE =\n \"A Hotel campaign needs hotelSetting.hotelCenterId — the Hotel Center account linked to this Google Ads account.\";\nexport const TRAVEL_HOTEL_CHANNEL_MESSAGE =\n \"travelCampaignSettings belongs to a Travel campaign and hotelSetting to a Hotel campaign only.\";\nexport const TRAVEL_TARGET_ROAS_MESSAGE =\n \"A Travel campaign bids with Maximize conversion value at a target ROAS — set bidding.targetRoas (Google requires it).\";\n\n/**\n * `campaign.dynamic_search_ads_setting` — the site a Search campaign's dynamic ads are built from.\n * The domain is a bare host (no scheme, no path: \"withbaker.com/\" is\n * DYNAMIC_SEARCH_ADS_SETTING_CONTAINS_INVALID_DOMAIN_NAME); the language is Google's lowercase code,\n * with an underscore region where it has one (\"en\", \"zh_CN\" — \"pt-BR\" and \"EN\" were refused).\n */\nexport const dynamicSearchAdsSettingSchema = z.strictObject({\n domainName: z\n .string()\n .trim()\n .regex(\n /^(?!-)[A-Za-z0-9-]+(\\.[A-Za-z0-9-]+)+$/,\n \"domainName is the site's bare domain (withbaker.com) — no https://, no path\",\n ),\n languageCode: z\n .string()\n .regex(\n /^[a-z]{2,3}(_[A-Z]{2})?$/,\n 'languageCode is Google\\'s language code in lowercase (\"en\", \"es\"; \"zh_CN\" with a region)',\n ),\n /** Build ads only from the pages a page feed lists, not the whole site. */\n useSuppliedUrlsOnly: z.boolean().optional(),\n});\nexport type DynamicSearchAdsSetting = z.infer<typeof dynamicSearchAdsSettingSchema>;\n\n/**\n * The DSA setting on an existing Search campaign: each field changes on its own (leaf masks were\n * accepted live). It cannot be removed — masking domain and language empty is FieldError.REQUIRED.\n */\nexport const dynamicSearchAdsSettingUpdateSchema = dynamicSearchAdsSettingSchema\n .partial()\n .refine((p) => Object.values(p).some((v) => v !== undefined), \"dynamicSearchAdsSetting needs a field to change\");\n\nexport const FREQUENCY_CAP_LEVELS = [\"CAMPAIGN\", \"AD_GROUP\", \"AD_GROUP_AD\"] as const;\nexport const FREQUENCY_CAP_EVENTS = [\"IMPRESSION\", \"VIDEO_VIEW\"] as const;\nexport const FREQUENCY_CAP_TIME_UNITS = [\"DAY\", \"WEEK\", \"MONTH\"] as const;\n\n/**\n * `campaign.frequency_caps` — at most `cap` events per person per day, week or month, counted at the\n * campaign, per ad group or per ad. Google takes only a period of one unit (time_length 2 was\n * RangeError.TOO_HIGH) and one cap per level × event × period (a second is DUPLICATE_VALUES). The list\n * REPLACES the campaign's; `[]` on an update removes every cap.\n */\nexport const frequencyCapsSchema = z\n .array(\n z.strictObject({\n level: z.enum(FREQUENCY_CAP_LEVELS),\n eventType: z.enum(FREQUENCY_CAP_EVENTS),\n timeUnit: z.enum(FREQUENCY_CAP_TIME_UNITS),\n cap: z.number().int().min(1),\n }),\n )\n .refine(\n (caps) => new Set(caps.map((c) => `${c.level}/${c.eventType}/${c.timeUnit}`)).size === caps.length,\n \"one cap per level, event and period — Google refuses a second (DUPLICATE_VALUES)\",\n );\nexport type FrequencyCaps = z.infer<typeof frequencyCapsSchema>;\n\nexport const DSA_CHANNEL_MESSAGE = \"dynamicSearchAdsSetting belongs to a Search campaign only.\";\n/**\n * Display and (existing) Video campaigns. Demand Gen refuses caps (OPERATION_NOT_PERMITTED_FOR_CONTEXT);\n * Search, Shopping and Performance Max accept them in a dry run but serve nothing they cap.\n */\nconst FREQUENCY_CAP_CHANNELS = new Set([\"DISPLAY\", \"VIDEO\"]);\nexport const FREQUENCY_CAPS_CHANNEL_MESSAGE =\n \"Frequency caps work on Display (and existing Video) campaigns only — Demand Gen refuses them, and Search, Shopping and Performance Max ads are not frequency-capped.\";\n\n/**\n * What Google may generate or change for a Performance Max campaign — each switch is one of Google's\n * `AssetAutomationType`s (`ASSET_AUTOMATION_TYPES` maps them), true = opted in. A switch left out keeps\n * the campaign's value (Google's default on a new campaign). On Search the text and URL-expansion\n * switches are AI Max's (`aiMax`); Display and Demand Gen take none.\n */\nexport const assetAutomationSchema = z\n .strictObject({\n /** Text Google writes from the landing page and the assets (TEXT_ASSET_AUTOMATION). */\n textAssets: z.boolean().optional(),\n /** Send traffic to the most relevant page of the site (FINAL_URL_EXPANSION_TEXT_ASSET_AUTOMATION). */\n finalUrlExpansion: z.boolean().optional(),\n /** Enhanced versions of the campaign's YouTube videos (GENERATE_ENHANCED_YOUTUBE_VIDEOS). */\n videoEnhancement: z.boolean().optional(),\n /** Enhanced versions of the campaign's images (GENERATE_IMAGE_ENHANCEMENT). */\n imageEnhancement: z.boolean().optional(),\n /** Images taken from the landing page (GENERATE_IMAGE_EXTRACTION). */\n imageExtraction: z.boolean().optional(),\n /** New designs made from the campaign's images (GENERATE_DESIGN_VERSIONS_FOR_IMAGES). */\n imageDesignVersions: z.boolean().optional(),\n })\n .refine((p) => Object.values(p).some((v) => v !== undefined), \"assetAutomation needs at least one switch\");\nexport type AssetAutomation = z.infer<typeof assetAutomationSchema>;\n\n/** Each switch's Google `AssetAutomationType`. */\nexport const ASSET_AUTOMATION_TYPES: Readonly<Record<keyof AssetAutomation, string>> = {\n textAssets: \"TEXT_ASSET_AUTOMATION\",\n finalUrlExpansion: \"FINAL_URL_EXPANSION_TEXT_ASSET_AUTOMATION\",\n videoEnhancement: \"GENERATE_ENHANCED_YOUTUBE_VIDEOS\",\n imageEnhancement: \"GENERATE_IMAGE_ENHANCEMENT\",\n imageExtraction: \"GENERATE_IMAGE_EXTRACTION\",\n imageDesignVersions: \"GENERATE_DESIGN_VERSIONS_FOR_IMAGES\",\n};\n\nexport const ASSET_AUTOMATION_CHANNEL_MESSAGE =\n \"assetAutomation switches what Google generates for a Performance Max campaign only — on Search use AI Max (`aiMax`: text customization, final URL expansion); Display and Demand Gen take none.\";\nexport const TEXT_ASSETS_NEED_URL_EXPANSION_OFF_MESSAGE =\n \"Google refuses turning generated text off while final URL expansion is on — set finalUrlExpansion: false (`--url-expansion=false`) in the same change.\";\n\n/**\n * Why this asset automation state is one Google refuses, given the switches it ends up with.\n * `finalUrlExpansion` undefined means unknown/default-on: text off then needs an explicit URL expansion off.\n */\nexport function assetAutomationStateIssue(state: AssetAutomation): string | undefined {\n return state.textAssets === false && state.finalUrlExpansion !== false\n ? TEXT_ASSETS_NEED_URL_EXPANSION_OFF_MESSAGE\n : undefined;\n}\n\nconst hexColorSchema = z.string().regex(/^#[0-9A-Fa-f]{6}$/, \"colors are #RRGGBB hex codes\");\n\n/** Brand colors and font, the parts of a campaign's brand guidelines it can carry. Both colors or neither. */\nconst brandStyleShape = {\n mainColor: hexColorSchema.optional(),\n accentColor: hexColorSchema.optional(),\n /** One of Google's predefined fonts, e.g. \"Roboto\". */\n fontFamily: z.string().trim().min(1).max(50).optional(),\n};\n\nexport const BRAND_COLORS_PAIR_MESSAGE =\n \"Google needs both brand colors together — set mainColor and accentColor, or neither.\";\nexport const BRAND_GUIDELINES_OFF_MESSAGE =\n \"Brand colors and font only apply with brand guidelines on — set enabled: true, or leave them out.\";\nexport const BRAND_GUIDELINES_CHANNEL_MESSAGE = \"Brand guidelines belong to Performance Max campaigns only.\";\n\nfunction colorsPaired(p: { mainColor?: string; accentColor?: string }): boolean {\n return (p.mainColor === undefined) === (p.accentColor === undefined);\n}\n\n/**\n * Brand guidelines on a new Performance Max campaign: Google keeps the business name and logo as\n * campaign assets (it refuses the create without a BUSINESS_NAME and a LOGO campaign link in the same\n * publish — `REQUIRED_BUSINESS_NAME_ASSET_NOT_LINKED`) and uses the colors and font for what it\n * generates. Off by default (Baker opts every new PMax campaign out unless this turns it on).\n */\nexport const brandGuidelinesCreateSchema = z\n .strictObject({ enabled: z.boolean(), ...brandStyleShape })\n .superRefine((p, ctx) => {\n if (!colorsPaired(p)) {\n ctx.addIssue({ code: \"custom\", message: BRAND_COLORS_PAIR_MESSAGE });\n }\n if (!p.enabled && (p.mainColor !== undefined || p.fontFamily !== undefined)) {\n ctx.addIssue({ code: \"custom\", message: BRAND_GUIDELINES_OFF_MESSAGE });\n }\n });\nexport type BrandGuidelinesCreate = z.infer<typeof brandGuidelinesCreateSchema>;\n\n/**\n * Colors and font on a campaign that already has brand guidelines on. Each changes on its own — a\n * single color was accepted live (the campaign keeps the other); the font must be a Google Font\n * supported for brand guidelines (BRAND_GUIDELINES_UNSUPPORTED_FONT_FAMILY otherwise).\n */\nexport const brandGuidelinesUpdateSchema = z\n .strictObject(brandStyleShape)\n .refine((p) => Object.values(p).some((v) => v !== undefined), \"brandGuidelines needs a color or a font\");\nexport type BrandGuidelinesUpdate = z.infer<typeof brandGuidelinesUpdateSchema>;\n\nconst existingAssetSchema = z.union([z.string().regex(RESOURCE_NAME_REGEX), z.string().regex(NUMERIC_ID_REGEX)], {\n error: \"brand assets are assets already in the account — an id or resource name\",\n});\n\nexport const ENABLE_BRAND_ASSETS_MESSAGE =\n \"Name the business name asset and at least one square logo asset (businessNameAsset, logoAssets), or set autoPopulateBrandAssets: true to let Google take them from the campaign's asset groups.\";\n\n/**\n * `CampaignService.EnablePMaxBrandGuidelines` for one existing Performance Max campaign — the only\n * way to turn brand guidelines on after creation (`brand_guidelines_enabled` is IMMUTABLE_FIELD on\n * update). Google either takes the business name and logos from the campaign's asset groups\n * (auto-populate) or links the ones named here as campaign assets.\n */\nexport const campaignEnableBrandGuidelinesSchema = z\n .strictObject({\n autoPopulateBrandAssets: z.boolean().optional(),\n businessNameAsset: existingAssetSchema.optional(),\n logoAssets: z.array(existingAssetSchema).min(1).max(5).optional(),\n landscapeLogoAssets: z.array(existingAssetSchema).max(5).optional(),\n /** The site's domain (withbaker.com) — required by Google with explicit assets. */\n finalUriDomain: z.string().trim().min(1).optional(),\n ...brandStyleShape,\n })\n .superRefine((p, ctx) => {\n if (p.autoPopulateBrandAssets !== true && (!p.businessNameAsset || !p.logoAssets)) {\n ctx.addIssue({ code: \"custom\", message: ENABLE_BRAND_ASSETS_MESSAGE });\n }\n if (!colorsPaired(p)) {\n ctx.addIssue({ code: \"custom\", message: BRAND_COLORS_PAIR_MESSAGE });\n }\n });\nexport type CampaignEnableBrandGuidelines = z.infer<typeof campaignEnableBrandGuidelinesSchema>;\n\nexport const TEXT_GUIDELINES_CREATE_CHANNEL_MESSAGE =\n \"Text guidelines apply where Google writes the ad text: Performance Max, and Search with AI Max and its text customization on. This campaign type doesn't take them.\";\nexport const TEXT_GUIDELINES_CREATE_AI_MAX_MESSAGE =\n \"Text guidelines on a Search campaign need AI Max with text customization on — add aiMax {enabled: true, textCustomization: true} (`--ai-max --ai-max-text`) to the same create, or leave the guidelines out.\";\n\nexport const SHOPPING_SETTING_REQUIRED_MESSAGE =\n \"A Shopping campaign needs shoppingSetting.merchantId — the Merchant Center account whose products it advertises. Read the linked ones with `baker ads google merchant-center list`.\";\nexport const SHOPPING_SETTING_CHANNEL_MESSAGE =\n \"shoppingSetting belongs to a Shopping or Performance Max campaign only.\";\nexport const PMAX_SHOPPING_ONLY_FIELDS_MESSAGE =\n \"On Performance Max, shoppingSetting takes only merchantId and feedLabel — campaignPriority and enableLocal are Shopping-campaign settings.\";\n\n/** One issue a campaign create carries against its channel, located for zod. */\nexport interface ChannelIssue {\n path: string[];\n message: string;\n}\n\n/** The parts of a campaign create the channel rules read. */\nexport interface ChannelSettingsCreate {\n channelType: string;\n channelSubType?: string;\n bidding?: { type: string; targetRoas?: number };\n shoppingSetting?: ShoppingSetting;\n appCampaignSetting?: AppCampaignSetting;\n selectiveOptimization?: SelectiveOptimization;\n travelCampaignSettings?: { travelAccountId: string };\n hotelSetting?: { hotelCenterId: string };\n dynamicSearchAdsSetting?: DynamicSearchAdsSetting;\n frequencyCaps?: FrequencyCaps;\n textGuidelines?: unknown;\n aiMax?: { enabled?: boolean; textCustomization?: boolean };\n assetAutomation?: AssetAutomation;\n brandGuidelines?: unknown;\n}\n\n/**\n * Text guidelines on a new campaign: Performance Max, or Search with AI Max and text customization on\n * in the same create (the rule an update is held to against the live campaign). Display and Demand\n * Gen were OPERATION_NOT_PERMITTED_FOR_CONTEXT.\n */\nfunction textGuidelinesCreateIssue(p: ChannelSettingsCreate): string | undefined {\n if (p.textGuidelines === undefined || p.channelType === \"PERFORMANCE_MAX\") {\n return undefined;\n }\n if (p.channelType !== \"SEARCH\") {\n return TEXT_GUIDELINES_CREATE_CHANNEL_MESSAGE;\n }\n return p.aiMax?.enabled === true && p.aiMax.textCustomization === true\n ? undefined\n : TEXT_GUIDELINES_CREATE_AI_MAX_MESSAGE;\n}\n\n/** Settings that only one family of campaign types serves — on create and (with the live channel) update. */\nfunction servingSettingIssues(\n channelType: string,\n p: {\n dynamicSearchAdsSetting?: unknown;\n frequencyCaps?: unknown;\n assetAutomation?: unknown;\n brandGuidelines?: unknown;\n },\n): ChannelIssue[] {\n const issues: ChannelIssue[] = [];\n if (p.brandGuidelines !== undefined && channelType !== \"PERFORMANCE_MAX\") {\n issues.push({ path: [\"brandGuidelines\"], message: BRAND_GUIDELINES_CHANNEL_MESSAGE });\n }\n if (p.assetAutomation !== undefined && channelType !== \"PERFORMANCE_MAX\") {\n issues.push({ path: [\"assetAutomation\"], message: ASSET_AUTOMATION_CHANNEL_MESSAGE });\n }\n if (p.dynamicSearchAdsSetting !== undefined && channelType !== \"SEARCH\") {\n issues.push({ path: [\"dynamicSearchAdsSetting\"], message: DSA_CHANNEL_MESSAGE });\n }\n if (p.frequencyCaps !== undefined && !FREQUENCY_CAP_CHANNELS.has(channelType)) {\n issues.push({ path: [\"frequencyCaps\"], message: FREQUENCY_CAPS_CHANNEL_MESSAGE });\n }\n return issues;\n}\n\nfunction travelHotelCreateIssues(\n p: ChannelSettingsCreate & { bidding?: { type: string; targetRoas?: number } },\n): ChannelIssue[] {\n const issues: ChannelIssue[] = [];\n if (p.channelType === \"TRAVEL\" && !p.travelCampaignSettings) {\n issues.push({ path: [\"travelCampaignSettings\"], message: TRAVEL_SETTING_REQUIRED_MESSAGE });\n }\n if (\n p.channelType === \"TRAVEL\" &&\n p.bidding?.type === \"MAXIMIZE_CONVERSION_VALUE\" &&\n p.bidding.targetRoas === undefined\n ) {\n issues.push({ path: [\"bidding\", \"targetRoas\"], message: TRAVEL_TARGET_ROAS_MESSAGE });\n }\n if (p.channelType === \"HOTEL\" && !p.hotelSetting) {\n issues.push({ path: [\"hotelSetting\"], message: HOTEL_SETTING_REQUIRED_MESSAGE });\n }\n if ((p.travelCampaignSettings && p.channelType !== \"TRAVEL\") || (p.hotelSetting && p.channelType !== \"HOTEL\")) {\n issues.push({\n path: [p.hotelSetting ? \"hotelSetting\" : \"travelCampaignSettings\"],\n message: TRAVEL_HOTEL_CHANNEL_MESSAGE,\n });\n }\n return issues;\n}\n\nfunction appCreateIssues(p: ChannelSettingsCreate): ChannelIssue[] {\n if (p.channelType !== \"MULTI_CHANNEL\") {\n return p.appCampaignSetting || p.selectiveOptimization\n ? [{ path: [\"appCampaignSetting\"], message: APP_SETTING_CHANNEL_MESSAGE }]\n : [];\n }\n const setting = p.appCampaignSetting;\n if (!setting || !p.channelSubType || !APP_SUB_TYPES.has(p.channelSubType)) {\n return [{ path: [\"appCampaignSetting\"], message: APP_SETTING_REQUIRED_MESSAGE }];\n }\n const goal = APP_CAMPAIGN_GOALS[setting.biddingStrategyGoalType];\n const issues: ChannelIssue[] = [];\n if (p.bidding && p.bidding.type !== goal.strategy) {\n issues.push({ path: [\"bidding\"], message: appGoalBiddingMessage(setting.biddingStrategyGoalType) });\n }\n if (goal.needsConversions && !p.selectiveOptimization) {\n issues.push({ path: [\"selectiveOptimization\"], message: APP_CONVERSIONS_REQUIRED_MESSAGE });\n }\n if (p.channelSubType === \"APP_CAMPAIGN_FOR_ENGAGEMENT\" && !goal.needsConversions) {\n issues.push({ path: [\"appCampaignSetting\", \"biddingStrategyGoalType\"], message: APP_ENGAGEMENT_GOAL_MESSAGE });\n }\n return issues;\n}\n\nfunction shoppingChannelIssue(\n channelType: string,\n setting: { campaignPriority?: number; enableLocal?: boolean } | undefined,\n): string | undefined {\n if (!setting) {\n return undefined;\n }\n if (channelType !== \"SHOPPING\" && channelType !== \"PERFORMANCE_MAX\") {\n return SHOPPING_SETTING_CHANNEL_MESSAGE;\n }\n return channelType === \"PERFORMANCE_MAX\" &&\n (setting.campaignPriority !== undefined || setting.enableLocal !== undefined)\n ? PMAX_SHOPPING_ONLY_FIELDS_MESSAGE\n : undefined;\n}\n\n/** What a campaign create states that its channel refuses, or needs and leaves out. */\nexport function channelSettingsCreateIssues(p: ChannelSettingsCreate): ChannelIssue[] {\n const issues: ChannelIssue[] = [];\n if (p.channelType === \"SHOPPING\" && !p.shoppingSetting) {\n issues.push({ path: [\"shoppingSetting\"], message: SHOPPING_SETTING_REQUIRED_MESSAGE });\n }\n const shopping = shoppingChannelIssue(p.channelType, p.shoppingSetting);\n if (shopping) {\n issues.push({ path: [\"shoppingSetting\"], message: shopping });\n }\n issues.push(...appCreateIssues(p), ...travelHotelCreateIssues(p), ...servingSettingIssues(p.channelType, p));\n const guidelines = textGuidelinesCreateIssue(p);\n if (guidelines) {\n issues.push({ path: [\"textGuidelines\"], message: guidelines });\n }\n const automation = p.assetAutomation && assetAutomationStateIssue(p.assetAutomation);\n if (automation) {\n issues.push({ path: [\"assetAutomation\"], message: automation });\n }\n return issues;\n}\n\n/** The parts of a campaign update the channel rules read. */\nexport interface ChannelSettingsUpdate {\n shoppingSetting?: ShoppingSettingUpdate;\n dynamicSearchAdsSetting?: Partial<DynamicSearchAdsSetting>;\n frequencyCaps?: FrequencyCaps;\n assetAutomation?: AssetAutomation;\n brandGuidelines?: BrandGuidelinesUpdate;\n}\n\n/**\n * Why the live campaign's type refuses this update's channel settings, or undefined to stage it.\n * An unread channel refuses nothing — publish's humanized error is the backstop.\n */\nexport function channelSettingsUpdateRefusal(\n channelType: string | undefined,\n p: ChannelSettingsUpdate,\n): string | undefined {\n if (!channelType) {\n return undefined;\n }\n return shoppingChannelIssue(channelType, p.shoppingSetting) ?? servingSettingIssues(channelType, p)[0]?.message;\n}\n","/**\n * Google's country geo-target constants and language constants, id → display name.\n *\n * These ids are global and stable across accounts, so a staged location or language\n * criterion reads \"Poland\" / \"Polish\" on the review card without a live lookup. Both\n * lists are complete as published by Google — a partial list is what previously made\n * most of a multi-market campaign's targeting render as \"Location 2616\".\n *\n * Generated — refresh with `pnpm --filter @baker/api geo-constants`:\n * - countries: https://developers.google.com/google-ads/api/data/geotargets (246 active top-level targets)\n * - languages: https://developers.google.com/google-ads/api/data/codes-formats#languages (51 languages)\n *\n * \"Country\" here means every target Google lists with no parent — 219 typed Country plus the 27 it\n * types Region (Taiwan, Hong Kong, Puerto Rico, Kosovo, …), which are ordinary targeting choices.\n *\n * Sub-country targets (regions, cities, postal codes) number in the hundreds of thousands\n * and are resolved live at stage time instead — see `withConstantName` in stage.ts.\n */\n\nexport const GEO_TARGET_COUNTRIES: Record<string, string> = {\n \"2004\": \"Afghanistan\",\n \"2008\": \"Albania\",\n \"2010\": \"Antarctica\",\n \"2012\": \"Algeria\",\n \"2016\": \"American Samoa\",\n \"2020\": \"Andorra\",\n \"2024\": \"Angola\",\n \"2028\": \"Antigua and Barbuda\",\n \"2031\": \"Azerbaijan\",\n \"2032\": \"Argentina\",\n \"2036\": \"Australia\",\n \"2040\": \"Austria\",\n \"2044\": \"The Bahamas\",\n \"2048\": \"Bahrain\",\n \"2050\": \"Bangladesh\",\n \"2051\": \"Armenia\",\n \"2052\": \"Barbados\",\n \"2056\": \"Belgium\",\n \"2060\": \"Bermuda\",\n \"2064\": \"Bhutan\",\n \"2068\": \"Bolivia\",\n \"2070\": \"Bosnia and Herzegovina\",\n \"2072\": \"Botswana\",\n \"2074\": \"Bouvet Island\",\n \"2076\": \"Brazil\",\n \"2084\": \"Belize\",\n \"2086\": \"British Indian Ocean Territory\",\n \"2090\": \"Solomon Islands\",\n \"2092\": \"British Virgin Islands\",\n \"2096\": \"Brunei\",\n \"2100\": \"Bulgaria\",\n \"2104\": \"Myanmar (Burma)\",\n \"2108\": \"Burundi\",\n \"2112\": \"Belarus\",\n \"2116\": \"Cambodia\",\n \"2120\": \"Cameroon\",\n \"2124\": \"Canada\",\n \"2132\": \"Cabo Verde\",\n \"2136\": \"Cayman Islands\",\n \"2140\": \"Central African Republic\",\n \"2144\": \"Sri Lanka\",\n \"2148\": \"Chad\",\n \"2152\": \"Chile\",\n \"2156\": \"China\",\n \"2158\": \"Taiwan\",\n \"2162\": \"Christmas Island\",\n \"2166\": \"Cocos (Keeling) Islands\",\n \"2170\": \"Colombia\",\n \"2174\": \"Comoros\",\n \"2175\": \"Mayotte\",\n \"2178\": \"Republic of the Congo\",\n \"2180\": \"Democratic Republic of the Congo\",\n \"2184\": \"Cook Islands\",\n \"2188\": \"Costa Rica\",\n \"2191\": \"Croatia\",\n \"2196\": \"Cyprus\",\n \"2203\": \"Czechia\",\n \"2204\": \"Benin\",\n \"2208\": \"Denmark\",\n \"2212\": \"Dominica\",\n \"2214\": \"Dominican Republic\",\n \"2218\": \"Ecuador\",\n \"2222\": \"El Salvador\",\n \"2226\": \"Equatorial Guinea\",\n \"2231\": \"Ethiopia\",\n \"2232\": \"Eritrea\",\n \"2233\": \"Estonia\",\n \"2234\": \"Faroe Islands\",\n \"2238\": \"Falkland Islands (Islas Malvinas)\",\n \"2239\": \"South Georgia and the South Sandwich Islands\",\n \"2242\": \"Fiji\",\n \"2246\": \"Finland\",\n \"2250\": \"France\",\n \"2254\": \"French Guiana\",\n \"2258\": \"French Polynesia\",\n \"2260\": \"French Southern and Antarctic Lands\",\n \"2262\": \"Djibouti\",\n \"2266\": \"Gabon\",\n \"2268\": \"Georgia\",\n \"2270\": \"The Gambia\",\n \"2275\": \"Palestine\",\n \"2276\": \"Germany\",\n \"2288\": \"Ghana\",\n \"2292\": \"Gibraltar\",\n \"2296\": \"Kiribati\",\n \"2300\": \"Greece\",\n \"2304\": \"Greenland\",\n \"2308\": \"Grenada\",\n \"2312\": \"Guadeloupe\",\n \"2316\": \"Guam\",\n \"2320\": \"Guatemala\",\n \"2324\": \"Guinea\",\n \"2328\": \"Guyana\",\n \"2332\": \"Haiti\",\n \"2334\": \"Heard Island and McDonald Islands\",\n \"2336\": \"Vatican City\",\n \"2340\": \"Honduras\",\n \"2344\": \"Hong Kong\",\n \"2348\": \"Hungary\",\n \"2352\": \"Iceland\",\n \"2356\": \"India\",\n \"2360\": \"Indonesia\",\n \"2368\": \"Iraq\",\n \"2372\": \"Ireland\",\n \"2376\": \"Israel\",\n \"2380\": \"Italy\",\n \"2384\": \"Cote d'Ivoire\",\n \"2388\": \"Jamaica\",\n \"2392\": \"Japan\",\n \"2398\": \"Kazakhstan\",\n \"2400\": \"Jordan\",\n \"2404\": \"Kenya\",\n \"2410\": \"South Korea\",\n \"2414\": \"Kuwait\",\n \"2417\": \"Kyrgyzstan\",\n \"2418\": \"Laos\",\n \"2422\": \"Lebanon\",\n \"2426\": \"Lesotho\",\n \"2428\": \"Latvia\",\n \"2430\": \"Liberia\",\n \"2434\": \"Libya\",\n \"2438\": \"Liechtenstein\",\n \"2440\": \"Lithuania\",\n \"2442\": \"Luxembourg\",\n \"2446\": \"Macao\",\n \"2450\": \"Madagascar\",\n \"2454\": \"Malawi\",\n \"2458\": \"Malaysia\",\n \"2462\": \"Maldives\",\n \"2466\": \"Mali\",\n \"2470\": \"Malta\",\n \"2474\": \"Martinique\",\n \"2478\": \"Mauritania\",\n \"2480\": \"Mauritius\",\n \"2484\": \"Mexico\",\n \"2492\": \"Monaco\",\n \"2496\": \"Mongolia\",\n \"2498\": \"Moldova\",\n \"2499\": \"Montenegro\",\n \"2500\": \"Montserrat\",\n \"2504\": \"Morocco\",\n \"2508\": \"Mozambique\",\n \"2512\": \"Oman\",\n \"2516\": \"Namibia\",\n \"2520\": \"Nauru\",\n \"2524\": \"Nepal\",\n \"2528\": \"Netherlands\",\n \"2531\": \"Curacao\",\n \"2533\": \"Aruba\",\n \"2534\": \"Sint Maarten\",\n \"2535\": \"Caribbean Netherlands\",\n \"2540\": \"New Caledonia\",\n \"2548\": \"Vanuatu\",\n \"2554\": \"New Zealand\",\n \"2558\": \"Nicaragua\",\n \"2562\": \"Niger\",\n \"2566\": \"Nigeria\",\n \"2570\": \"Niue\",\n \"2574\": \"Norfolk Island\",\n \"2578\": \"Norway\",\n \"2580\": \"Northern Mariana Islands\",\n \"2581\": \"United States Minor Outlying Islands\",\n \"2583\": \"Micronesia\",\n \"2584\": \"Marshall Islands\",\n \"2585\": \"Palau\",\n \"2586\": \"Pakistan\",\n \"2591\": \"Panama\",\n \"2598\": \"Papua New Guinea\",\n \"2600\": \"Paraguay\",\n \"2604\": \"Peru\",\n \"2608\": \"Philippines\",\n \"2612\": \"Pitcairn Islands\",\n \"2616\": \"Poland\",\n \"2620\": \"Portugal\",\n \"2624\": \"Guinea-Bissau\",\n \"2626\": \"Timor-Leste\",\n \"2630\": \"Puerto Rico\",\n \"2634\": \"Qatar\",\n \"2638\": \"Reunion\",\n \"2642\": \"Romania\",\n \"2643\": \"Russia\",\n \"2646\": \"Rwanda\",\n \"2652\": \"Saint Barthelemy\",\n \"2654\": \"Saint Helena, Ascension and Tristan da Cunha\",\n \"2659\": \"Saint Kitts and Nevis\",\n \"2660\": \"Anguilla\",\n \"2662\": \"Saint Lucia\",\n \"2663\": \"Saint Martin\",\n \"2666\": \"Saint Pierre and Miquelon\",\n \"2670\": \"Saint Vincent and the Grenadines\",\n \"2674\": \"San Marino\",\n \"2678\": \"Sao Tome and Principe\",\n \"2682\": \"Saudi Arabia\",\n \"2686\": \"Senegal\",\n \"2688\": \"Serbia\",\n \"2690\": \"Seychelles\",\n \"2694\": \"Sierra Leone\",\n \"2702\": \"Singapore\",\n \"2703\": \"Slovakia\",\n \"2704\": \"Vietnam\",\n \"2705\": \"Slovenia\",\n \"2706\": \"Somalia\",\n \"2710\": \"South Africa\",\n \"2716\": \"Zimbabwe\",\n \"2724\": \"Spain\",\n \"2728\": \"South Sudan\",\n \"2732\": \"Western Sahara\",\n \"2736\": \"Sudan\",\n \"2740\": \"Suriname\",\n \"2744\": \"Svalbard and Jan Mayen\",\n \"2748\": \"Eswatini\",\n \"2752\": \"Sweden\",\n \"2756\": \"Switzerland\",\n \"2760\": \"Syria\",\n \"2762\": \"Tajikistan\",\n \"2764\": \"Thailand\",\n \"2768\": \"Togo\",\n \"2772\": \"Tokelau\",\n \"2776\": \"Tonga\",\n \"2780\": \"Trinidad and Tobago\",\n \"2784\": \"United Arab Emirates\",\n \"2788\": \"Tunisia\",\n \"2792\": \"Turkiye\",\n \"2795\": \"Turkmenistan\",\n \"2796\": \"Turks and Caicos Islands\",\n \"2798\": \"Tuvalu\",\n \"2800\": \"Uganda\",\n \"2804\": \"Ukraine\",\n \"2807\": \"North Macedonia\",\n \"2818\": \"Egypt\",\n \"2826\": \"United Kingdom\",\n \"2831\": \"Guernsey\",\n \"2832\": \"Jersey\",\n \"2833\": \"Isle of Man\",\n \"2834\": \"Tanzania\",\n \"2840\": \"United States\",\n \"2850\": \"U.S. Virgin Islands\",\n \"2854\": \"Burkina Faso\",\n \"2858\": \"Uruguay\",\n \"2860\": \"Uzbekistan\",\n \"2862\": \"Venezuela\",\n \"2876\": \"Wallis and Futuna\",\n \"2882\": \"Samoa\",\n \"2887\": \"Yemen\",\n \"2894\": \"Zambia\",\n \"2900\": \"Kosovo\",\n};\n\nexport const LANGUAGE_CONSTANTS: Record<string, string> = {\n \"1000\": \"English\",\n \"1001\": \"German\",\n \"1002\": \"French\",\n \"1003\": \"Spanish\",\n \"1004\": \"Italian\",\n \"1005\": \"Japanese\",\n \"1009\": \"Danish\",\n \"1010\": \"Dutch\",\n \"1011\": \"Finnish\",\n \"1012\": \"Korean\",\n \"1013\": \"Norwegian\",\n \"1014\": \"Portuguese\",\n \"1015\": \"Swedish\",\n \"1017\": \"Chinese (simplified)\",\n \"1018\": \"Chinese (traditional)\",\n \"1019\": \"Arabic\",\n \"1020\": \"Bulgarian\",\n \"1021\": \"Czech\",\n \"1022\": \"Greek\",\n \"1023\": \"Hindi\",\n \"1024\": \"Hungarian\",\n \"1025\": \"Indonesian\",\n \"1026\": \"Icelandic\",\n \"1027\": \"Hebrew\",\n \"1028\": \"Latvian\",\n \"1029\": \"Lithuanian\",\n \"1030\": \"Polish\",\n \"1031\": \"Russian\",\n \"1032\": \"Romanian\",\n \"1033\": \"Slovak\",\n \"1034\": \"Slovenian\",\n \"1035\": \"Serbian\",\n \"1036\": \"Ukrainian\",\n \"1037\": \"Turkish\",\n \"1038\": \"Catalan\",\n \"1039\": \"Croatian\",\n \"1040\": \"Vietnamese\",\n \"1041\": \"Urdu\",\n \"1042\": \"Filipino\",\n \"1043\": \"Estonian\",\n \"1044\": \"Thai\",\n \"1056\": \"Bengali\",\n \"1064\": \"Persian\",\n \"1072\": \"Gujarati\",\n \"1086\": \"Kannada\",\n \"1098\": \"Malayalam\",\n \"1101\": \"Marathi\",\n \"1102\": \"Malay\",\n \"1110\": \"Punjabi\",\n \"1130\": \"Tamil\",\n \"1131\": \"Telugu\",\n};\n","import { IOptions } from './options';\n\n/**\n * Check if `vhost` is a valid suffix of `hostname` (top-domain)\n *\n * It means that `vhost` needs to be a suffix of `hostname` and we then need to\n * make sure that: either they are equal, or the character preceding `vhost` in\n * `hostname` is a '.' (it should not be a partial label).\n *\n * * hostname = 'not.evil.com' and vhost = 'vil.com' => not ok\n * * hostname = 'not.evil.com' and vhost = 'evil.com' => ok\n * * hostname = 'not.evil.com' and vhost = 'not.evil.com' => ok\n */\nfunction shareSameDomainSuffix(hostname: string, vhost: string): boolean {\n if (hostname.endsWith(vhost)) {\n return (\n hostname.length === vhost.length ||\n hostname[hostname.length - vhost.length - 1] === '.'\n );\n }\n\n return false;\n}\n\n/**\n * Given a hostname and its public suffix, extract the general domain.\n */\nfunction extractDomainWithSuffix(\n hostname: string,\n publicSuffix: string,\n): string {\n // Locate the index of the last '.' in the part of the `hostname` preceding\n // the public suffix.\n //\n // examples:\n // 1. not.evil.co.uk => evil.co.uk\n // ^ ^\n // | | start of public suffix\n // | index of the last dot\n //\n // 2. example.co.uk => example.co.uk\n // ^ ^\n // | | start of public suffix\n // |\n // | (-1) no dot found before the public suffix\n const publicSuffixIndex = hostname.length - publicSuffix.length - 2;\n const lastDotBeforeSuffixIndex = hostname.lastIndexOf('.', publicSuffixIndex);\n\n // No '.' found, then `hostname` is the general domain (no sub-domain)\n if (lastDotBeforeSuffixIndex === -1) {\n return hostname;\n }\n\n // Extract the part between the last '.'\n return hostname.slice(lastDotBeforeSuffixIndex + 1);\n}\n\n/**\n * Detects the domain based on rules and upon and a host string\n */\nexport default function getDomain(\n suffix: string,\n hostname: string,\n options: IOptions,\n): string | null {\n // Check if `hostname` ends with a member of `validHosts`.\n if (options.validHosts !== null) {\n const validHosts = options.validHosts;\n for (const vhost of validHosts) {\n if (/*@__INLINE__*/ shareSameDomainSuffix(hostname, vhost)) {\n return vhost;\n }\n }\n }\n\n let numberOfLeadingDots = 0;\n if (hostname.startsWith('.')) {\n while (\n numberOfLeadingDots < hostname.length &&\n hostname[numberOfLeadingDots] === '.'\n ) {\n numberOfLeadingDots += 1;\n }\n }\n\n // If `hostname` is a valid public suffix, then there is no domain to return.\n // Since we already know that `getPublicSuffix` returns a suffix of `hostname`\n // there is no need to perform a string comparison and we only compare the\n // size.\n if (suffix.length === hostname.length - numberOfLeadingDots) {\n return null;\n }\n\n // To extract the general domain, we start by identifying the public suffix\n // (if any), then consider the domain to be the public suffix with one added\n // level of depth. (e.g.: if hostname is `not.evil.co.uk` and public suffix:\n // `co.uk`, then we take one more level: `evil`, giving the final result:\n // `evil.co.uk`).\n return /*@__INLINE__*/ extractDomainWithSuffix(hostname, suffix);\n}\n","/**\n * Return the part of domain without suffix.\n *\n * Example: for domain 'foo.com', the result would be 'foo'.\n */\nexport default function getDomainWithoutSuffix(\n domain: string,\n suffix: string,\n): string {\n // Note: here `domain` and `suffix` cannot have the same length because in\n // this case we set `domain` to `null` instead. It is thus safe to assume\n // that `suffix` is shorter than `domain`.\n return domain.slice(0, -suffix.length - 1);\n}\n","/**\n * Matches an ASCII tab (U+0009) or newline (U+000A / U+000D). The WHATWG URL\n * parser strips these before parsing; we only allocate a cleaned copy (and\n * re-parse) on the rare input that actually contains one.\n */\nconst CONTROL_CHARS = /[\\t\\n\\r]/g;\n\n// Set by `extractHostname` (a module-scope flag, read synchronously by\n// `parseImpl` right after the call — same pattern as the reused RESULT object).\n// `true` ONLY when extraction validated the returned host inline (a confirmed-\n// valid, \"simple\" authority) so `parseImpl` can skip the separate\n// `isValidHostname` pass. `false` in every other case (validation disabled, a\n// complex authority — userinfo/port/brackets/trailing-dot/control — an invalid\n// host, or a non-main return path); `parseImpl` then validates as usual. The\n// fast path can only ever SKIP a redundant scan for hosts already known valid,\n// never accept an invalid one.\nexport let extractedHostnameValidated = false;\n\n/**\n * True if char `code` is a valid hostname character. This is the per-char half\n * of `is-valid.ts`'s `isValidAscii` (a-z, 0-9, > U+007F) PLUS three additions:\n * A-Z (the host is lowercased before validation, so uppercase ≡ a valid\n * lowercase letter) and '-' / '_' (valid inside a label). KEEP IN SYNC with\n * `is-valid.ts`: these rules are deliberately duplicated to validate during\n * extraction, so any change to the accepted character set there must be\n * mirrored here (and vice-versa).\n */\nfunction isValidHostnameChar(code: number): boolean {\n return (\n (code >= 97 && code <= 122) || // a-z\n (code >= 48 && code <= 57) || // 0-9\n code > 127 || // non-ASCII (accepted, not punycode-checked)\n (code >= 65 && code <= 90) || // A-Z (becomes valid once lowercased)\n code === 45 || // '-'\n code === 95 // '_'\n );\n}\n\n/**\n * Classify scheme `url.slice(schemeStart, colonIndex)` as a WHATWG special\n * scheme without allocating a substring (case-insensitive via `| 32`).\n * Special schemes: ftp, file, http, https, ws, wss\n * (https://url.spec.whatwg.org/#special-scheme).\n *\n * @returns 0 = not special, 1 = special, 2 = file (its host sits only between\n * \"//\" and the next slash).\n */\nfunction getSpecialScheme(\n url: string,\n schemeStart: number,\n colonIndex: number,\n): number {\n const length = colonIndex - schemeStart;\n const c0 = url.charCodeAt(schemeStart) | 32;\n if (length === 2) {\n return c0 === 119 && (url.charCodeAt(schemeStart + 1) | 32) === 115 ? 1 : 0; // ws\n } else if (length === 3) {\n const c1 = url.charCodeAt(schemeStart + 1) | 32;\n const c2 = url.charCodeAt(schemeStart + 2) | 32;\n if (c0 === 119 && c1 === 115 && c2 === 115) return 1; // wss\n if (c0 === 102 && c1 === 116 && c2 === 112) return 1; // ftp\n return 0;\n } else if (length === 4) {\n const c1 = url.charCodeAt(schemeStart + 1) | 32;\n const c2 = url.charCodeAt(schemeStart + 2) | 32;\n const c3 = url.charCodeAt(schemeStart + 3) | 32;\n if (c0 === 104 && c1 === 116 && c2 === 116 && c3 === 112) return 1; // http\n if (c0 === 102 && c1 === 105 && c2 === 108 && c3 === 101) return 2; // file\n return 0;\n } else if (length === 5) {\n return c0 === 104 &&\n (url.charCodeAt(schemeStart + 1) | 32) === 116 &&\n (url.charCodeAt(schemeStart + 2) | 32) === 116 &&\n (url.charCodeAt(schemeStart + 3) | 32) === 112 &&\n (url.charCodeAt(schemeStart + 4) | 32) === 115\n ? 1\n : 0; // https\n }\n return 0;\n}\n\n/**\n * Extract a hostname from `url`, matching a WHATWG URL parser's host-boundary\n * behaviour (https://url.spec.whatwg.org/#concept-basic-url-parser) for tldts'\n * scope. It deliberately does NOT normalise the host (no IDNA/punycode or IPv4\n * canonicalisation; IPv6 brackets are stripped, not compressed), strips trailing\n * dots, and stays lenient where a strict parser rejects (bare host:port,\n * out-of-range port, user@host) — all documented deviations.\n *\n * @param urlIsValidHostname - when true, `url` is already a valid hostname and is\n * returned by the same reference (factory.ts skips re-validation on that\n * identity), keeping the common path allocation-free.\n * @param validate - when true, validate the host inline during the authority\n * scan and publish the verdict via `extractedHostnameValidated` so `parseImpl`\n * can skip the redundant `isValidHostname` pass for simple authorities.\n */\nexport default function extractHostname(\n url: string,\n urlIsValidHostname: boolean,\n validate = false,\n): string | null {\n let start = 0;\n let end: number = url.length;\n let hasUpper = false;\n let isSpecial = false;\n extractedHostnameValidated = false;\n\n if (!urlIsValidHostname) {\n // Data URLs never carry a host (and may be huge — short-circuit them).\n if (url.startsWith('data:')) {\n return null;\n }\n\n // WHATWG step 1: trim leading/trailing C0 control or space (<= U+0020).\n // Tab/newline elsewhere are handled lazily below.\n while (start < url.length && url.charCodeAt(start) <= 32) {\n start += 1;\n }\n while (end > start + 1 && url.charCodeAt(end - 1) <= 32) {\n end -= 1;\n }\n\n if (\n url.charCodeAt(start) === 47 /* '/' */ &&\n url.charCodeAt(start + 1) === 47 /* '/' */\n ) {\n // Scheme-relative reference (\"//host/path\").\n start += 2;\n } else {\n const indexOfProtocol = url.indexOf(':/', start);\n if (indexOfProtocol !== -1) {\n // \"scheme://…\". Classify the scheme, then position `start` at the host.\n const special = getSpecialScheme(url, start, indexOfProtocol);\n if (special === 1) {\n // Special scheme: skip the run of '/' and '\\' after it\n // (special-authority-(ignore-)slashes states; '\\' acts as '/').\n isSpecial = true;\n start = indexOfProtocol + 2;\n while (\n url.charCodeAt(start) === 47 /* '/' */ ||\n url.charCodeAt(start) === 92 /* '\\' */\n ) {\n start += 1;\n }\n } else if (special === 2) {\n // file: the host is only what sits between \"//\" and the next slash, so\n // \"file://h/x\" => \"h\" but \"file:///x\" / \"file:/x\" => no host.\n isSpecial = true;\n start = indexOfProtocol + 1;\n let slashes = 0;\n while (\n (url.charCodeAt(start) === 47 || url.charCodeAt(start) === 92) &&\n slashes < 2\n ) {\n start += 1;\n slashes += 1;\n }\n if (slashes < 2) {\n return null;\n }\n } else {\n // Unknown scheme: validate the WHATWG scheme grammar [A-Za-z0-9+.-];\n // a control char means it was split by a tab/newline (strip + re-parse).\n for (let i = start; i < indexOfProtocol; i += 1) {\n const code = url.charCodeAt(i) | 32;\n if (\n !(\n (\n (code >= 97 && code <= 122) || // [a, z]\n (code >= 48 && code <= 57) || // [0, 9]\n code === 46 || // '.'\n code === 45 || // '-'\n code === 43\n ) // '+'\n )\n ) {\n const raw = url.charCodeAt(i);\n if (raw === 9 || raw === 10 || raw === 13) {\n return extractHostname(\n url.replace(CONTROL_CHARS, ''),\n urlIsValidHostname,\n validate,\n );\n }\n return null;\n }\n }\n // A non-special scheme has an authority only after \"//\" (else it is an\n // opaque path with no host). `indexOf(':/')` already gave the first '/'.\n if (url.charCodeAt(indexOfProtocol + 2) === 47 /* '/' */) {\n start = indexOfProtocol + 3;\n } else {\n return null;\n }\n }\n } else if (url.charCodeAt(start) !== 91 /* '[' */) {\n // Cold path: no scheme \"://\", and not a bare IPv6 literal (whose first\n // ':' would otherwise look like a scheme separator; \"[…]\" falls through\n // to the ipv6 handling below). May be a bare host, a host:port, a\n // user@host, a slash-less special scheme (\"https:host\"), or an opaque\n // URI (\"mailto:\", \"tel:\", \"urn:…\").\n let indexOfColon = -1;\n for (let i = start; i < end; i += 1) {\n const code = url.charCodeAt(i);\n if (code === 9 || code === 10 || code === 13) {\n return extractHostname(\n url.replace(CONTROL_CHARS, ''),\n urlIsValidHostname,\n validate,\n );\n }\n if (code === 58 /* ':' */) {\n indexOfColon = i;\n break;\n }\n if (code === 47 || code === 92 || code === 63 || code === 35) {\n break;\n }\n }\n\n if (indexOfColon !== -1) {\n // An '@' before the next delimiter => the ':' is userinfo, not a\n // scheme (\"user:pass@host\", \"mailto:a@b\"): keep the whole authority.\n let hasIdentifier = false;\n for (let i = indexOfColon + 1; i < end; i += 1) {\n const code = url.charCodeAt(i);\n if (code === 47 || code === 92 || code === 63 || code === 35) {\n break;\n }\n if (code === 64 /* '@' */) {\n hasIdentifier = true;\n break;\n }\n }\n\n if (!hasIdentifier) {\n // All-digits after ':' => a bare \"host:port\" (tldts accepts\n // hostnames too); keep `start` and let the port handling trim it.\n let allDigits = true;\n let i = indexOfColon + 1;\n for (; i < end; i += 1) {\n const code = url.charCodeAt(i);\n if (code === 47 || code === 92 || code === 63 || code === 35) {\n break;\n }\n if (code < 48 /* '0' */ || code > 57 /* '9' */) {\n allDigits = false;\n break;\n }\n }\n if (i === indexOfColon + 1) {\n allDigits = false; // nothing after ':' => not a port\n }\n\n if (!allDigits) {\n const special = getSpecialScheme(url, start, indexOfColon);\n if (special === 0) {\n // No \"://\" anywhere on the cold path and not a special scheme.\n // A second ':' before the host's end marks a bare, unbracketed\n // IPv6 literal (\"2a01:e35::1\"): fall through and let the host\n // loop + isIp classify it. Without one this is an opaque path\n // with no host (\"mailto:x\", \"foo:bar\").\n let isBareIpv6 = false;\n for (let j = indexOfColon + 1; j < end; j += 1) {\n const code = url.charCodeAt(j);\n if (\n code === 47 ||\n code === 92 ||\n code === 63 ||\n code === 35\n ) {\n break;\n }\n if (code === 58 /* ':' */) {\n isBareIpv6 = true;\n break;\n }\n }\n if (!isBareIpv6) {\n return null;\n }\n } else {\n isSpecial = true;\n start = indexOfColon + 1;\n if (special === 2) {\n // file (e.g. \"file:\\\\host\"): host only between \"//\" and next slash.\n let slashes = 0;\n while (\n (url.charCodeAt(start) === 47 ||\n url.charCodeAt(start) === 92) &&\n slashes < 2\n ) {\n start += 1;\n slashes += 1;\n }\n if (slashes < 2) {\n return null;\n }\n } else {\n while (\n url.charCodeAt(start) === 47 ||\n url.charCodeAt(start) === 92\n ) {\n start += 1;\n }\n }\n }\n }\n }\n }\n }\n }\n\n // Find the host's end: first '/', '?' or '#' (and '\\' for special URLs,\n // which WHATWG treats like '/'). Track the last '@', ']' and ':' for\n // userinfo, ipv6 and port, plus the first ':' of the host (reset at each\n // '@') to tell a bare IPv6 (>= 2 colons) from a host:port (exactly one);\n // flag uppercase and a stray tab/newline. The loop is split on `code < 64`\n // so common host characters take fewer comparisons.\n //\n // When `validate`, also accumulate `is-valid.ts`'s checks over the scanned\n // run so a simple authority's host can be validated in this single pass.\n // `vValid` only stays meaningful for a \"simple\" authority (no userinfo, port,\n // brackets, control or trailing dot); those cases clear it / are rejected by\n // the guard below, falling back to `isValidHostname`.\n let indexOfIdentifier = -1;\n let indexOfClosingBracket = -1;\n let indexOfPort = -1;\n let indexOfFirstColon = -1;\n let hasControl = false;\n let vValid = validate; // seeded true when validating; cleared on the first invalid char\n let vLastDot = start - 1; // mirrors is-valid.ts `lastDotIndex = -1` at host start\n let vLastCode = -1;\n if (validate && start < end) {\n // First-char rule: must be a valid host char, '.', or '_' (NOT '-').\n const c0 = url.charCodeAt(start);\n if (\n !(\n /*@__INLINE__*/ (\n isValidHostnameChar(c0) ||\n c0 === 46 /* '.' */ ||\n c0 === 95 /* '_' */\n )\n ) ||\n c0 === 45 /* '-' (isValidHostnameChar allows it mid-label, not first) */\n ) {\n vValid = false;\n }\n }\n for (let i = start; i < end; i += 1) {\n const code: number = url.charCodeAt(i);\n if (code < 64) {\n if (code === 47 || code === 35 || code === 63) {\n end = i;\n break;\n } else if (code === 58 /* ':' */) {\n if (indexOfFirstColon === -1) {\n indexOfFirstColon = i;\n }\n indexOfPort = i;\n } else if (code === 9 || code === 10 || code === 13) {\n hasControl = true;\n } else if (validate) {\n if (code === 46 /* '.' */) {\n if (i - vLastDot > 64 || vLastCode === 46 || vLastCode === 45) {\n vValid = false;\n }\n vLastDot = i;\n } else if (code < 48 || code > 57) {\n // < 64 and not a delimiter/dot/digit => only '-' (45) is a valid\n // host char here; everything else (space, %, !, etc.) is invalid.\n // A '-' must also not START a label (the byte right after a '.') —\n // mirrors is-valid.ts; the first label is covered by the first-char\n // rule above. (RFC 1034 §3.5 / RFC 1035 §2.3.1 LDH.)\n if (code !== 45 || vLastCode === 46 /* label-leading '-' */) {\n vValid = false;\n }\n }\n }\n } else if (isSpecial && code === 92 /* '\\' */) {\n end = i;\n break;\n } else if (code === 64 /* '@' */) {\n indexOfIdentifier = i;\n indexOfFirstColon = -1; // colons before '@' are userinfo, not the host\n } else if (code === 93 /* ']' */) {\n indexOfClosingBracket = i;\n } else if (code >= 65 && code <= 90) {\n hasUpper = true;\n } else if (validate && !(/*@__INLINE__*/ isValidHostnameChar(code))) {\n // >= 64, not '@'/']'/upper: valid only if a-z, '_', or non-ASCII.\n vValid = false;\n }\n if (validate) {\n vLastCode = code;\n }\n }\n\n // A tab/newline inside the authority: strip everything and re-parse (rare).\n if (hasControl) {\n return extractHostname(\n url.replace(CONTROL_CHARS, ''),\n urlIsValidHostname,\n validate,\n );\n }\n\n // Skip userinfo. '>= start' so an empty userinfo (\"http://@host\") works too.\n if (\n indexOfIdentifier !== -1 &&\n indexOfIdentifier >= start &&\n indexOfIdentifier < end\n ) {\n start = indexOfIdentifier + 1;\n }\n\n if (url.charCodeAt(start) === 91 /* '[' */) {\n // ipv6 address: return what is between the brackets, or null if unclosed.\n if (indexOfClosingBracket !== -1) {\n return url.slice(start + 1, indexOfClosingBracket).toLowerCase();\n }\n return null;\n } else if (\n indexOfPort !== -1 &&\n indexOfPort > start &&\n indexOfPort < end &&\n // A host:port has exactly one ':' in the host (so its first ':' is its\n // last); a bare, unbracketed IPv6 literal (\"2a01:e35::1\") has >= 2, so\n // its first ':' precedes the last. Only the former has a ':port' to trim.\n indexOfFirstColon === indexOfPort\n ) {\n end = indexOfPort; // trim ':port'\n }\n\n // Empty authority (\"http://\", \"file:///path\", \"//\"); only reachable here via\n // extraction — a bare valid hostname never lands here.\n if (start >= end) {\n return null;\n }\n\n // Publish the inline-validation verdict — but only for a \"simple\" authority,\n // where the scanned run equals the final host: no userinfo skip, no port\n // trim, no brackets, no trailing dot (trimmed below), and length within RFC\n // limits. Anything else leaves it `false` so `parseImpl` re-validates.\n //\n // Every clause below is load-bearing for CORRECTNESS, not just speed: the\n // loop accumulates `vValid` over the whole scanned run (it does not stop at\n // ':' or '@', so any port/userinfo bytes are included), so the verdict is\n // only sound when that run equals the final host. Do not drop a clause as\n // \"redundant\" — e.g. without `indexOfPort === -1`, `host:8080` would be\n // wrongly accepted.\n if (\n validate &&\n vValid &&\n indexOfIdentifier === -1 &&\n indexOfPort === -1 &&\n indexOfClosingBracket === -1 &&\n url.charCodeAt(end - 1) !== 46 /* no trailing dot */ &&\n end - start <= 255 && // total length\n end - vLastDot - 1 <= 63 && // last label length\n vLastCode !== 45 /* last char not '-' */\n ) {\n extractedHostnameValidated = true;\n }\n }\n\n // Trim trailing dots\n while (end > start + 1 && url.charCodeAt(end - 1) === 46 /* '.' */) {\n end -= 1;\n }\n\n const hostname: string =\n start !== 0 || end !== url.length ? url.slice(start, end) : url;\n\n if (hasUpper) {\n return hostname.toLowerCase();\n }\n\n return hostname;\n}\n","/**\n * Check if a hostname is an IP. You should be aware that this only works\n * because `hostname` is already garanteed to be a valid hostname!\n */\nfunction isProbablyIpv4(hostname: string): boolean {\n // Cannot be shorted than 1.1.1.1\n if (hostname.length < 7) {\n return false;\n }\n\n // Cannot be longer than: 255.255.255.255\n if (hostname.length > 15) {\n return false;\n }\n\n let numberOfDots = 0;\n\n for (let i = 0; i < hostname.length; i += 1) {\n const code = hostname.charCodeAt(i);\n\n if (code === 46 /* '.' */) {\n numberOfDots += 1;\n } else if (code < 48 /* '0' */ || code > 57 /* '9' */) {\n return false;\n }\n }\n\n return (\n numberOfDots === 3 &&\n hostname.charCodeAt(0) !== 46 /* '.' */ &&\n hostname.charCodeAt(hostname.length - 1) !== 46 /* '.' */\n );\n}\n\n/**\n * Similar to isProbablyIpv4.\n */\nfunction isProbablyIpv6(hostname: string): boolean {\n if (hostname.length < 3) {\n return false;\n }\n\n let start = hostname.startsWith('[') ? 1 : 0;\n let end = hostname.length;\n\n if (hostname[end - 1] === ']') {\n end -= 1;\n }\n\n // We only consider the maximum size of a normal IPV6. Note that this will\n // fail on so-called \"IPv4 mapped IPv6 addresses\" but this is a corner-case\n // and a proper validation library should be used for these.\n if (end - start > 39) {\n return false;\n }\n\n let hasColon = false;\n\n for (; start < end; start += 1) {\n const code = hostname.charCodeAt(start);\n\n if (code === 58 /* ':' */) {\n hasColon = true;\n } else if (\n !(\n (\n (code >= 48 && code <= 57) || // 0-9\n (code >= 97 && code <= 102) || // a-f\n (code >= 65 && code <= 70)\n ) // A-F (RFC 4291 §2.2: an IPv6 hextet is hex digits only)\n )\n ) {\n return false;\n }\n }\n\n return hasColon;\n}\n\n/**\n * Check if `hostname` is *probably* a valid ip addr (either ipv6 or ipv4).\n * This *will not* work on any string. We need `hostname` to be a valid\n * hostname.\n */\nexport default function isIp(hostname: string): boolean {\n return isProbablyIpv6(hostname) || isProbablyIpv4(hostname);\n}\n","/**\n * Special-use domain names from the IANA \"Special-Use Domain Names\" registry:\n * the authoritative list, created by RFC 6761 and maintained as new RFCs add to\n * it: https://www.iana.org/assignments/special-use-domain-names/\n * Snapshot: 2026-05-24. (RFC 6761 is not obsoleted; draft-hoffman-rfc6761bis\n * proposes to retire its prose but keep this registry, so the registry is the\n * source of truth; re-sync this list against it.)\n *\n * These names never correspond to a public registration, yet neither\n * `isIcann` nor `isPrivate` marks one as special-use: most are absent from the\n * Public Suffix List (so `a.test` looks like a registrable domain), and the\n * few that are listed (`onion`, `home.arpa`) appear there as ordinary ICANN\n * suffixes. `isSpecialUse` is the single signal that covers them all.\n *\n * Per the registry and RFC 6761 (\"and any names falling within these domains\"),\n * the designation covers each listed name AND all of its sub-domains. DNS labels\n * are case-insensitive (RFC 4343); `hostname` is expected to be already\n * lower-cased and trailing-dot-stripped, as produced by `extractHostname`, the\n * same normalization the Public-Suffix-List lookup relies on.\n *\n * Two groups of registry entries are intentionally excluded: the numeric\n * reverse-DNS delegation zones (`10.in-addr.arpa`, the `*.ip6.arpa` ranges, …),\n * which are reverse-DNS PTR zones rather than hostnames and whose parents\n * (`in-addr.arpa`/`ip6.arpa`) are already in the Public Suffix List; and the\n * deprecated `eap-noob.arpa` entry.\n */\nconst SPECIAL_USE_DOMAINS: readonly string[] = [\n 'test', // RFC 6761\n 'localhost', // RFC 6761\n 'invalid', // RFC 6761\n 'example', // RFC 6761\n 'example.com', // RFC 6761\n 'example.net', // RFC 6761\n 'example.org', // RFC 6761\n 'local', // RFC 6762 (mDNS)\n 'onion', // RFC 7686 (Tor)\n 'alt', // RFC 9476\n 'home.arpa', // RFC 8375\n 'ipv4only.arpa', // RFC 8880\n 'resolver.arpa', // RFC 9462\n 'service.arpa', // RFC 9665\n '6tisch.arpa', // RFC 9031\n 'eap.arpa', // RFC 9965\n];\n\n/**\n * Return `true` if `hostname` is, or is a sub-domain of, a special-use domain\n * (see the registry note above). Expects an already-normalized `hostname`.\n */\nexport default function isSpecialUse(hostname: string): boolean {\n for (const name of SPECIAL_USE_DOMAINS) {\n // Match on a label boundary: `hostname` is either exactly `name` or ends\n // with `.name` (so `latest` is not matched by `test`, nor `myexample.com`\n // by `example.com`).\n if (\n hostname.endsWith(name) &&\n (hostname.length === name.length ||\n hostname.charCodeAt(hostname.length - name.length - 1) === 46) /* '.' */\n ) {\n return true;\n }\n }\n\n return false;\n}\n","/**\n * Implements fast shallow verification of hostnames. This does not perform a\n * struct check on the content of labels (classes of Unicode characters, etc.)\n * but instead check that the structure is valid (number of labels, length of\n * labels, etc.).\n *\n * If you need stricter validation, consider using an external library.\n */\n\n// KEEP IN SYNC with `extract-hostname.ts` `isValidHostnameChar` + its inline\n// scan/verdict, which duplicate these structural rules to validate during\n// extraction (a perf fusion). That copy additionally accepts A-Z (the host is\n// not yet lowercased there) and folds in '-' / '_'. Any change to the accepted\n// character set or the label/length rules here must be mirrored there.\nfunction isValidAscii(code: number): boolean {\n return (\n (code >= 97 && code <= 122) || (code >= 48 && code <= 57) || code > 127\n );\n}\n\n/**\n * Check if a hostname string is valid. It's usually a preliminary check before\n * trying to use getDomain or anything else.\n *\n * Beware: it does not check if the TLD exists.\n */\nexport default function (hostname: string): boolean {\n if (hostname.length > 255) {\n return false;\n }\n\n if (hostname.length === 0) {\n return false;\n }\n\n if (\n /*@__INLINE__*/ !isValidAscii(hostname.charCodeAt(0)) &&\n hostname.charCodeAt(0) !== 46 && // '.' (dot)\n hostname.charCodeAt(0) !== 95 // '_' (underscore)\n ) {\n return false;\n }\n\n // Validate hostname according to RFC\n let lastDotIndex = -1;\n let lastCharCode = -1;\n const len = hostname.length;\n\n for (let i = 0; i < len; i += 1) {\n const code = hostname.charCodeAt(i);\n if (code === 46 /* '.' */) {\n if (\n // Check that previous label is < 63 bytes long (64 = 63 + '.')\n i - lastDotIndex > 64 ||\n // Check that previous character was not already a '.'\n lastCharCode === 46 ||\n // Check that the previous label does not end with '-' (RFC 1035 §2.3.1 LDH).\n // '_' is intentionally NOT restricted: DNS allows any octet (RFC 2181 §11) and\n // WHATWG URL does not treat '_' as a forbidden host code point.\n lastCharCode === 45\n ) {\n return false;\n }\n\n lastDotIndex = i;\n } else if (\n // A forbidden character in the label...\n !(/*@__INLINE__*/ (isValidAscii(code) || code === 45 || code === 95)) ||\n // ...or a '-' starting a label (the byte right after a '.'). A label must\n // not begin with a hyphen (RFC 1034 §3.5 / RFC 1035 §2.3.1 LDH, as amended\n // by RFC 1123 §2.1; cf. UTS #46 CheckHyphens). The first label is covered by\n // the leading-character guard above; mirrors the trailing-'-' rule below.\n (code === 45 && lastCharCode === 46)\n ) {\n return false;\n }\n\n lastCharCode = code;\n }\n\n return (\n // Check that last label is shorter than 63 chars\n len - lastDotIndex - 1 <= 63 &&\n // Check that the last character is an allowed trailing label character.\n // Since we already checked that the char is a valid hostname character,\n // we only need to check that it's different from '-'.\n lastCharCode !== 45\n );\n}\n","export interface IOptions {\n allowIcannDomains: boolean;\n allowPrivateDomains: boolean;\n detectIp: boolean;\n // Detect RFC 6761 / IANA special-use domains and expose the result as\n // `isSpecialUse` on `parse()`. Off by default so the common path stays\n // allocation-free with no extra work; enable it to populate the field.\n detectSpecialUse: boolean;\n extractHostname: boolean;\n mixedInputs: boolean;\n validHosts: string[] | null;\n validateHostname: boolean;\n}\n\nfunction setDefaultsImpl({\n allowIcannDomains = true,\n allowPrivateDomains = false,\n detectIp = true,\n detectSpecialUse = false,\n extractHostname = true,\n mixedInputs = true,\n validHosts = null,\n validateHostname = true,\n}: Partial<IOptions>): IOptions {\n return {\n allowIcannDomains,\n allowPrivateDomains,\n detectIp,\n detectSpecialUse,\n extractHostname,\n mixedInputs,\n validHosts,\n validateHostname,\n };\n}\n\nconst DEFAULT_OPTIONS = /*@__INLINE__*/ setDefaultsImpl({});\n\nexport function setDefaults(options?: Partial<IOptions>): IOptions {\n if (options === undefined) {\n return DEFAULT_OPTIONS;\n }\n\n return /*@__INLINE__*/ setDefaultsImpl(options);\n}\n","/**\n * Returns the subdomain of a hostname string\n */\nexport default function getSubdomain(hostname: string, domain: string): string {\n // If `hostname` and `domain` are the same, then there is no sub-domain\n if (domain.length === hostname.length) {\n return '';\n }\n\n return hostname.slice(0, -domain.length - 1);\n}\n","/**\n * Implement a factory allowing to plug different implementations of suffix\n * lookup (e.g.: using a trie or the packed hashes datastructures). This is used\n * and exposed in `tldts.ts` and `tldts-experimental.ts` bundle entrypoints.\n */\n\nimport getDomain from './domain';\nimport getDomainWithoutSuffix from './domain-without-suffix';\nimport extractHostname, {\n extractedHostnameValidated,\n} from './extract-hostname';\nimport isIp from './is-ip';\nimport isSpecialUse from './is-special-use';\nimport isValidHostname from './is-valid';\nimport { IPublicSuffix, ISuffixLookupOptions } from './lookup/interface';\nimport { IOptions, setDefaults } from './options';\nimport getSubdomain from './subdomain';\n\nexport interface IResult {\n // `hostname` is either a registered name (including but not limited to a\n // hostname), or an IP address, directly extracted from the input URL. IPv4\n // addresses are in dot-decimal notation. IPv6 is returned without its\n // surrounding brackets; both bracketed (in URLs, e.g. `http://[::1]/`) and\n // bare unbracketed (e.g. `2a01:e35::1`) IPv6 literals are accepted.\n hostname: string | null;\n\n // Is `hostname` an IP? (IPv4 or IPv6)\n isIp: boolean | null;\n\n // `hostname` split between subdomain, domain and its public suffix (if any)\n subdomain: string | null;\n domain: string | null;\n publicSuffix: string | null;\n domainWithoutSuffix: string | null;\n\n // Specifies if `publicSuffix` comes from the ICANN or PRIVATE section of the list\n isIcann: boolean | null;\n isPrivate: boolean | null;\n\n // Is `hostname` a special-use domain from the IANA registry (RFC 6761 et al.:\n // e.g. `localhost`, `*.test`, `*.local`, `*.onion`, `home.arpa`)? `isIcann`/\n // `isPrivate` do not identify these (most are not in the Public Suffix List;\n // the few that are appear as ordinary ICANN suffixes). `null` unless the\n // `detectSpecialUse` option is enabled (see is-special-use.ts).\n isSpecialUse: boolean | null;\n}\n\nexport function getEmptyResult(): IResult {\n return {\n domain: null,\n domainWithoutSuffix: null,\n hostname: null,\n isIcann: null,\n isIp: null,\n isPrivate: null,\n isSpecialUse: null,\n publicSuffix: null,\n subdomain: null,\n };\n}\n\nexport function resetResult(result: IResult): void {\n result.domain = null;\n result.domainWithoutSuffix = null;\n result.hostname = null;\n result.isIcann = null;\n result.isIp = null;\n result.isPrivate = null;\n result.isSpecialUse = null;\n result.publicSuffix = null;\n result.subdomain = null;\n}\n\n// Flags representing steps in the `parse` function. They are used to implement\n// an early stop mechanism (simulating some form of laziness) to avoid doing\n// more work than necessary to perform a given action (e.g.: we don't need to\n// extract the domain and subdomain if we are only interested in public suffix).\nexport const enum FLAG {\n HOSTNAME,\n IS_VALID,\n PUBLIC_SUFFIX,\n DOMAIN,\n SUB_DOMAIN,\n ALL,\n}\n\nexport function parseImpl(\n url: string,\n step: FLAG,\n suffixLookup: (\n _1: string,\n _2: ISuffixLookupOptions,\n _3: IPublicSuffix,\n ) => void,\n partialOptions: Partial<IOptions> | undefined,\n result: IResult,\n): IResult {\n const options: IOptions = /*@__INLINE__*/ setDefaults(partialOptions);\n\n // Very fast approximate check to make sure `url` is a string. This is needed\n // because the library will not necessarily be used in a typed setup and\n // values of arbitrary types might be given as argument.\n if (typeof url !== 'string') {\n return result;\n }\n\n // Extract hostname from `url` only if needed. This can be made optional\n // using `options.extractHostname`. This option will typically be used\n // whenever we are sure the inputs to `parse` are already hostnames and not\n // arbitrary URLs.\n //\n // `mixedInput` allows to specify if we expect a mix of URLs and hostnames\n // as input. If only hostnames are expected then `extractHostname` can be\n // set to `false` to speed-up parsing. If only URLs are expected then\n // `mixedInputs` can be set to `false`. The `mixedInputs` is only a hint\n // and will not change the behavior of the library.\n // Whether `url` itself was already a valid hostname (only computed on the\n // mixedInputs path). Lets us skip the post-extraction validation below when\n // extractHostname returned `url` unchanged (same reference).\n let urlIsValid = false;\n if (!options.extractHostname) {\n result.hostname = url;\n } else if (options.mixedInputs) {\n urlIsValid = isValidHostname(url);\n result.hostname = extractHostname(\n url,\n urlIsValid,\n options.validateHostname,\n );\n } else {\n result.hostname = extractHostname(url, false, options.validateHostname);\n }\n\n // Check if `hostname` is a valid ip address\n if (options.detectIp && result.hostname !== null) {\n result.isIp = isIp(result.hostname);\n if (result.isIp) {\n return result;\n }\n }\n\n // Perform hostname validation if enabled. If hostname is not valid, no need to\n // go further as there will be no valid domain or sub-domain. This validation\n // is applied before any early returns to ensure consistent behavior across\n // all API methods including getHostname().\n if (\n options.validateHostname &&\n options.extractHostname &&\n result.hostname !== null &&\n // Skip the re-scan when `url` was already validated and extractHostname\n // returned it unchanged (same reference => identical string, still valid).\n !(urlIsValid && result.hostname === url) &&\n // Skip the re-scan when extractHostname already validated the host inline\n // (a confirmed-valid simple authority — see extract-hostname.ts).\n !extractedHostnameValidated &&\n !isValidHostname(result.hostname)\n ) {\n result.hostname = null;\n return result;\n }\n\n if (step === FLAG.HOSTNAME || result.hostname === null) {\n return result;\n }\n\n // Flag special-use domains, only when opted in (`detectSpecialUse`) and only\n // for the full `parse()` result (FLAG.ALL). Computed here, before the\n // public-suffix/domain early-returns below, so single-label names like\n // `localhost` (which have no registrable domain) are still flagged.\n if (step === FLAG.ALL && options.detectSpecialUse) {\n result.isSpecialUse = isSpecialUse(result.hostname);\n }\n\n // Extract public suffix\n suffixLookup(result.hostname, options, result);\n if (step === FLAG.PUBLIC_SUFFIX || result.publicSuffix === null) {\n return result;\n }\n\n // Extract domain\n result.domain = getDomain(result.publicSuffix, result.hostname, options);\n if (step === FLAG.DOMAIN || result.domain === null) {\n return result;\n }\n\n // Extract subdomain\n result.subdomain = getSubdomain(result.hostname, result.domain);\n if (step === FLAG.SUB_DOMAIN) {\n return result;\n }\n\n // Extract domain without suffix\n result.domainWithoutSuffix = getDomainWithoutSuffix(\n result.domain,\n result.publicSuffix,\n );\n\n return result;\n}\n","import { IPublicSuffix, ISuffixLookupOptions } from './interface';\n\nexport default function (\n hostname: string,\n options: ISuffixLookupOptions,\n out: IPublicSuffix,\n): boolean {\n // Fast path for very popular suffixes; this allows to by-pass lookup\n // completely as well as any extra allocation or string manipulation.\n if (!options.allowPrivateDomains && hostname.length > 3) {\n const last: number = hostname.length - 1;\n const c3: number = hostname.charCodeAt(last);\n const c2: number = hostname.charCodeAt(last - 1);\n const c1: number = hostname.charCodeAt(last - 2);\n const c0: number = hostname.charCodeAt(last - 3);\n\n if (\n c3 === 109 /* 'm' */ &&\n c2 === 111 /* 'o' */ &&\n c1 === 99 /* 'c' */ &&\n c0 === 46 /* '.' */\n ) {\n out.isIcann = true;\n out.isPrivate = false;\n out.publicSuffix = 'com';\n return true;\n } else if (\n c3 === 103 /* 'g' */ &&\n c2 === 114 /* 'r' */ &&\n c1 === 111 /* 'o' */ &&\n c0 === 46 /* '.' */\n ) {\n out.isIcann = true;\n out.isPrivate = false;\n out.publicSuffix = 'org';\n return true;\n } else if (\n c3 === 117 /* 'u' */ &&\n c2 === 100 /* 'd' */ &&\n c1 === 101 /* 'e' */ &&\n c0 === 46 /* '.' */\n ) {\n out.isIcann = true;\n out.isPrivate = false;\n out.publicSuffix = 'edu';\n return true;\n } else if (\n c3 === 118 /* 'v' */ &&\n c2 === 111 /* 'o' */ &&\n c1 === 103 /* 'g' */ &&\n c0 === 46 /* '.' */\n ) {\n out.isIcann = true;\n out.isPrivate = false;\n out.publicSuffix = 'gov';\n return true;\n } else if (\n c3 === 116 /* 't' */ &&\n c2 === 101 /* 'e' */ &&\n c1 === 110 /* 'n' */ &&\n c0 === 46 /* '.' */\n ) {\n out.isIcann = true;\n out.isPrivate = false;\n out.publicSuffix = 'net';\n return true;\n } else if (\n c3 === 101 /* 'e' */ &&\n c2 === 100 /* 'd' */ &&\n c1 === 46 /* '.' */\n ) {\n out.isIcann = true;\n out.isPrivate = false;\n out.publicSuffix = 'de';\n return true;\n }\n }\n\n return false;\n}\n","// Auto-generated flat public-suffix trie. Do not edit.\nexport const nodeFlags = /*#__PURE__*/ new Uint8Array([1,2,1,1,1,1,1,1,1,1,1,1,0,2,2,2,0,2,2,0,2,0,0,1,0,0,2,1,1,1,1,1,1,0,0,0,1,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,0,0,0,0,0,0,1,1,1,0,2,0,0,0,0,0,0,0,2,0,2,2,0,0,2,2,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,2,1,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,2,2,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0,2,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,2,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,0,1,0,2,2,0,0,0,2,0,1,1,0,2,0,2,2,0,1,1,1,1,1,1,1,1,0,1,1,1,0,1,1,1,1,0,0,0,0,1,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,2,2,0,2,2,0,0,0,0,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,2,2,0,2,2,2,2,0,0,0,0,2,0,0,0,0,0,0,0,2,2,0,0,0,2,2,1,1,1,1,1,2,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,2,2,0,0,2,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2,2,1,2,1,1,1,2,1,1,1,1,1,0,1,1,1,1,2,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,2,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,0,0,0,0,0]);\nexport const edgeStart = /*#__PURE__*/ new Uint16Array([0,0,0,10,11,18,106,111,117,124,130,136,145,146,147,148,149,150,151,153,154,155,157,159,226,239,241,242,243,258,265,266,269,270,271,274,276,295,296,298,307,312,329,330,333,335,336,338,372,373,375,378,379,383,385,389,392,424,427,440,441,449,450,452,462,476,477,478,487,488,525,530,546,566,572,614,615,642,669,670,818,824,827,828,829,834,839,848,870,871,872,873,874,875,876,894,896,897,900,902,903,905,907,922,937,942,943,945,946,947,948,949,951,954,959,960,961,963,964,967,970,971,972,985,987,999,1010,1018,1020,1061,1064,1068,1069,1071,1074,1085,1087,1097,1099,1105,1107,1108,1110,1113,1114,1115,1168,1170,1172,1192,1193,1194,1195,1197,1208,1239,1250,1262,1271,1278,1283,1296,1307,1320,1321,1332,1366,1367,1368,1383,1398,1470,1471,1473,1474,1508,1509,1510,1511,1514,1518,1521,1523,1552,1553,1561,1562,1563,1564,1566,1568,1569,1571,1572,1573,1584,1585,1586,1587,1588,1589,1590,1591,1592,1593,1594,1595,1596,1597,1599,1600,1601,2055,2058,2059,2061,2068,2075,2085,2089,2100,2101,2102,2114,2115,2117,2119,2120,2127,2128,2130,2131,2133,2134,2135,2136,2137,2211,2213,2234,2235,2236,2238,2264,2265,2316,2317,2319,2326,2332,2342,2352,2405,2406,2407,2417,2431,2432,2435,2442,2443,2451,2452,2453,2454,2455,2466,2467,2468,2470,2471,2472,2481,2493,2499,2531,2535,2537,2538,2540,2541,2552,2553,2555,2563,2570,2576,2581,2582,2588,2591,2597,2604,2605,2612,2620,2621,2622,2660,2666,2681,2682,2687,2705,2736,2754,2756,2759,2767,2769,2776,2828,2852,2853,2854,2855,2856,2857,2858,2865,2866,2867,2868,2869,2870,2872,2873,2877,2957,2970,2971,3408,3412,3426,3478,3506,3528,3586,3608,3623,3686,3737,3775,3811,3836,3978,4024,4075,4094,4128,4143,4163,4193,4224,4247,4278,4308,4340,4367,4442,4464,4502,4512,4546,4565,4591,4633,4683,4709,4778,4779,4781,4804,4827,4863,4894,4911,4968,4981,5005,5034,5036,5070,5086,5114,5419,5428,5437,5444,5461,5465,5471,5510,5512,5519,5526,5535,5542,5543,5544,5556,5559,5574,5575,5584,5585,5594,5603,5609,5611,5612,5613,5650,5651,5653,5661,5668,5681,5685,5687,5688,5694,5701,5715,5725,5730,5738,5746,5752,5753,5757,5759,5760,5772,5844,5845,5846,5847,5849,5850,5853,5855,5858,5862,5863,5864,5870,5871,5872,5874,5876,5878,5879,5880,5883,5885,5888,5889,5891,6089,6096,6097,6098,6108,6113,6130,6144,6153,6154,6155,6159,6160,6162,6164,6170,6171,6174,6175,6177,6178,6179,7079,7082,7086,7104,7113,7116,7123,7124,7126,7127,7128,7130,7182,7183,7186,7187,7304,7305,7316,7327,7334,7337,7346,7347,7348,7363,7418,7609,7611,7612,7614,7619,7632,7647,7654,7663,7666,7669,7676,7684,7688,7689,7690,7704,7708,7717,7718,7719,7723,7758,7759,7777,7784,7792,7793,7798,7806,7850,7851,7857,7860,7872,7877,7878,7881,7883,7918,7919,7925,7932,7933,7942,7951,7966,7970,7971,8023,8024,8029,8031,8034,8036,8037,8038,8047,8061,8069,8083,8095,8096,8098,8100,8122,8133,8139,8140,8152,8164,8251,8263,8271,8274,8280,8305,8308,8309,8310,8311,8313,8316,8319,8330,8332,8334,8362,8437,8444,8448,8449,8458,8480,8481,8486,8487,8566,8568,8570,8579,8583,8589,8595,8601,8611,8616,8617,8635,8646,8651,8656,8666,8672,8676,8682,8688,10297,10298,10299,10306,10308]);\nexport const edgeLength = /*#__PURE__*/ new Uint8Array([3,3,3,3,3,3,3,3,5,8,8,2,2,3,3,3,3,3,8,5,5,5,5,5,3,3,5,5,9,12,19,8,19,8,11,9,9,8,7,7,6,8,9,16,10,7,7,11,8,6,6,9,7,11,7,14,4,4,4,4,4,4,10,7,6,6,6,6,10,10,6,10,10,22,11,9,10,10,10,9,10,8,7,7,7,8,21,13,11,11,9,10,9,13,10,8,8,9,12,9,7,10,7,7,13,7,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,8,6,3,3,3,3,3,3,2,5,3,3,3,7,2,2,2,2,2,2,3,3,3,1,1,7,8,5,2,2,7,2,2,1,4,1,11,9,9,5,5,8,5,5,5,5,5,5,5,3,3,3,3,3,5,11,9,9,13,7,14,7,6,6,6,7,6,6,6,6,6,10,7,11,9,4,4,4,4,4,6,6,6,6,13,6,8,7,10,9,9,9,8,9,8,7,10,6,9,8,10,10,7,8,1,9,10,12,12,12,10,9,9,10,10,9,9,1,1,5,3,3,3,3,3,3,3,3,3,3,3,3,6,6,6,4,3,3,3,7,4,4,4,3,3,6,7,3,4,1,2,2,2,6,1,2,2,2,2,2,12,5,3,8,9,13,4,4,13,9,9,11,7,3,12,9,2,2,2,3,3,3,3,3,8,2,2,3,3,3,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,4,3,7,10,15,7,15,15,20,15,9,10,10,12,14,14,14,12,12,12,12,12,14,14,10,10,10,10,14,9,9,9,10,14,14,14,13,13,9,9,9,9,9,9,7,8,6,8,8,6,8,13,8,8,6,13,8,11,13,8,6,13,8,6,9,10,10,12,14,14,14,12,12,12,12,14,14,10,10,10,10,9,9,9,10,14,14,11,13,13,9,9,9,9,9,9,2,6,9,2,2,3,3,3,3,3,3,3,3,3,4,4,4,2,3,3,3,3,3,3,7,7,2,3,2,2,5,3,3,3,3,3,3,4,2,2,2,2,2,2,3,3,3,3,3,3,3,4,5,7,2,2,12,8,10,8,10,7,18,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,2,2,3,3,3,5,5,3,8,8,6,8,6,6,4,6,7,7,7,10,11,2,5,5,3,3,3,3,3,3,5,5,6,11,10,7,7,7,4,4,4,2,3,3,3,3,3,2,2,7,5,5,3,3,3,3,3,3,3,3,7,7,7,11,7,6,9,6,6,8,10,8,6,8,13,4,4,4,4,4,10,8,11,8,8,8,10,10,7,10,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,2,2,2,2,2,2,5,5,5,5,5,5,5,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,7,10,13,7,8,7,11,8,8,6,9,8,8,6,6,6,8,8,6,6,6,6,6,9,7,6,4,4,4,4,4,4,4,6,6,6,9,7,8,10,8,8,2,3,3,3,3,3,2,8,9,9,2,2,2,3,3,3,2,3,3,3,9,2,2,3,3,3,3,3,3,5,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,12,5,5,3,5,4,2,3,2,4,3,9,2,2,2,2,2,5,5,3,8,8,13,6,10,9,4,7,9,11,2,3,7,3,3,4,1,3,4,2,9,3,3,12,5,3,7,10,10,7,4,4,6,14,7,9,7,13,2,2,2,2,2,2,3,3,3,3,3,8,15,4,4,2,3,3,3,7,4,9,9,2,3,3,3,5,3,2,2,7,2,7,6,6,7,2,4,2,2,2,2,2,2,8,8,8,9,5,2,3,3,3,3,3,3,10,7,4,4,4,4,3,4,2,3,3,3,3,3,10,7,4,4,4,4,2,3,3,3,3,10,7,4,4,4,4,3,9,6,6,6,9,13,9,2,2,2,8,7,9,5,3,3,3,5,5,13,12,9,10,7,8,7,6,8,6,11,12,7,9,10,4,4,7,8,11,6,7,9,8,7,10,8,9,15,7,8,5,4,7,2,3,3,3,2,14,10,2,14,10,2,14,3,9,13,13,10,14,16,17,11,2,14,2,14,3,9,13,10,14,16,17,11,14,10,14,2,7,3,10,7,14,10,2,14,10,9,9,17,6,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,10,10,10,12,9,4,10,10,11,8,8,8,7,9,5,3,3,3,3,3,3,3,3,5,8,4,4,4,4,4,4,6,16,3,3,14,3,14,2,14,9,13,10,10,14,16,17,11,6,9,10,10,12,14,14,14,12,12,12,12,14,14,10,10,10,10,14,9,9,9,10,14,14,14,9,9,9,9,9,9,2,14,9,13,10,10,14,16,17,11,6,2,14,9,17,13,10,10,14,16,17,11,6,2,14,9,13,10,14,16,17,11,2,14,9,13,10,16,11,2,14,10,19,7,2,14,9,13,10,19,10,7,14,16,17,11,6,2,14,9,13,10,19,7,14,16,17,11,2,14,9,13,17,13,10,10,14,16,17,11,6,3,2,14,9,13,10,10,14,16,17,11,6,9,10,12,14,14,14,12,12,12,12,12,14,14,14,10,10,10,14,9,9,9,9,14,14,14,13,13,14,9,9,9,9,9,9,4,11,2,14,9,13,17,13,10,19,10,7,14,16,17,11,6,2,14,9,13,17,13,10,19,10,7,14,16,17,11,6,2,9,10,10,7,17,3,3,12,12,16,15,15,12,14,14,14,20,20,13,12,12,12,12,12,12,20,25,14,14,12,12,10,10,10,10,9,9,9,25,4,9,17,10,7,14,16,21,13,13,14,20,14,13,17,24,9,12,13,25,13,21,20,17,9,9,9,9,9,9,12,17,4,4,9,9,9,10,10,12,14,14,14,12,12,12,12,12,14,14,10,10,10,10,14,9,9,9,10,14,14,14,13,13,9,9,9,9,9,9,1,5,8,7,11,11,1,3,3,3,5,3,3,4,8,9,10,14,14,12,12,12,12,14,14,10,10,10,10,14,9,9,9,10,14,14,14,13,13,9,9,9,9,9,7,4,4,4,4,4,4,4,4,4,7,4,9,12,6,14,4,12,7,2,2,1,2,7,6,4,4,4,6,8,8,7,4,5,6,3,3,3,3,4,16,8,5,4,3,3,3,5,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11,12,7,7,13,9,10,17,12,8,9,7,8,5,12,10,13,14,5,5,5,13,5,5,5,3,3,3,5,16,5,5,5,5,7,12,14,8,12,8,10,12,9,11,7,9,7,10,7,13,9,7,12,8,17,7,7,16,10,13,13,8,10,10,14,17,7,16,16,15,8,10,10,12,17,17,7,17,14,7,10,17,8,7,7,7,8,15,15,7,14,10,10,10,11,11,7,7,13,8,10,7,16,7,8,7,14,17,12,10,11,21,8,9,7,13,9,8,13,6,12,7,6,13,10,10,10,8,18,9,17,13,10,12,6,13,6,11,8,13,10,13,18,13,11,13,8,16,7,10,8,16,12,10,8,8,14,11,8,15,8,8,7,7,12,7,8,9,14,15,8,9,10,9,15,7,8,8,12,13,9,10,15,13,7,10,10,20,7,6,9,6,6,14,11,14,11,12,9,10,16,16,12,7,11,28,8,11,10,7,21,8,7,9,4,4,4,17,7,8,6,9,6,6,13,6,6,6,6,18,20,14,8,11,12,9,10,13,15,15,19,8,9,12,7,10,16,12,9,9,9,14,12,11,9,12,11,18,9,9,9,10,7,7,16,8,9,7,13,12,10,14,18,7,8,11,7,7,8,8,13,7,7,7,11,15,13,11,7,8,15,11,7,8,18,14,13,18,15,10,12,12,9,7,11,11,8,7,10,8,14,12,10,18,7,10,9,7,8,13,10,14,10,8,8,23,7,7,11,12,12,17,7,7,11,11,17,16,16,7,8,11,14,14,8,10,7,7,16,16,13,9,11,9,15,15,11,11,7,7,14,7,9,7,7,16,10,13,10,11,14,7,11,10,11,7,11,10,11,15,11,15,10,12,10,14,13,11,11,12,13,10,7,13,10,16,12,21,9,10,10,7,11,14,17,7,7,8,11,12,8,15,14,14,8,17,12,10,10,7,9,11,7,10,7,11,18,7,11,7,12,11,8,8,14,12,7,8,15,3,7,7,5,2,9,2,2,2,2,2,2,2,3,3,3,3,3,3,3,2,5,3,3,3,3,3,3,4,4,3,3,3,3,3,3,5,11,6,4,7,10,7,7,11,1,10,2,2,3,3,3,3,3,3,3,3,5,7,3,5,6,3,3,5,2,2,5,3,4,13,11,3,3,6,3,5,14,2,2,3,8,2,2,12,5,18,5,3,3,3,16,5,5,5,10,7,13,12,13,9,12,14,19,9,9,21,9,9,10,6,9,6,15,10,6,12,8,6,10,15,4,4,6,6,9,9,12,16,14,23,7,7,7,14,9,7,7,11,14,10,7,10,10,10,12,6,11,10,13,11,15,11,7,12,10,3,7,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,4,3,7,2,5,5,3,3,5,5,5,5,7,6,6,6,4,4,4,4,4,4,6,6,6,6,6,7,10,2,2,2,5,5,5,5,3,3,3,3,3,5,5,10,9,11,8,7,12,8,9,7,6,13,11,6,13,7,9,9,4,4,4,4,4,6,10,7,8,13,8,8,9,14,7,8,10,7,7,7,9,6,9,7,2,12,5,3,3,13,4,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,4,5,5,5,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,8,4,4,4,4,4,4,4,4,4,4,4,4,9,3,3,3,3,3,3,3,3,3,3,4,2,2,2,5,3,3,3,3,3,3,3,3,4,4,1,7,6,4,12,3,3,3,3,3,8,7,3,3,3,3,3,3,4,4,11,14,2,8,3,5,5,8,10,8,6,4,7,17,7,4,5,2,6,3,2,2,12,5,5,3,15,13,8,11,2,2,3,3,3,3,3,3,3,3,4,4,5,3,3,3,3,4,18,2,12,5,3,3,3,3,3,5,16,8,8,9,6,6,4,4,4,4,31,6,6,10,11,21,10,9,7,10,7,7,2,4,4,4,4,6,5,3,3,4,3,3,3,3,3,3,3,3,3,6,6,6,2,2,2,5,3,3,3,7,7,4,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,8,2,3,3,3,3,3,5,9,11,3,3,3,3,4,4,3,3,3,3,3,5,10,9,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,11,10,10,10,10,10,11,10,11,10,11,10,9,9,11,3,3,3,3,3,3,5,3,7,8,8,7,6,6,11,4,4,4,7,8,9,9,2,3,7,4,4,2,5,5,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,2,2,5,5,5,5,5,3,3,5,5,5,7,7,6,6,6,4,4,4,4,4,4,4,4,4,4,6,6,8,8,1,2,2,2,2,2,2,3,3,3,3,3,3,3,4,4,6,9,12,3,7,10,7,2,2,3,3,3,3,3,4,3,3,2,2,2,2,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,5,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,5,5,8,8,6,6,8,6,7,4,4,4,4,4,4,6,7,5,5,20,19,8,10,9,7,10,6,8,11,6,6,6,6,13,12,8,6,7,14,11,9,2,5,3,6,2,3,2,2,2,2,2,2,2,5,4,3,7,6,4,7,4,3,6,4,7,2,7,7,7,5,5,5,5,3,3,3,3,3,3,3,3,3,5,9,10,10,11,7,8,20,7,8,9,8,12,6,6,6,8,9,8,12,6,6,8,13,10,12,6,6,7,7,9,6,4,4,4,4,4,4,10,6,6,6,7,14,11,10,7,8,10,8,11,14,11,11,9,7,9,8,11,9,17,10,9,2,2,2,9,3,3,3,3,15,14,9,5,5,2,8,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,15,12,22,19,17,18,18,19,21,7,16,16,5,5,5,5,5,5,5,5,5,5,5,7,5,5,5,5,5,5,5,5,5,5,5,9,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,5,7,16,11,11,7,7,7,7,17,7,8,12,15,9,19,7,19,8,21,11,12,19,14,22,7,7,7,7,7,7,7,7,7,7,7,16,16,19,24,12,7,14,7,12,7,8,10,10,13,7,12,12,7,7,10,18,15,12,16,7,14,12,17,10,16,17,12,17,25,7,7,7,13,6,9,6,9,18,6,6,11,20,10,6,6,6,6,6,6,17,6,6,6,15,6,6,6,6,6,8,14,11,12,11,15,13,19,17,21,7,18,8,13,13,8,12,8,6,6,13,6,15,15,16,6,6,16,6,6,6,14,6,18,6,6,6,17,18,9,13,15,8,19,8,15,15,18,14,16,4,4,4,4,4,4,4,4,4,4,4,4,6,11,10,11,6,21,23,12,17,12,11,14,13,22,15,15,11,12,14,12,7,12,8,12,14,12,18,10,8,16,19,17,12,14,15,8,19,17,12,13,13,15,18,13,23,24,23,21,17,24,8,21,8,14,14,16,20,14,8,8,15,20,8,19,21,9,8,13,12,13,15,11,8,11,9,9,8,11,8,21,14,21,15,15,13,7,19,7,7,7,7,7,7,16,12,17,18,7,7,11,11,7,9,9,2,2,3,3,2,2,2,3,3,3,3,3,3,3,3,3,3,4,5,5,5,5,5,5,5,5,3,3,10,10,7,9,7,7,7,6,8,6,6,6,6,6,6,6,7,6,8,6,6,9,7,7,7,4,4,4,4,4,4,4,4,8,9,8,7,8,7,8,10,7,5,5,5,5,5,5,3,9,7,7,8,6,6,6,6,6,6,6,6,9,6,6,9,11,13,7,8,9,9,5,5,5,7,8,6,6,6,6,6,6,6,7,8,9,7,10,9,10,7,8,5,5,5,5,5,5,7,7,9,8,7,7,6,6,6,6,6,6,10,6,6,6,6,6,6,6,6,6,6,6,9,10,4,4,4,4,8,7,7,10,10,9,8,8,15,9,8,8,8,8,8,9,10,9,10,7,8,13,5,5,5,5,5,3,3,7,7,8,6,6,6,4,4,11,9,7,8,9,10,7,5,5,5,5,5,3,3,7,6,6,13,7,9,8,7,5,5,5,5,5,5,5,5,3,3,3,3,7,8,7,8,13,6,6,6,6,6,6,6,6,6,6,6,6,6,6,8,8,6,6,6,6,7,6,7,6,6,9,7,4,4,4,4,4,4,4,7,8,7,8,9,8,8,8,7,10,7,8,5,5,5,5,5,5,5,5,3,7,7,7,7,9,7,10,9,6,6,6,6,6,8,8,6,6,6,7,6,6,6,9,9,4,4,13,7,10,9,9,12,7,8,8,10,8,8,8,8,8,8,5,5,5,5,3,7,7,11,7,9,8,8,6,6,10,6,8,8,8,6,7,6,6,12,4,4,4,4,4,4,4,4,4,9,8,8,16,8,9,8,7,5,5,5,5,5,3,3,7,7,7,10,15,8,9,8,9,9,6,6,6,6,6,6,7,4,8,7,8,8,7,8,11,8,5,5,5,5,5,3,7,7,6,11,16,7,6,4,4,4,4,9,9,8,8,8,13,12,8,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,11,7,8,8,9,13,7,7,7,9,8,8,9,12,7,12,7,12,8,7,10,12,9,9,6,6,8,8,6,6,6,6,6,6,6,9,8,9,11,8,6,6,6,6,6,12,7,6,6,6,9,7,7,6,6,6,6,6,11,9,6,6,6,6,6,7,9,4,4,4,4,4,4,4,4,9,9,9,9,7,7,7,7,7,11,7,7,8,8,8,8,8,8,9,8,9,9,7,7,11,11,7,12,8,8,8,8,8,7,8,8,8,8,8,13,12,8,8,8,8,7,7,7,9,5,5,5,5,5,5,5,3,3,7,7,11,7,8,8,8,6,6,6,6,6,6,6,6,6,6,6,10,11,6,7,9,4,4,4,4,4,4,9,9,8,9,8,8,8,7,7,5,5,5,5,5,5,5,5,5,5,3,3,11,7,7,7,9,6,6,11,8,10,6,6,6,12,8,8,7,6,6,8,7,4,4,4,4,4,4,4,4,9,10,9,9,8,10,9,11,8,5,5,5,7,6,6,8,7,4,4,4,4,8,7,7,8,7,8,8,5,5,5,5,7,7,8,8,8,6,6,6,6,6,10,8,9,13,6,7,6,6,8,7,8,4,4,4,4,11,8,8,8,10,5,5,8,7,8,13,8,7,6,8,6,9,7,8,7,5,5,5,5,5,5,3,3,7,8,9,6,4,8,10,10,8,12,9,13,2,7,5,5,5,5,5,7,7,10,6,6,6,6,6,6,6,8,4,4,9,8,8,8,14,8,8,8,9,8,5,5,5,5,5,3,3,9,6,6,6,6,10,12,6,6,6,6,6,6,6,4,4,4,4,11,8,7,8,8,8,5,5,3,3,3,3,7,7,6,8,6,8,11,7,6,6,6,7,4,8,11,9,10,5,5,5,3,3,3,7,7,8,9,8,15,9,6,6,6,6,6,6,11,11,4,4,4,4,4,7,9,9,10,8,7,5,5,5,5,5,5,3,3,8,6,6,6,6,6,6,6,6,6,9,7,4,4,4,4,4,9,9,8,8,10,13,5,5,5,3,17,7,7,7,7,7,8,6,8,13,6,6,6,6,6,6,6,6,4,4,4,9,10,8,8,8,5,5,5,5,3,7,7,7,8,8,6,6,6,8,8,8,9,10,8,4,8,10,9,8,8,8,9,13,10,5,5,5,5,5,5,5,5,5,5,3,3,7,8,9,9,7,7,7,10,9,9,8,9,8,8,8,6,6,6,6,6,6,6,6,6,6,6,6,6,8,12,6,6,6,6,6,6,6,6,6,12,4,4,4,4,4,4,4,4,4,4,4,11,8,8,9,9,10,8,9,7,7,5,5,5,5,5,5,3,7,8,7,6,6,8,6,6,10,4,7,8,9,12,8,7,7,5,5,5,5,5,5,3,3,7,14,7,9,8,8,6,6,8,12,12,6,6,7,7,10,4,4,4,4,4,9,9,14,9,13,8,7,5,5,5,6,6,6,7,4,8,7,5,5,5,5,5,5,5,5,3,3,7,7,7,8,6,6,6,6,6,6,12,6,6,6,6,4,4,9,9,8,8,11,7,7,7,5,5,5,3,9,8,6,6,7,4,4,4,4,4,4,8,8,11,5,5,5,7,7,7,9,6,6,6,6,6,6,9,8,4,4,4,4,7,12,9,8,8,8,7,10,10,5,5,5,5,5,5,5,3,11,14,8,7,8,8,6,6,6,6,6,8,7,6,6,6,7,6,8,9,4,4,4,7,8,9,7,9,7,7,9,8,5,5,5,5,5,5,5,5,5,11,3,9,7,7,12,14,8,6,6,12,11,8,6,6,6,6,6,6,6,6,6,15,7,4,4,4,16,9,9,9,8,9,9,9,9,9,8,8,8,13,11,8,5,5,5,5,3,7,6,6,8,8,8,6,6,7,10,7,4,4,4,4,9,7,8,7,7,7,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,3,7,7,7,9,6,6,6,6,6,8,8,7,7,9,6,6,6,7,6,6,6,6,6,15,4,4,4,4,4,8,8,7,8,12,9,8,8,8,8,8,9,8,8,10,8,8,8,8,16,9,10,2,5,5,5,5,5,5,5,9,7,6,8,9,4,4,4,4,4,7,8,8,8,9,8,11,10,5,5,5,5,3,7,8,6,6,6,6,6,8,6,6,6,6,4,12,10,12,7,7,7,7,7,7,7,5,5,5,5,3,3,7,7,10,8,9,7,6,10,7,6,6,4,4,8,9,7,9,9,9,9,8,8,8,8,10,5,5,5,5,5,5,8,7,6,6,6,10,6,7,10,7,4,4,4,4,4,4,4,12,9,10,7,7,10,8,10,5,12,9,6,6,6,6,6,7,6,4,4,4,10,9,9,8,7,7,5,5,5,5,5,5,3,3,13,7,7,9,7,7,7,8,9,9,7,8,6,6,6,6,6,6,6,6,6,6,6,6,6,7,13,9,15,15,4,4,4,4,4,10,10,9,8,9,8,8,9,7,8,7,8,5,5,7,6,6,6,4,4,4,7,8,11,8,5,5,5,5,5,5,5,7,6,6,6,6,6,6,9,11,10,7,4,4,4,9,8,8,5,5,5,5,5,9,9,6,6,6,6,6,6,6,9,9,4,4,4,4,8,8,8,9,9,8,8,8,13,2,4,2,7,5,5,5,5,5,5,9,9,6,6,6,6,10,8,8,8,6,6,6,4,4,9,8,10,8,9,8,8,8,9,8,8,5,3,3,3,11,6,6,6,7,6,6,6,4,4,9,8,5,5,5,5,5,3,11,8,6,6,6,6,6,9,7,4,4,14,10,9,8,12,8,8,8,11,15,8,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,10,10,7,7,3,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,5,5,5,5,5,5,5,5,5,5,3,3,3,7,11,7,7,11,11,7,8,9,10,7,7,9,9,9,9,7,7,10,8,13,8,8,8,8,11,10,6,6,8,10,11,14,14,6,6,6,6,6,6,9,11,7,7,6,8,12,11,11,6,6,10,6,6,6,6,6,10,7,7,6,6,11,6,6,6,11,8,9,7,6,10,11,9,10,11,7,11,8,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,8,6,6,8,9,10,9,6,6,6,10,6,6,6,6,11,10,11,10,9,8,7,7,7,7,11,14,8,10,9,9,8,8,7,11,8,8,8,11,11,10,10,9,10,8,11,10,8,11,9,12,8,10,8,11,8,9,9,11,11,10,11,13,8,7,8,8,9,7,8,8,8,8,7,8,2,2,2,2,2,2,2,4,4,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,4,2,3,3,3,3,3,3,3,3,8,6,4,4,4,11,7,11,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,5,5,5,5,3,3,3,3,8,7,7,8,8,4,8,7,7,7,9,7,8,9,8,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,6,3,3,3,3,3,3,3,3,4,2,2,3,3,3,3,3,3,4,5,5,3,3,8,8,6,9,4,4,10,7,3,3,3,2,5,3,3,3,3,3,3,3,3,3,3,3,3,4,3,2,2,2,3,3,3,3,3,4,10,2,3,3,3,3,3,3,3,4,2,3,3,3,3,3,3,3,3,2,2,3,3,3,5,2,4,2,6,2,2,9,5,5,3,3,3,3,3,3,3,5,5,5,9,8,7,9,6,6,11,4,4,4,4,4,4,4,4,6,6,7,7,11,8,8,6,5,11,2,3,3,3,3,3,3,3,3,3,3,3,3,3,4,2,2,3,3,3,3,3,3,6,4,4,4,4,3,3,3,3,5,7,2,3,3,3,3,3,8,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,6,4,4,4,4,2,2,3,3,3,3,3,3,3,4,3,3,3,3,3,3,3,3,3,3,3,3,4,2,2,3,3,3,3,3,3,2,3,3,3,3,3,6,3,3,8,10,3,4,4,1,1,1,1,1,1,1,8,9,10,7,7,1,14,18,13,18,13,10,10,16,13,18,16,13,16,18,13,22,16,16,16,14,21,16,9,14,16,9,9,14,10,10,14,12,14,19,12,11,18,13,17,15,15,15,15,16,14,13,19,18,15,19,18,12,18,12,11,20,14,15,10,17,17,16,19,20,21,15,13,16,15,15,15,1,1,3,8,7,7,8,8,8,1,6,1,1,6,3,3,4,7,3,3,5,5,4,4,4,4,4,2,7,7,8,12,3,4,5,1,3,4,4,10,4,3,3,3,8,7,7,2,2,2,2,2,2,2,2,2,12,9,20,7,5,5,5,9,13,5,5,5,5,5,3,3,3,16,5,5,5,13,7,8,8,11,8,7,9,7,11,12,9,9,8,8,11,10,14,7,12,10,11,13,7,9,11,17,17,14,13,7,8,7,10,10,7,16,13,7,8,17,12,9,8,6,7,10,6,6,12,6,8,10,8,8,8,6,8,6,14,6,6,6,13,6,10,6,6,7,14,8,6,6,10,11,10,9,9,7,7,6,6,6,9,9,7,9,10,9,13,12,4,4,4,4,4,4,4,4,4,4,6,6,6,8,8,6,8,9,10,9,7,10,10,8,7,8,7,10,12,9,8,15,8,7,8,8,7,7,15,13,7,10,9,14,18,16,7,24,7,8,10,11,16,8,14,7,9,9,9,13,19,14,15,14,11,7,13,9,10,7,13,9,10,11,12,8,9,2,3,5,8,7,4,4,15,10,5,3,3,3,3,3,5,4,4,4,2,2,2,2,2,1,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,2,2,2,3,3,3,3,3,3,3,3,3,3,4,2,12,5,3,8,10,15,6,7,2,3,2,5,5,12,2,5,5,5,5,2,2,5,5,12,9,5,2,2,9,5,5,12,12,5,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,9,12,5,8,8,9,5,5,5,8,19,7,16,15,14,9,9,9,9,7,11,11,11,7,14,10,10,5,5,5,5,5,5,5,5,5,15,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,9,9,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,14,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,15,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,5,5,5,5,5,5,5,12,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,9,9,12,9,9,12,12,12,15,7,11,7,14,11,18,13,8,18,15,18,12,14,12,8,8,8,8,9,9,9,12,7,10,10,8,8,12,12,12,7,12,12,9,7,7,7,7,7,8,15,12,9,10,10,7,10,10,13,11,10,9,22,11,9,8,8,8,8,8,13,18,13,9,15,19,9,7,7,10,7,7,7,11,8,13,17,7,7,10,10,10,7,20,16,7,7,7,7,7,7,11,21,12,12,13,11,14,16,8,8,13,11,7,7,13,7,7,14,15,15,6,6,6,6,6,6,6,6,6,6,13,10,18,6,6,6,6,6,6,6,6,6,11,8,8,12,12,11,11,8,12,9,9,9,13,13,9,9,9,9,9,9,6,10,12,6,6,6,6,17,11,7,7,7,7,14,14,12,6,7,7,6,6,15,10,13,10,6,8,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,13,9,9,15,13,6,12,12,6,19,11,10,7,7,16,8,19,17,9,9,9,9,9,6,6,6,10,8,16,8,6,6,9,6,6,6,6,6,6,6,6,8,8,8,6,7,6,6,6,6,6,6,6,6,6,6,6,14,6,6,6,6,20,6,9,6,14,9,9,9,6,9,8,8,12,9,8,8,8,8,7,8,12,7,8,8,8,6,8,6,6,6,6,6,6,6,9,8,8,6,6,13,9,12,13,12,14,13,12,11,11,6,8,8,8,6,13,12,11,11,12,6,11,12,11,13,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,15,6,6,6,6,6,6,6,13,6,6,6,6,6,6,6,6,6,6,6,6,6,8,8,8,8,6,18,6,12,13,13,13,9,10,15,9,12,6,6,6,6,6,6,6,6,9,15,10,9,10,13,9,19,8,18,17,10,10,8,8,6,6,6,6,6,6,10,14,8,16,16,9,8,15,8,8,10,12,14,7,7,8,8,7,7,7,7,8,13,13,11,9,9,9,12,10,17,8,11,9,7,7,14,8,14,14,7,7,7,7,7,7,14,7,7,7,7,7,10,10,8,14,7,7,7,7,8,8,8,8,8,17,9,7,15,7,8,12,7,9,14,7,7,7,9,13,8,14,7,16,18,13,15,14,12,13,10,15,9,7,7,7,10,13,15,15,9,9,9,9,19,11,7,11,11,13,8,8,8,8,7,12,19,17,9,9,13,7,7,7,9,7,7,7,12,13,15,10,8,8,14,15,12,13,13,8,12,14,7,11,7,14,15,13,12,8,8,8,8,11,13,15,15,8,13,12,8,8,8,13,10,16,14,11,8,8,12,12,9,15,15,12,12,13,8,8,9,12,13,9,8,8,8,8,8,8,8,8,8,8,8,11,12,11,7,14,7,13,13,13,12,18,16,7,12,11,10,10,15,9,9,9,21,7,7,7,11,16,8,8,11,11,7,7,7,7,7,19,7,7,7,7,7,7,7,7,7,12,8,9,12,14,11,9,9,9,22,12,3,3,4,8,8,15,4,2,2,5,5,3,3,3,3,3,3,6,6,4,4,4,12,7,10,2,3,3,3,3,3,3,3,6,7,3,7,5,14,4,4,7,8,10,4,1,3,3,6,2,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,4,2,2,5,3,4,2,2,2,2,2,2,11,5,5,5,11,5,5,3,5,5,5,5,11,14,13,9,11,9,12,8,11,11,8,11,16,9,9,7,10,9,12,8,15,6,7,6,6,13,10,8,11,8,6,6,6,12,16,6,11,7,8,9,18,6,6,9,4,4,6,13,6,6,6,6,8,8,9,16,7,7,14,7,8,8,8,7,7,7,7,7,7,15,13,7,10,7,7,10,12,16,15,7,9,9,14,11,11,10,9,10,8,12,7,8,7,7,10,12,7,12,8,7,2,3,3,3,3,3,3,3,3,3,3,5,3,3,5,5,5,10,4,8,7,10,3,3,3,3,3,3,3,3,3,3,1,3,3,3,3,3,3,3,7,4,5,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,5,5,5,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,5,6,6,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,9,8,2,2,2,8,12,7,7,5,5,5,5,5,5,5,5,5,5,5,5,8,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,5,5,5,7,11,9,8,8,8,7,8,9,7,7,9,7,7,7,10,7,7,10,9,10,6,6,6,6,6,6,15,7,8,9,9,8,6,6,10,9,6,8,13,9,7,6,6,6,6,6,6,12,6,6,7,6,7,6,6,6,10,10,7,6,6,6,4,4,4,4,4,4,4,4,4,4,4,4,4,4,6,14,6,6,7,7,9,6,6,6,6,9,9,8,9,10,9,8,9,12,7,7,7,8,7,10,12,11,9,10,7,7,7,9,10,10,8,12,9,7,7,9,8,8,8,10,7,7,8,9,9,7,7,7,8,2,4,6,3,4,2,3,3,3,3,2,3,3,3,3,3,3,3,3,4,4,4,4,5,5,3,3,3,3,3,3,3,3,5,8,6,4,7,3,3,3,3,3,3,3,12,3,3,3,3,3,3,4,4,2,3,5,3,4,7,3,3,3,3,3,3,4,3,3,3,3,3,3,3,4,3,3,6,4,3,4,2,2,2,5,3,3,3,3,3,5,4,4,4,4,7,6,8,9,2,2,2,2,3,3,3,5,7,2,3,3,8,7,7,2,2,8,5,3,3,3,3,3,3,3,3,3,3,3,3,3,5,5,8,8,7,7,6,10,6,9,7,11,4,6,8,8,7,8,4,5,5,5,5,3,3,11,8,9,6,6,8,7,4,4,7,8,7,2,2,3,3,3,3,4,3,3,3,3,3,3,3,3,7,2,2,5,3,3,2,3,3,3,3,3,3,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,12,5,5,3,3,3,5,10,12,6,15,4,6,6,7,14,9,3,3,3,3,3,8,2,2,3,5,5,3,3,3,3,3,3,8,8,8,7,5,8,4,6,11,2,2,6,7,3,3,2,9,8,5,5,3,3,3,5,5,7,7,6,6,10,6,8,6,8,9,7,4,4,4,4,7,6,6,7,7,10,9,8,11,8,3,3,3,3,3,4,4,2,3,3,3,3,3,7,6,2,5,6,7,6,4,8,9,11,2,2,3,3,3,3,3,3,3,2,2,5,3,3,3,3,3,9,9,6,4,8,7,7,5,9,8,6,2,8,7,8,5,5,5,5,5,3,3,3,16,8,7,7,7,8,7,7,7,7,9,6,9,6,10,7,7,7,6,10,8,9,11,11,8,4,4,10,8,8,6,9,6,11,8,8,8,15,7,8,9,5,3,3,3,3,3,5,11,2,2,3,8,9,10,3,2,2,2,2,2,2,3,6,4,2,2,3,3,3,3,3,3,3,3,3,3,4,4,2,3,3,3,3,3,3,3,11,5,3,3,3,3,3,3,3,3,6,7,4,4,2,3,3,3,3,3,3,3,3,12,7,4,12,4,6,5,4,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,2,3,3,3,3,3,3,3,3,4,4,11,10,6,4,6,10,8,3,3,3,3,3,3,3,3,5,4,4,4,2,2,2,2,2,2,2,2,5,3,4,4,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,10,5,5,5,5,5,5,3,3,3,3,3,3,3,3,7,8,8,7,13,12,10,10,8,8,7,7,9,12,11,6,6,8,8,9,7,7,7,10,15,10,4,4,4,4,4,11,8,8,9,7,9,14,14,12,2,2,2,2,2,2,2,3,3,3,3,3,12,5,5,5,11,10,7,9,3,8,7,3,15,13,11,4,4,2,2,2,19,7,5,5,3,3,3,3,3,3,3,5,22,18,6,14,17,4,4,19,16,18,2,3,3,7,2,3,2,3,3,6,4,2,3,3,2,5,3,3,3,3,3,3,3,9,9,2,3,2,2,2,3,3,3,5,7,14,7,7,12,9,13,6,11,6,10,9,7,7,8,12,12,8,8,8,10,7,7,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,5,8,10,7,8,11,8,12,9,4,14,7,7,9,13,2,3,3,3,3,3,3,2,3,3,3,1,2,2,3,3,3,3,3,3,5,2,2,5,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,8,4,4,4,3,2,3,3,3,3,5,2,2,2,2,5,5,5,5,3,3,3,3,3,3,3,3,3,7,7,7,7,7,8,8,8,8,8,12,9,8,8,9,8,6,17,6,6,6,8,8,6,6,6,6,6,6,6,6,6,6,6,7,4,4,8,8,9,9,9,7,7,7,7,7,7,7,9,9,9,7,8,8,8,10,7,13,10,8,9,3,3,5,13,3,3,3,3,3,7,7,6,6,10,13,11,11,8,8,9,8,9,9,10,10,10,11,10,10,13,13,16,15,11,12,9,9,10,9,11,10,9,9,14,7,8,3,10,7,7,3,2,2,2,5,3,3,3,3,3,3,3,3,3,3,3,3,6,7,2,2,3,3,3,3,3,3,3,3,4,11,6,7,4,6,2,2,3,3,3,1,3,3,3,3,3,3,6,4,4,2,2,2,3,3,3,3,4,4,6,6,6,6,5,4,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,9,11,6,10,9,12,7,7,11,14,9,7,12,3,3,7,12,11,12,7,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,9,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,3,3,3,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,11,5,5,5,5,5,5,5,5,11,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,5,5,5,5,5,5,5,3,3,3,5,5,5,5,5,5,5,5,5,5,5,3,3,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,5,5,5,5,5,5,5,5,5,5,5,5,5,3,10,3,3,3,11,3,5,9,11,8,12,14,9,7,8,7,7,11,11,7,7,10,9,8,10,9,7,7,7,7,7,7,8,8,7,11,8,8,8,7,7,10,8,7,13,12,7,17,10,8,8,11,7,11,11,14,7,11,7,8,6,9,20,8,7,9,16,7,10,6,11,10,8,9,7,16,11,11,9,8,9,8,8,8,11,8,15,8,8,9,7,8,8,11,10,7,5,7,10,10,15,7,7,7,8,7,8,8,10,11,10,10,10,11,11,7,8,6,8,8,8,10,6,8,6,6,7,8,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,16,6,15,6,7,11,11,7,9,10,11,13,10,6,16,8,10,12,11,6,6,6,6,6,6,6,10,6,10,7,7,7,7,11,7,11,6,6,6,6,6,6,17,7,7,6,6,12,22,6,6,6,6,6,8,6,6,6,6,7,6,6,5,6,6,8,11,6,9,14,11,9,11,7,7,8,6,6,6,8,10,9,6,6,6,6,9,7,6,6,6,6,6,15,6,4,4,4,6,4,17,8,11,6,6,9,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,6,6,6,6,10,6,10,6,6,6,6,12,8,6,6,6,6,6,6,6,6,6,9,6,6,6,6,18,6,6,6,8,9,10,7,8,9,10,11,7,13,6,8,8,6,6,14,7,7,7,7,10,7,14,9,6,6,9,15,9,7,14,6,11,14,13,7,12,8,7,7,7,7,7,12,7,10,9,16,6,8,6,5,17,6,8,10,4,6,4,10,15,17,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,8,4,4,11,7,4,4,7,7,7,6,6,6,6,6,6,6,6,6,6,6,6,19,17,6,10,11,6,6,6,6,18,6,6,11,4,4,4,5,6,6,6,9,5,6,4,6,6,4,6,6,6,6,10,6,6,4,6,6,10,6,10,6,6,6,6,11,6,6,10,6,6,8,6,6,6,8,6,11,4,11,9,10,9,11,4,8,4,11,12,7,9,8,6,7,7,8,12,12,11,13,10,11,7,7,7,9,7,11,10,7,7,7,16,11,10,11,17,9,9,8,8,7,7,7,9,7,7,7,14,7,13,9,11,10,14,10,10,12,11,10,7,10,5,14,8,8,8,9,7,8,7,7,9,8,7,8,7,7,7,7,7,7,7,11,8,10,8,7,8,14,11,8,9,9,9,8,24,10,10,12,7,7,15,11,8,8,12,11,8,9,9,7,8,9,10,11,10,11,7,12,7,7,11,9,8,14,13,12,8,11,10,8,8,7,7,14,9,10,8,9,11,7,14,8,8,13,8,8,12,7,10,14,14,11,9,10,9,9,7,7,11,11,13,9,13,5,5,5,7,9,5,11,12,14,8,7,7,11,10,9,7,8,8,7,10,11,11,5,5,7,5,5,5,7,7,15,7,7,8,7,15,12,12,10,7,8,7,11,7,7,7,23,11,8,8,11,10,7,8,11,7,19,7,7,6,9,9,9,11,3,4,7,8,6,6,4,10,8,2,2]);\nexport const edgeChild = /*#__PURE__*/ new Uint16Array([0,0,0,1,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,12,1,1,1,1,1,17,1,1,1,12,1,12,1,12,13,1,1,1,1,12,1,12,1,1,1,1,1,14,21,1,1,1,1,1,1,1,19,12,1,1,1,1,1,1,1,20,1,1,1,16,18,1,1,15,1,1,1,1,12,1,1,1,1,1,1,1,22,1,1,1,1,12,1,1,1,1,1,1,1,1,12,12,12,12,12,12,12,12,12,12,12,12,1,24,25,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,1,1,12,12,12,12,1,32,0,0,0,1,1,1,1,35,34,1,1,1,1,1,33,1,1,1,1,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,38,0,0,0,0,39,40,0,0,0,0,12,1,1,12,1,1,1,1,43,44,44,44,43,44,43,43,45,44,43,44,43,43,43,43,43,43,45,43,43,43,43,43,43,44,46,46,44,43,43,43,43,43,12,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,49,51,49,49,49,51,49,50,49,52,49,50,50,49,49,49,50,52,50,52,49,50,50,12,54,54,53,55,50,52,49,49,47,48,56,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,59,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,66,1,12,1,1,65,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,77,0,0,0,0,0,0,0,0,0,0,0,0,0,75,78,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,76,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,12,1,1,1,1,88,1,90,1,1,1,1,1,1,1,1,93,1,1,1,1,1,1,1,1,1,1,1,1,0,1,96,96,1,1,12,1,99,1,1,1,1,1,1,1,97,1,98,1,100,1,1,1,1,1,101,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,109,110,1,1,1,1,1,1,112,112,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,120,121,1,1,1,1,1,1,1,1,1,1,1,1,1,121,1,1,1,1,1,1,1,1,1,1,121,1,1,1,1,1,1,1,1,1,125,122,124,119,1,123,1,1,113,1,1,1,1,116,1,126,1,1,1,1,1,1,118,1,107,1,108,1,12,127,105,1,111,1,1,1,1,1,106,114,1,12,12,12,117,115,1,1,1,1,1,1,0,0,0,0,1,12,12,1,1,1,1,1,12,133,1,1,1,1,1,1,1,1,1,1,1,12,135,1,1,1,1,1,1,1,1,136,137,12,12,134,132,44,44,139,49,49,138,141,140,1,1,0,0,0,0,0,0,0,0,0,0,0,0,144,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,142,0,0,0,0,1,0,143,131,1,0,1,1,12,12,1,1,1,1,1,0,0,0,0,0,0,0,1,147,146,20,1,1,12,12,1,20,12,12,1,1,1,1,1,133,1,1,151,1,1,1,1,152,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,1,1,135,1,1,151,1,1,1,1,152,1,1,133,1,1,1,151,1,1,1,1,152,1,1,133,1,1,1,1,1,1,1,1,133,1,1,1,1,1,1,1,1,1,1,1,159,1,1,1,151,1,1,1,1,1,152,1,1,159,1,1,1,1,1,1,1,1,1,1,133,1,1,1,1,151,1,1,1,1,152,1,1,1,133,1,1,151,1,1,1,1,163,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,1,166,1,1,159,1,1,1,1,1,151,1,1,1,1,1,152,1,1,159,1,1,1,1,1,151,1,1,1,1,1,152,1,153,157,157,12,1,12,165,1,1,1,1,1,157,157,157,153,1,1,1,156,157,160,164,1,1,1,1,156,156,1,1,155,153,153,156,169,155,169,1,1,167,1,155,154,156,1,1,1,1,156,1,158,1,1,1,12,1,161,1,161,1,1,1,161,160,162,168,155,153,1,1,1,1,1,1,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,172,171,172,171,171,171,171,173,173,171,172,171,172,171,171,12,1,12,12,12,12,1,12,12,12,12,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,12,1,1,1,1,1,1,12,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,195,1,1,1,1,12,201,202,203,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,12,1,1,1,1,1,1,1,1,150,1,1,1,1,1,1,1,1,1,1,1,198,1,1,1,185,1,1,1,1,209,1,1,206,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,12,1,1,1,1,1,12,1,1,1,1,1,1,1,1,176,192,1,1,1,188,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,183,1,1,1,1,1,1,1,193,1,1,1,1,197,1,1,1,1,170,1,1,191,1,1,1,194,1,1,1,12,1,1,1,1,1,1,1,1,1,1,1,1,181,1,12,1,1,12,1,1,1,1,184,1,1,1,190,1,12,1,1,1,1,1,1,1,1,1,1,1,1,1,1,12,1,1,210,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,196,1,1,1,1,1,12,1,1,1,1,1,1,1,1,175,12,1,1,1,178,12,1,1,1,1,1,1,1,200,1,1,1,1,1,1,1,1,1,1,177,1,1,1,1,1,1,1,205,1,1,1,182,1,1,1,189,1,12,1,186,12,1,1,1,1,1,1,1,1,1,1,193,1,1,1,1,180,1,1,1,1,1,1,1,1,1,1,1,1,1,1,174,1,1,1,1,1,1,1,1,1,1,187,1,1,1,1,1,1,1,1,1,1,1,207,1,1,1,1,1,1,1,1,1,1,12,1,208,1,1,12,1,1,1,1,179,1,1,1,187,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,12,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,12,1,1,1,199,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,12,12,1,1,1,1,1,1,1,1,1,204,1,1,12,1,1,1,12,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,1,0,1,1,1,1,1,1,1,1,1,1,220,0,0,0,0,0,221,0,0,0,0,0,0,1,12,1,1,1,225,1,1,1,0,226,223,224,1,1,1,1,1,1,231,1,233,1,1,1,1,1,1,1,1,1,1,1,229,1,1,1,1,1,235,1,1,12,1,12,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,234,1,1,1,12,1,1,1,1,230,1,1,1,228,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,232,1,1,1,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,1,12,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,241,13,1,1,1,12,12,238,239,1,1,1,1,240,1,1,12,1,1,1,1,1,1,1,242,1,1,12,16,1,1,1,1,1,1,243,1,1,1,12,12,1,1,1,1,1,1,243,12,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,252,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,256,256,1,0,0,0,0,0,1,12,0,0,0,0,0,0,0,0,171,261,262,1,12,1,1,1,1,12,264,1,1,263,1,1,266,1,1,1,1,1,1,0,1,1,1,270,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,12,1,0,1,0,0,0,0,1,0,1,0,1,1,1,1,1,0,1,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,1,12,0,281,0,0,282,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,12,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,59,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,1,1,0,306,0,0,0,0,0,0,0,0,0,308,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,12,1,1,1,1,1,1,1,1,1,12,1,1,1,1,1,324,324,325,324,0,187,1,1,13,320,1,318,0,0,0,0,0,0,0,321,1,1,326,1,206,1,1,1,1,319,1,316,1,322,1,314,1,323,1,315,1,1,1,1,1,1,1,12,1,1,1,1,12,317,317,1,1,1,185,1,1,12,1,1,1,1,1,1,1,1,1,1,12,1,1,1,1,12,1,1,1,1,313,1,0,0,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,329,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,266,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,369,369,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,361,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,1,0,1,337,348,1,1,336,371,1,342,1,1,334,366,1,1,352,333,338,1,1,1,345,376,354,1,1,1,1,1,1,355,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,0,364,368,0,0,78,1,1,0,362,339,375,340,343,350,1,365,0,1,0,78,359,357,1,0,0,1,1,1,0,0,0,0,378,1,1,349,1,78,1,0,1,1,1,381,1,0,0,78,356,0,1,335,1,1,1,0,1,1,358,1,0,1,1,1,0,1,383,346,1,1,0,1,0,0,374,0,1,1,1,78,367,1,1,363,360,1,1,1,1,1,1,1,1,1,1,1,341,1,1,1,1,1,1,1,1,1,1,1,373,0,78,1,1,1,1,0,1,1,1,1,1,1,0,0,1,1,377,1,1,1,0,0,380,0,0,0,1,353,1,0,78,379,1,0,0,0,0,382,1,1,0,0,1,0,1,0,351,0,347,0,1,1,1,0,1,1,0,370,344,372,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,12,1,1,1,12,398,398,1,1,12,12,1,398,1,1,12,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,1,1,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,410,1,1,0,1,1,1,1,206,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,428,428,1,1,0,0,314,1,1,1,1,1,1,1,1,1,1,1,1,12,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,441,1,440,1,1,1,1,1,1,1,1,1,445,1,12,12,1,1,1,1,1,12,1,1,1,1,453,1,1,1,455,1,1,1,1,1,1,1,1,1,1,452,1,447,1,1,1,1,434,1,1,1,1,1,1,1,1,448,12,1,1,1,1,454,1,1,1,449,443,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,314,1,431,1,1,12,451,1,1,314,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,436,1,1,1,1,1,1,1,1,1,1,1,454,1,1,1,1,314,1,450,1,1,1,444,438,1,1,1,1,1,439,1,456,442,1,1,1,1,1,437,1,1,1,1,1,1,1,1,1,432,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,446,1,1,1,1,1,1,1,1,1,1,1,1,435,1,1,1,1,1,433,1,220,457,1,1,1,1,1,12,1,1,1,1,12,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,1,0,0,1,0,1,0,1,1,0,0,0,463,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,12,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,467,0,467,467,467,467,467,467,467,0,467,467,467,467,467,1,467,467,467,0,467,467,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,472,471,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,476,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,469,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,470,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,478,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,467,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,475,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,468,0,0,479,474,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,473,0,0,0,0,0,0,0,0,0,0,0,0,0,467,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,468,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,467,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,477,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,12,1,1,1,1,1,1,1,1,1,1,1,1,489,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,200,200,1,493,1,1,1,492,1,1,1,1,488,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,490,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,494,1,1,491,1,1,1,1,1,1,1,1,369,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,495,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,1,0,0,0,506,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,1,0,0,0,1,0,0,0,0,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,1,0,1,0,0,12,1,508,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,12,12,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,1,0,0,0,0,0,0,0,1,0,0,1,0,1,1,1,1,0,0,0,1,0,0,0,1,59,1,1,12,12,12,12,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,527,1,1,1,1,1,1,1,528,1,1,1,1,1,1,1,526,1,1,12,1,1,530,239,1,1,12,12,1,1,12,1,12,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,534,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,1,1,1,540,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,131,1,12,545,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,106,1,1,12,1,1,1,12,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,550,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,1,1,0,0,0,1,1,1,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,143,1,1,1,228,1,1,12,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,1,575,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,220,1,325,1,1,1,1,1,1,1,1,1,0,0,580,1,1,1,1,0,582,0,78,0,581,0,1,1,1,0,1,1,1,1,1,1,12,0,0,0,1,0,1,0,0,0,0,0,0,589,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,584,584,0,588,586,584,584,584,584,584,590,584,584,594,584,584,584,584,584,584,584,584,584,584,591,588,584,584,588,584,584,584,584,584,584,584,584,584,584,584,584,584,586,584,584,584,584,584,592,584,584,584,584,584,584,0,0,0,1,593,1,1,1,1,587,1,1,1,1,1,585,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,12,598,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,1,12,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,12,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,12,1,1,12,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,95,64,278,304,409,536,0,4,67,236,254,280,305,331,385,411,0,500,520,537,600,9,0,60,87,395,407,427,578,0,498,519,533,615,0,30,6,0,462,501,605,563,69,0,7,283,255,386,464,414,539,78,601,0,579,307,416,466,9,104,286,507,6,30,0,309,78,388,78,484,10,6,130,248,273,0,616,510,0,566,0,63,6,6,251,94,2,430,396,408,599,0,6,0,6,284,102,6,564,502,541,0,465,387,271,285,8,70,103,602,544,389,310,298,417,145,73,288,548,511,604,567,332,327,480,6,74,148,11,0,249,523,549,568,515,553,573,614,36,6,260,293,330,302,218,30,529,556,218,41,216,265,294,303,404,421,482,272,0,72,565,0,401,415,297,78,247,78,0,583,547,505,290,419,78,390,384,0,0,0,9,558,574,217,0,422,405,532,517,576,618,84,218,42,295,393,423,572,0,512,291,274,78,215,79,28,387,30,6,391,328,301,607,595,525,552,514,0,258,80,30,403,420,0,30,424,0,219,596,518,9,406,425,218,248,85,222,597,577,560,483,426,394,250,227,86,58,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,623,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,412,0,0,0,0,0,0,0,0,81,0,128,0,0,83,551,0,0,0,0,0,0,0,27,0,554,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,412,0,0,0,0,504,0,257,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,292,0,0,0,0,0,0,0,620,0,0,0,0,0,619,0,0,0,0,0,0,0,0,0,0,0,0,0,0,392,0,0,0,485,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,68,0,0,0,0,0,0,496,0,0,0,0,0,0,402,0,0,0,0,0,0,0,0,0,0,0,0,0,211,0,0,0,0,0,0,0,0,0,0,0,516,0,0,0,0,0,0,0,0,0,0,0,0,497,0,0,0,0,0,0,0,0,0,0,0,0,0,0,269,279,0,0,0,0,0,531,275,0,0,0,0,0,0,0,0,0,0,0,0,0,513,0,0,0,0,0,0,0,0,0,0,0,458,0,0,0,312,0,0,0,0,0,0,253,0,0,0,0,0,0,23,0,0,0,0,571,0,0,0,0,603,522,0,0,0,0,244,0,0,0,0,0,0,460,0,0,481,0,0,0,0,0,61,0,0,0,267,57,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,0,0,0,0,0,277,613,0,71,0,0,0,0,0,0,0,0,0,622,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,149,0,276,0,0,0,0,0,0,570,0,0,0,0,0,0,524,0,0,0,0,0,0,0,0,0,569,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,62,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,83,0,503,0,0,0,0,0,557,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,83,82,0,0,0,0,0,0,0,0,0,0,0,0,487,0,486,0,0,0,0,0,0,0,0,0,0,259,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,459,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,287,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,538,0,0,0,0,0,0,0,0,296,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,68,237,0,0,0,0,0,0,0,0,0,0,83,0,609,0,0,555,0,0,0,0,0,0,0,0,0,245,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,612,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,521,0,0,0,83,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,499,0,617,0,0,429,0,0,0,0,0,0,0,0,0,0,0,0,400,0,0,0,546,0,92,0,0,0,0,0,0,0,0,0,0,31,0,0,0,0,0,0,29,91,0,0,0,0,0,0,0,0,0,0,0,0,289,0,0,0,214,0,0,0,0,0,0,561,0,0,0,0,129,0,0,0,0,0,562,0,0,0,0,0,0,0,412,418,0,0,0,0,0,0,0,0,0,0,0,0,0,0,397,0,311,0,0,0,0,0,5,0,0,0,0,0,0,0,299,0,0,0,0,0,0,0,0,0,0,0,0,0,535,0,0,0,413,0,0,399,0,0,0,0,0,0,606,0,0,0,542,0,0,89,0,543,0,0,0,0,0,0,0,0,0,0,509,461,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,268,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,412,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,611,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,610,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,621,0,0,0,0,0,559,0,0,0,0,0,0,0,0,0,0,300,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,608,0,0,212,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,626,626,626,626,626,626,626,625,627]);\nexport const labelText = \"orgmilcomschnetedugovdrrformsfeedbackofficialaccoorgmilschnetgovmagazinemediaunioncargopilotgroupcaarespressworksaerodromeworkinggroupair-traffic-controlaircraftaccident-preventioneducatormarketplaceambulanceinsurancecateringairportrepbodyenginesoftwaremodellingair-surveillanceconsultingchartertrainermaintenanceservicesdesignflightskydivingfreightassociationstudentgroundhandlingdgcafuelclubtaxicrewshowballooningexpresstraderbrokerauthoragentsairtrafficjournalistsafetyconsultantmicrolightaccident-investigationparachutingequipmentproductionfederationrecreationscientistnavigationengineertradingglidingleasingresearchpassenger-associationentertainmentparaglidinghangglidingaerobaticrotorcraftemergencycertificationgovernmentaeroclubexchangelogisticschampionshiphomebuiltcouncilconferencecontrolairlinecivilaviationjournalorgcomnetedugovcoorgcomnomnetobjofforgcomnetuwukiloappsframerorgmilcomnetedugovcoradioorgcomnetcommuneedogpbcoitgvorgedugov*spreviewfrontendrelayononstagingupid*mtls*privatelinktypedreamdeveloperbravemochawindsurfaivenmirenupsunwnextbegetngrokclerkwale2bwebcsbrunputerflutterflowspawnbaseshiptodaymagicpatternsnetlifyondigitaloceanrailwayhostedclaudehasurabotdashvercelgithubluyanigadgetreplitcloudflaretelebitedgecomputeevervaultexponyatnoopencrpplxzeaburwasmerframerzeropsrocketpreviewconvexmedusajsspritesonherculeseasypanelstreamlitsnowflakemesserliloginlinehackclubcodepennorthflankbase44corespeedleapcellngrok-freeclerkstagelovableon-fleek*us-west-3ap-south-2us-central-2us-central-1eu-central-1ap-south-1us-west-2us-east-2eu-north-1ap-north-1us-west-1us-east-1*rcloudintsegorgmilcomgobbetnetintedugovturmusicasenasamutualcoopip6uriurnin-addre164homeirisgovdixdaemoncloudnssthwien*inexexkunden4accogvormymyspreadshop4lima2ixortsinfofuturecmsfuturehosting12hpprivfuturemailinglima-cityfunkfeuer123webseitednshomemelmyspreadshopcloudletswasantqldvicactnswtascatholicwasaqldvictasidwasantozqldorgcomvicasnactnetedugovnswtasconfcomairflowlambda-urltransfer-webappairflowtransfer-webapptransfer-webapptransfer-webapp-fipstransfer-webappeu-west-3ap-south-2eu-south-2eu-central-2ap-southeast-3ap-southeast-4ap-northeast-3eu-central-1mx-central-1me-central-1ca-central-1il-central-1ap-northeast-1ap-southeast-1me-south-1af-south-1eu-south-1ap-south-1ap-southeast-7us-west-2eu-west-2us-east-2eu-north-1ap-southeast-2ap-northeast-2ap-southeast-5us-gov-west-1us-gov-east-1ca-west-1us-west-1eu-west-1us-east-1ap-east-1sa-east-1privatenotebookstudiolabelingnotebookstudionotebooknotebook-fipslabelingnotebookstudionotebook-fipsnotebookstudio-fipsnotebook-fipsnotebookstudionotebook-fipsnotebookstudioeu-west-3ap-south-2eu-south-2eu-central-2ap-southeast-3ap-southeast-4ap-northeast-3eu-central-1me-central-1ca-central-1il-central-1ap-northeast-1ap-southeast-1me-south-1af-south-1eu-south-1ap-south-1us-west-2eu-west-2us-east-2eu-north-1ap-southeast-2ap-northeast-2experimentsus-gov-west-1us-gov-east-1ca-west-1us-west-1eu-west-1us-east-1ap-east-1sa-east-1onrepostsagemakercopporgmilcompronetintedugovbiznameinfoshoprsorgmilcomnetedugovbrendlyresolvenzauscotvstoreorgcomnetedugovbizinfoidacaicoittvorgmilcomschnetedugovinfocloudezproxyacmymyspreadshopkuleuvenwebhostingtransurl123websitecloudnsinterhostsolutionsddns5476103298edgfacbmlonihkjutwvqpsryxzbarsycoororgcomedumyftpno-iporxcloud-ipfor-somemmafanfor-morewebhopselfipjozidyndnscloudnsdscloudfor-thefor-betteractivetrailcoeconorestooteorgcomeconeteduassurmoneyafricaarchitectesrestaurantloisirstourismavocatsinfoagrounivcoorgcomnetedugoviatvdeportesaludtksatorgmilcomwebgobnetinteducienciaboliviarevistacooperativaempresanombreindustriamusicapatriamedicinademocraciapoliticapuebloindigenaplurinacionalarteblogwikiinfoagrotransportenoticiasprofesionalacademiaeconomiaecologiamovimientotecnologianaturalsimplesitecepesebamapadfmgalampbacscpirngorotomtrjspaprrprrsesmscepesebamapadfmgalampbacscpirngorotomtrjspaprrprrsesms*biaamfmtcmptvfeirasampajampanatalbelemananiradiog12medindfndbmdtrdthepoaggfjdfdefinfenflegsegongengcngorgzlgslglogppgmillelqslcimcomnomadmjabimbbibbsbabcrectecsjcetcpscpvhudieticriapipsiecnbiorioecogeoteoodoproatoartfstmatvetdetbetnetcntnotfotgrueduajuespappreptmpemparqsrvadvdevgovntrturagrjorfarjusmusdesvixxyzcozfozslzbhzmaringasantamariacampinagrandegoianiasorocabafloripasaobernardocuritibaboavistarecifeaparecidasaogoncasalvadorcuiabamorenamacapalondrinacontagemsocialfortalmaceioleilaoosascoriobranconiteroi9guacutcheblogflogvlogwikitaxicoopmanauspalmascaxiasjoinvillebaruericampinassantoandreribeiraoriopretoweorgcomnetedugovv0windsurfshiptodaycloudsitecoaccoorgnetgovofmilcomgovmediatechzacoorgcomnetedugsjgovmydnspenfnlabnbmbgcbcqconcontnuyksknsmyspreadshopno-ipawdevboxbarsyonidatemfuinabusavinstanceseceuguukussryzespawncsxcloud-ipmyphotosfantasyleaguetwmailcleverappsscrappingccwucloudnsftpaccessgame-serverccgovobjectsrmalpgcust*svcalp1aeappenginermalpgmyspreadshop4lima2ixsquare7cloudscale123websitefirenet12hpflowgotdnslinkyard-cloudcloudnslima-citydnskingobjectstorageedaccogoorusorgcomnetinteduaéroportxn--aroport-byaassogouvcomilgobgovcloudnses-1eu-west-1us-east-1euvipit1eurarubait1s3lbwebsites3websiteru-spbru-mskelasticcsrunstnukukcaukusnl-ams-1fr-par-1fr-par-2functionsnodess3ddlwhmrdbfnck8sifrs3-websitecockpitscblmgdbdtwhkafkpubprivs3ddlwhmrdbk8sifrs3-websitecockpitscblmgdbdtwhkafks3ddlrdbk8sifrs3-websitecockpitscblmgdbdtwhkafkk8sscalebookpl-wawfr-parnl-amsbaremetalsmartlabelinginstancesdechk2kuleuvenlaravelvoorloperurownoxazapscwhstgrvaporonline-serverobservablehqelementorantagonistreclaimjoteluluencowaydiademjelasticmatlabmagentositetrendhostingaxarnetperspectajenv-arubajelejoteravendbemergenttrafficplexconvexkeliwebserveboltbegetcdnstaticson-rancherprimetelonstackitunison-servicesdnshomelinkyardbarsyjelecloudnscocomnetgovmycn-northwest-1cn-north-1s3s3-accesspoints3-websites3s3-accesspointrdsdualstacks3-deprecatedemrappui-prods3-websiteemrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apis3s3-accesspoints3s3-accesspointrdsdualstackemrappui-prods3-websiteemrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apicn-northwest-1cn-north-1cn-northwest-1ebcomputeelbcn-north-1airflowcn-northwest-1cn-north-1oncn-northwest-1cn-north-1amazonawssagemakeramazonwebservicesdirectasgdsdhehahljlnmhbacscahqhshhihnlnynsnmofjbjzjxjtjhkcqtwgsjssxnxjxgxxzgz網絡网络公司orgmilcomnetedugovxn--55qx5dcanva-appsxn--io0a7iquickconnectcanvasitekhsjxn--od0algcanva-codemyqnapcloudsrvrlessclustersrealtimestorageleadpagescarrdcrdorgmilcomnomnetedugovhidnssupabaserdpareplmypiumsoxmitotaplpagesfirewalledreplitowodevwebview-assetsvfswebview-assetss3s3-accesspointdualstackemrappui-prods3-websiteaws-cloud9emrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apicloud9eu-west-3ap-south-2eu-south-2eu-central-2ap-southeast-3ap-southeast-4ap-northeast-3eu-central-1me-central-1ca-central-1il-central-1ap-northeast-1ap-southeast-1me-south-1af-south-1eu-south-1ap-south-1ap-southeast-7us-west-2eu-west-2us-east-2eu-north-1ap-southeast-2ap-northeast-2ap-southeast-5ca-west-1us-west-1eu-west-1us-east-1ap-east-1sa-east-1s3s3-accesspointdualstackemrappui-prods3-websiteaws-cloud9emrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apicloud9s3s3-accesspointdualstackanalytics-gatewayemrappui-prods3-websiteaws-cloud9emrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apicloud9s3s3-accesspointdualstackemrappui-prods3-websiteemrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apis3s3-accesspointdualstacks3-deprecateds3-websites3-object-lambdaexecute-apis3s3-accesspoints3-websites3-accesspoint-fipss3-fipss3s3-accesspointdualstackemrappui-prods3-websites3-accesspoint-fipsaws-cloud9s3-fipsemrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apicloud9s3s3-accesspointdualstackemrappui-prods3-websites3-accesspoint-fipss3-fipsemrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apis3s3-accesspointdualstacks3-deprecatedanalytics-gatewayemrappui-prods3-websiteaws-cloud9emrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apicloud9vfss3s3-accesspointdualstackemrappui-prods3-websiteaws-cloud9emrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apicloud9eu-west-3ap-south-2eu-central-2ap-southeast-3ap-southeast-4ap-northeast-3eu-central-1mx-central-1me-central-1ca-central-1il-central-1ap-northeast-1us-northeast-1ap-southeast-1me-south-1af-south-1ap-south-1ap-southeast-7us-west-2eu-west-2ap-east-2us-east-2ap-southeast-2ap-northeast-2ap-southeast-5us-gov-west-1us-gov-east-1ap-southeast-6ca-west-1us-west-1eu-west-1us-east-1ap-east-1sa-east-1mrapaccesspoints3s3-accesspointdualstacks3-deprecatedanalytics-gatewayemrappui-prods3-websites3-accesspoint-fipsaws-cloud9s3-fipsemrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apicloud9s3s3-accesspointdualstacks3-deprecatedanalytics-gatewayemrappui-prods3-websites3-accesspoint-fipsaws-cloud9s3-fipsemrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apicloud9s3eu-west-3ap-south-2eu-south-2computes3-ap-northeast-2elbrdss3-ap-east-1s3-sa-east-1s3-us-gov-west-1s3-eu-central-1s3-ca-central-1eu-central-2ap-southeast-3ap-southeast-4ap-northeast-3s3-website-us-west-2s3-website-eu-west-1s3-external-1eu-central-1me-central-1ca-central-1il-central-1s3-us-west-1s3-eu-west-1s3-website-sa-east-1s3-website-ap-southeast-2ap-northeast-1ap-southeast-1s3-us-west-2s3-eu-west-2me-south-1af-south-1eu-south-1ap-south-1us-west-2eu-west-2us-east-2s3-website-ap-southeast-1s3-1s3-globals3-ap-northeast-3eu-north-1airflowap-southeast-2s3-us-gov-east-1s3-fips-us-gov-east-1s3-me-south-1s3-ap-south-1ap-northeast-2s3-website-us-west-1ap-southeast-5s3-eu-north-1s3-ap-southeast-1s3-website-us-gov-west-1compute-1s3-eu-west-3us-gov-west-1s3-website-ap-northeast-1us-gov-east-1s3-fips-us-gov-west-1s3-website-us-east-1s3-ap-southeast-2ca-west-1us-west-1eu-west-1us-east-1ap-east-1sa-east-1s3-us-east-2s3-ap-northeast-1authauthauth-fipsauth-fipseu-west-3ap-south-2eu-south-2eu-central-2ap-southeast-3ap-southeast-4ap-northeast-3eu-central-1mx-central-1me-central-1ca-central-1il-central-1ap-northeast-1ap-southeast-1me-south-1af-south-1eu-south-1ap-south-1ap-southeast-7us-west-2eu-west-2us-east-2eu-north-1ap-southeast-2ap-northeast-2ap-southeast-5us-gov-west-1us-gov-east-1ca-west-1us-west-1eu-west-1us-east-1ap-east-1sa-east-1rframeservicesbuilderstg-builderdev-builder*ociocpocsazuregcpawsdemoinstanceeu-west-3eu-south-2ap-southeast-3ap-northeast-3eu-central-1me-central-1ca-central-1il-central-1ap-northeast-1ap-southeast-1me-south-1af-south-1eu-south-1ap-south-1ap-southeast-7us-west-2eu-west-2us-east-2eu-north-1ap-southeast-2ap-northeast-2ap-southeast-5us-gov-west-1us-gov-east-1us-west-1eu-west-1us-east-1ap-east-1sa-east-1previeweu-4us-4us-1eu-1us-2eu-2us-3eu-3appscomputepaasrag-cloudrag-cloud-chjcloudjcloud-ver-jpcdemonodebalancermembersipeuxvsoncillaocelotonzayalilynxsphinxfentigercustomercaracalo365cloudstaticxendevapp001testcode-builder-stgplatformmediasiteprojedrydpagesjsx0desazacncoitrueu4uhkukgrbrushatenadiarymyspreadshopfrom-flfrom-wvwebspace-hosttheworkpchatenablogcursorusercontentservesarcasmapplinzisakuratanwixsiteappchizigiizeis-into-carsdnsiskinkyadobeaemcloudis-a-therapistpgfogmyvncdojinis-an-actress1kappfldrvkozowqa2jpnmexprgmrfirewall-gatewaydynnscafjsfbsbxooguyfrom-gawoltlab-demois-a-anarchistwiardwebteaches-yogadattowebtb-hostinglive-websiteservegamegotpantheonfrom-nhsubsc-payfrom-ohvipsinaappfrom-cadyndns-officehomelinuxfrom-mahercules-appservebbsstreakusercontentfrom-okfrom-wyfastly-terrariumis-a-llamaqualyhqportalserveexchangeon-vaporvivenushopciscofreakgrayjayleaguesmetaaiusercontentfrom-iais-a-libertariansaves-the-whalestaveusercontentyolasiteoperaunitepoint2thisis-a-catererclaudeusercontentlinodeusercontentfrom-vagithubusercontentsells-for-lesshosteurcanva-appsplaystation-cloudddnsfreefrom-pafrom-prfrom-waddnskingoutsystemscloudhotelwithflightmydattois-a-nascarfanmydbserverminiserverdamnserverservehumouris-a-playerfrom-nvfrom-nmemergentagentgentappsamplifyappfrom-kyis-an-accountantnfshostserveircfrom-akpythonanywherestackhero-networkpostman-echolikescandydyndns-mailobservableusercontentserveftpfreeboxosfrom-utcdn77-storageamazonawsneat-urldyndns-serverlinodeis-a-teacherfrom-vtgleezemythic-beastsus1-pleniteu1-plenitla1-plenitpaywhirlservecounterstrikejdevcloudhealth-carereformis-into-animegoogleapisis-a-painterafricaisa-hockeynutatmetais-an-actora2hostedis-a-democratdatadetectest-le-patrondigitaloceanspacesis-a-designeris-a-hunterlinodeobjectstemp-dnsissmarterthanyoufrom-arsimplesiteevennodetownnews-stagingis-a-liberalgooglecodejelasticservemp3qualyhqpartnerdyndns-free1cooldnsest-a-la-masiondrayddnsdynuddnsfrom-orfrom-miis-a-bloggerfrom-himydobisscanvacodeis-an-engineerest-a-la-maisonupsunappdevinappswafflecellmyasustorwpenginepoweredfrom-ctservep2psame-appmyshopblocksthingdustdatalikes-piediscordsezis-with-thebandlpusercontentis-leetshopitsite3utilitiesis-a-personaltrainersinaappladeskis-a-cheflogoipselfipbase44-sandboxnospamproxyalibabacloudcsmesswithdnsauthgearappsiamallamawithgooglelutrausercontentmochausercontentframercanvasmytabitdyndns-homew-credentialless-staticblitzcpserverdiscordsaysis-a-nurseappspotatlassian-isolated-3premotewdfrom-mtwixstudiocode0emm180rmyactivedirectoryawsappsmytuleapdnsabrpolyspaceqbuserrenderbuiltwithdarkboutirgotdnsabrdnsdopaascanva-hosted-embedawsglobalacceleratorhomesecuritypcmyiphostditchyouripclever-clouddyndns-ipon-aptibleis-a-musicianhosted-by-filessecuritytacticsappspaceusercontenthomeunixstrapiappsame-previewcf-ipfsmycloudnaselasticbeanstalkis-certifieddontexistkasserverik-serverdrive-platformatlassian-3pfirebaseappherokuappawsapprunnerbarsycenteris-a-cubicle-slaveservehttpmyshopifyis-a-guruquicksytessiiitesorsitesmagicpatternsappis-a-cpameteorappfrom-wiis-a-rockstarbumbleshrimpdattolocaldatabricksappsreadthedocs-hostedfrom-rifamilydsdyndns-picsplesknsbplaceddnsaliasdynaliasdyndns-remotedoomdnsip-ddnsblogdnsis-a-doctorroutingthecloudamazoncognitobarsyonlinedsmynasddnsgurucloudflare-ipfsdeus-canvasfrom-idsmushcdnpagespeedmobilizerdyndns-at-homeunusualpersonhosted-by-previderis-a-republicandyn-o-saurstreamlitappworkisboringonthewificprapidqualifioappis-uberleetis-slickgetmyipwpdevcloudtypeformdyndns-at-workgentlentapismynascloudw-corp-staticblitzfrom-ingeekgalaxyservebeerfrom-mdonrenderspace-to-rentaivencloudappspacehostedwafaicloudcodespotblogspotatlassian-3p-us-gov-modfrom-ndfrom-msis-a-techieis-a-studentcustomer-ociis-a-photographerdurumisfrom-ksmassivegriddyndns-wikiis-an-entertaineris-a-hard-workermysecuritycamerafrom-mnrackmazedyndns-blogis-a-bulls-fanwritesthisblogfreemyipsimple-urlfrom-sdreservdauthgear-stagingest-mon-blogueuris-into-gamesrice-labsxtooldevicesakurawebis-an-anarchistoraclecloudappsdyndns-worksells-for-urhcloudfrom-dcfastvps-serverwpmucdnis-a-geekscrysecfrom-txis-into-cartoonsmodelscapetrycloudflarelocaltonetstreak-linkbalena-devicesfrom-njforgeblocksfreebox-oswebadorsitefrom-ncdoesntexisthobby-sitestreaklinkshomesecuritymacownprovidertuleap-partnersdattorelaywphostedmailservequakeis-a-socialistservehalflifepivohostingdynuhostingquipelementsw-staticblitzdyndns-webfrom-deproject-studyaliases121is-not-certifiedhercules-devis-a-financialadvisorservepicsis-a-greenloseyouripfrom-ilwithyoutubemwcloudnonprodwiredbladehostingdnsdojofrom-tnpixolinomyqnapcloudis-an-artisthostedpiis-a-landscaperauiusercontentoaiusercontenton-forgeis-a-conservativedreamhostersnet-freaksapps-1and1is-goneencoreapifastly-edgefrom-nesalesforcefrom-scdeployagentoraclegovcloudappsfrom-alis-a-lawyercechirevultrobjectsstufftoreadisa-geekddnsgeeklovableprojecttry-snowplowfrom-moblogsyteis-a-bookkeepernogmyforumravendbmyboxdeelementoredsaacficogoorinforgcomgobnatneteduidstoreorgcomnetintedudevnomepublorgcomneteduathgovtestscalculatorspaynowinfoquizzesresearchedcloudnsfunnelsassessmentsjscaleforcetmacltdorgmilcompronetgovbizpresseklogesrsccloudcustomfltusrcloude4corealmgovmunicontentproxy9metacentrumdyndyndyndnsdynpagespages-researchitionoccustomercomymyspreadshopipv64diskussionsbereich4limacomrub2ixfirewall-gatewayddnssspdnsbarsykeymachinesquare7myhome-serverspeedpartnercommunity-proschuldockxenonconnectgünstigliefernbwcloud-os-instancedyndnssecmy-routerxn--gnstigliefern-wobin-butterl-o-g-i-nisteingeekin-dslin-berlinin-brbfuettertdasnetzleitungsenin-vpnlcube-serverdyn-ip24logoipdyn-berlinruhr-uni-bochum12hpgoipsrvdnsfruskygit-repossvn-reposinternet-dnsgünstigbestellenhome-webserverxn--gnstigbestellen-zvbbplacedheimdnscosidnswebspaceconfiglima-citydyndns1istmeinvirtualuserschulplattformmy-gatewayddnsseclebtimnetztest-iservmein-iservvirtual-userhome64iservschuletaifun-dnstraeumtgeradeschulserverdynamisches-dns123webseitednshomehs-heilbronndnsupdaterbssgraphicdwadpdwdaepeweaawapaafpfwfabwbpbacwcpcciwebuserapiobjectsidsiskospockkimodorikerbonesteamsparisjanewaypicardglobaltarpitreedpikekiraworfsulukirkarchertuckerhackercanarywesleystagingprereleaset3r2lpbravepanelngrokiservstglclcrmerpflypagesbarsyvivenushoplocalcertlocalplayerbearbloggatewaydeno-stagingis-not-ais-a-goodbotdashvercelmocha-sandboxplatter-appreplitgithubpreviewworkersinbrowserevervaultis-ahrsndenoxmitmodxmyaddrstorageapipayloadgrebedocruncontainersstgstagelclstageloginlineis-a-fullstackcodepenleapcellngrok-freeis-coolstoragewebharemediatechlibp2pdiscourseimaginecomyspreadshopstoreregbiz123hjemmesidefirmcoorgcomnetedugovsldorgmilcomwebgobartnetedugovtmorgpolcomsocartnetedugovassoagrondiscoodontk12medcuegyecpaabgengorgmilgalsaltulcomadmesmgobpubdocmonfindgnriouioproartlatvetnetfotedulojgovntrturibrbarxxxofficialbasechefprofmktgpsictechinfoarqtcontdentrrpppsiqgit-pagesritmedfieorgcomlibprieduaipgovriikmeactvsportorgmilcomscieunnetedugovnameinfopintouchtawktotawkmyspreadshoporgcomnomgobedu123miwebcomputeorgcomnetedugovbiznameinfocognito-idpeusc-de-east-1onjelasticnxaspdnsbarsydirectwpdeuxfleurstransurldogadoprvwcloudnsamazonwebservicesdnshomeuserpartycokoobinmkmfidymyspreadshopalandkapsiikixn--hkkinen-5wacloudplatformhäkkinen123kotisivuidacorgmilcompronetedugovbiznameinforadioorgcomneteduuserexperts-comptablestmmyspreadshopgretaprdcomnomynhccifbxoshuissier-justicenotairesaeroportfreeboxoson-webavocatassoportgouvkdnschirurgiens-dentistes-en-franceavouesfbx-os123sitewebveterinairechirurgiens-dentistespharmacienchambagrimedecinfreebox-osdediboxgoupilemszicpyicpvicppleysheezypagesedugovcnpyorgcomcybllcpvtnetedugovtnxonlineschooldaemond6atcopanelorgnetplybotdashstackitkaasorgmilcomnetedugovbizmodltdorgcomedugovcoorgcomneteduappwriteacorgcomnetedugovcloudtranslateusercontentorgcomnetedumobiassoorgcomnetedugovbarsysimplesitediscourseindorgmilcomgobneteduorgcomwebnetedugovguaminfonxhra教育敎育網絡网絡组織組織网络網络组织組织公司政府個人个人箇人ltdorgcomincneteduidvgovxn--uc0ay4axn--55qx5dxn--mk0axixn--io0a7ixn--uc0atvxn--zf0avxxn--lcvr32dxn--od0algxn--wcvs22dxn--gmqw5axn--od0aq3bxn--mxtq1mxn--ciqpnxn--tn0agxn--gmq050iorgmilcomgobneteduiservwp2tempurlmircloudfreesitewpmudevmyfastgadgetcloudaccessjelehalfboltfastvpsemergenteasypanelopencraftizcombrendlynamefromrtpersoadultmedorgpolrelcomproartnetedufirminfoassoshopcoopgouvtmcomediahotelforumvideosportorgsexagrargameslakaseroticaerotikatozsdereklamcasino2000filmsuliinfoboltshopprivnewsszexcityutazasjogaszkonyveloingatlaneacaicogoormyᬩᬮᬶmilwebschnetkopbizzonedesaponpesxn--9tfkymyspreadshopgovmytabittabitorderravpageaccok12idforgnetgovmuniltdplcaccotttvorgcomnetmeca6g5gpgamubacaicniocoukuptverdruscsdelhiindorgmilcomwebnicfingenpronetintedugovresbizbiharbarsyinternetbusinessschooltravelsupabasealumnigujaratfirminfoaeropostbankcoopindevscloudnsno-ipbarsybarrell-of-knowledgebarrel-of-knowledgensupdategroks-thisdnsupdatefor-ourknowsitalldvrcammittwalddynamic-dnsv-infowebhopselfipdyndnshere-for-moreilovecollegemayfirstforumzcloudnsmittwaldservertypo3servergroks-theeusekd1cdndyndnsidrawsainaueuapjpusstagemocksysdevicesclientcustreservdcustdevdisrecprodtestingcobeebyteutwenteboxfusebravepstmndedynngrokorgmilcomnomnetedugovqcxqzzbarsythingdustmo-siemensrb-hostingfh-muenstergitbookbluebitecloudbeesusercontentnodeartkiloappsforgerockdarklangresinstagingapigeebubbleb-datascryptedhypernodedappnodepantheonsitegitlabgithubkeeneticvirtualservercleverappshostyhostingon-rioedugitticketstelebitwixstudioon-k3sicp0icp12038jeleqotolairbubbleappsmyaddrstolosmyrdbxwebflowdrive-platformbeagleboardhasura-applolipopdefinimavaporcloudmusicianwebflowtestazurecontainerresindevicereadthedocsloginlineeditorxmoonscalesandcatsbasicserverwebthingsbrowsersafetymarkbeebyteappbitbucketidaccovistablogorgschnetgovxn--mgba3a4f16axn--mgba3a4fraarvanedgeايرانایرانjclaspeziapdudcefegelemeperetevebacanatavaparasabgagfgogrgpgalclblimfmrmcbmbvbfclcmcvcrcpcchlimifibicivipirisimncnbnanenrnpntnnolomobocoaogorosopotoptvtatctbtmtltotpusulunutpspapaqsvpvvvtvavvrtrsrprgrfrcrbrarorkrvstsssbscsmsispzczbzbozen-suedtirolmyspreadshopxn--bulsan-sdtirol-nsbxn--valledaoste-ebbtrentinoaltoadigetrentin-sued-tirolxn--forlcesena-c8axn--forl-cesena-fcbxn--bozen-sdtirol-2obtriestetrentinsuedtiroltrentino-s-tirollecceudineaostesienaparmaluccapaviagenoapaduaaostamonzaabruzzoternirietiturinmilanbozenlaziofermoleccocuneonuoropratola-speziavdataaligfvgpugmolcalcamlomumbsicpmnvenvaoedugovabrsarmaremrbastoslazibxosfirenzetrentinosüdtirolval-d-aostavalle-aostamessinacremonaravennatoscanatrentin-suedtirolbolognacalabriaurbinopesarofriuli-v-giuliaogliastraxn--valle-aoste-ebblaquilaandriatranibarlettasyncloudxn--valle-d-aoste-ehbaostavalleyvalled-aostatrentino-alto-adigevallee-d-aostexn--balsan-sdtirol-nsbpistoiasicilialucaniacataniaiserniaperugiabresciaveneziagorizialiguriaimperiabulsan-suedtirolbalsan-suedtirolbarlettatraniandriaxn--trentino-sdtirol-szbforlì-cesenatuscanyvallée-d-aostemantovavallée-aostecasertapiemontevalleaostaval-daostafriulivgiuliatrevisoforli-cesenavalléedaosteferrarapescaravald-aostatrentino-altoadigefriuli-vegiuliavallee-aostecarboniaiglesiastarantomediocampidanovalleedaostetrentinosud-tirolcampobassotrentinsüd-tiroltrentinosüd-tirolmonzabrianzatrentino-südtirolxn--trentino-sd-tirol-c3bpotenzacosenzavicenzaemiliaromagnavenicefrosinonemarchepordenonetrentinosued-tirolvaresemolisevalléeaostefriuli-veneziagiuliabasilicatalatinaanconasavonaveronamodenabiellabolzano-altoadigepugliafoggiaumbriatrentino-stirolgenovapadovamateranovararagusapiacenzatrentinostirolvalleeaostetempio-olbiasudsardegnatrentinsudtirolmassa-carrarafriuliveneziagiuliatrentinosuedtirolandria-barletta-tranitrapanixn--cesenaforl-i8amaceratacaltanissettaascoli-picenobrindisicarraramassacagliaririmininapolivibo-valentiachietibulsan-sudtirolbalsan-sudtiroltrentino-a-adigebulsanbalsaniglesiascarboniamilanotorinoteramodell-ogliastraarezzotrentinoalto-adigerovigotrentovenetoiglesias-carboniatrentino-sud-tirolaltoadigereggio-emiliareggio-calabriasardegnatranibarlettaandriapiedmontxn--sdtirol-n2amedio-campidanotrentino-süd-tirolfriuli-vgiuliafriuli-ve-giuliaromeennaromapisa32-b16-b64-blodiastibarineencomonaplesforlicesenailiadboxosalessandriasicilytrani-barletta-andriaxn--trentin-sdtirol-7vbpesarourbinotrentinsued-tirolcesena-forliforlìcesenaemilia-romagnamonzaebrianzaxn--trentinsdtirol-nsbtrentinos-tiroltrentinsüdtirolvalledaostaolbia-tempiocampidanomediovibovalentiasassarivalle-daostalombardysud-sardegnafriulivegiuliareggioemiliamonzaedellabrianzaalto-adigevercellitrentin-sudtiroltraniandriabarlettatrentino-sudtirolascolipicenobozen-südtirolfriulive-giuliaflorencexn--cesena-forl-mcbcarbonia-iglesiasaosta-valleycarrara-massadellogliastratrentinoa-adigexn--valleaoste-e7apesaro-urbinoxn--trentinosdtirol-7vbxn--trentin-sd-tirol-rzbxn--trentinsd-tirol-6vbtrani-andria-barlettatrentin-süd-tirolxn--trentinosd-tirol-rzbgrossetomonza-e-della-brianzasüdtirolreggiocalabriatrentinoaadigetrentin-südtirolverbano-cusio-ossolafriuliv-giuliaverbaniacampaniatrentino-aadigefriulivenezia-giuliasardiniaandriabarlettatranibarletta-trani-andriacatanzarooristanourbino-pesarocesena-forlìvalle-d-aostacampidano-medio123homepagesiracusatempioolbiasuedtirollombardiaavellinocesenaforlìtrentinofriuli-venezia-giuliabozen-sudtirolandria-trani-barlettabulsan-südtirolbalsan-südtirolmonza-brianzabolzanotrentino-sued-tirolbellunosalernolivornocrotonesondriodnshometrentinsud-tirolmassacarraratrentin-sud-tiroltrentino-suedtirolviterbobergamocesenaforliolbiatempiopalermobeneventoagrigentoofcoorgnetfmaitvphdengorgmilcomschnetedugovperagrikanieasukehandachitatokaiaisaikonanoharuamaobuhigashiuraowariasahiinuyamatobishimaiwakurashitarainazawatoyonegamagorimihamatoyotataharakariyayatomioguchikomakimiyoshinishiotokonamekiyosuchiryutoyohashiokazakiisshikikasugaikotakiratoeianjotogofusosetohazutsushimashinshirotakahamanisshinshikatsuhekinantoyokawaichinomiyatoyoakeodateogataakitaikawakyowahonjoogayurihonjonoshirokamiokakatagamimitanegojomeyokotekosakadaisenkazunonikahohonjyomoriyoshimisatohappoukamikoanihachirogatahigashinarusesembokufujisatokitaakitaitayanagiowanitakkomutsutsurutahirosakigonoheoirasetowadamisawanohejiaomorishingohiranairokunohehashikamitsugarushichinohehachinohenakadomarisannohekuroishisakaeisumiasahiotakiinzaiabikomatsudoyachiyomutsuzawakujukuriomigawakashiwatoganemihamanaritasakuranagaramobarahanamigawachoshishiroichoseikozakishisuikatorimidorichonankyonanfuttsuonjukufunabashinagareyamanodasosatakochuotohnoshourayasukimitsuyokaichibayotsukaidosodegauratateyamakamagayayokoshibahikariyachimatakatsuuratomisatokisarazukamogawaichikawanarashinoichinomiyashimofusaminamibososhirakoichiharaoamishirasatoikatahonaiainansaijoseiyoiyoozuuwajimaniihamanamikatamasakiuchikokihokutobetoonshikokuchuomatsuyamaimabarikamijimakumakogenyawatahamamatsunosabaeikedaobamasakaifukuiohionotsurugamihamawakasaminamiechizeneiheijikatsuyamatakahamaechizensoedaukihaomutaokawanishiogoribuzenonojosueumiokiotochikugosasagurisaigawamizumakishinyoshitomikurumekurateyamadakasuganakamamiyamanogatatakatahakataiizukakawaratagawakasuyaashiyainatsukimunakataminamitsuikishonaikurogifukuchikeisenhigashimiyakoshinguyukuhashiokagakiyamekogaongausuikahotohochuotoyotsumiyawakadazaifuhisayamatachiaraiyanagawanakagawahirokawachikujochikushinochikuhochikuzennamieotamaokumashowateneiiwakikoorinangoononishigoshimogoomotegomishimafukushimaasakawakagamiishishirakawaiitatefutabahiratayugawahanawakitakatakawamatakunimiyabukibandaihigashihironoyamatomiharuyamatsuriaizubangedatesomaaizuwakamatsuyanaizuaizumisatonishiaizuizumizakikitashiobarataishinkaneyamakoriyamainawashirotanagurafurudonosamegawasukagawaishikawatamakawaikedaogakitaruiginanenahashimahichisonakatsugawaibigawashirakawamizunamiminokamomitakekawauesekigaharatomikasakahogikitagatayamagatatajimianpachimotosuyaotsukakamigaharahidakanisekitokigujominogodoyorogifukasamatsutakayamawanouchihigashishirakawakasaharashimonitatsumagoichiyodakannakanrashowameiwakiryuotaoratomiokafujiokaitakuranaganoharahigashiagatsumatakasakishibukawaminakamikatashinatsukiyonokawabanumataannakaoizumimidorishintoisesakiuenoyoshiokakusatsutakayamanakanojonanmokutamamuratatebayashimaebashiotakekaitadaiwahongofuchukuietajimashobaramiharahatsukaichihigashihiroshimamiyoshikumanokurenakasakaseraseranishiasaminamifukuyamashinichionomichiosakikamijimajinsekikogentakeharaotobenanaeikedatohmaozoraobiraabirakyowaeniwataikibibaisharirebunerimohiroooketootarupippunishiokoppechitosefurubirahakodateshiranukakitahiroshimakushiroobihironanporoiwamizawaniikappukunneppufukushimanakasatsunaitoyourakuromatsunaiakabirakamisunagawashibechaurakawakamifuranonakatombetsuasahikawashimokawakayabeokoppebiratoriabashirisaromaatsumanumatahidakabifukamukawamikasahorokanaitoyotomisarufutsuhigashikawaishikarikitamiyoichiesashiiwanaitomariminamifuranoakkeshifuranotoyakoyakumootoineppushikaoishiraoinemuronayorohaboroashorobihororishirifujiutashinaihokutotakasuebetsuurausuassabukikonaishimamakinaiedatetoyabieinikiesanuryuoumuteshikagarikubetsuashibetsukimobetsuaibetsutobetsusobetsuembetsushimizuchippubetsurishirihokuryuhoronobeshintokutsubetsushibetsuhonbetsumombetsutsukigatakuriyamakoshimizushiriuchikutchanmurorannoboribetsukamishihorowassamushinshinotsukembuchiwakkanaikamoenaikiyosatotakinoueshikabesunagawafukagawanakagawatakikawakamikawahigashikagurahamatonbetsumatsumaemoseushirankoshishakotanimakanemashikeotofuketomakomaisandatambaitamiawajikasaiasagoshisoonoakoyashirotoyookaminamiawajiinagawafukusakitakasagokamigorikasugaharimayokawaashiyahimejiakashitaishiaogakisannantakinosumototakarazukanishinomiyashingugoshikinishiwakiyokatakaaioimikisayoyabukawanishiamagasakisasayamashinonsenkakogawaichikawakamikawatatsunotsukubaiwamaogawaasahisakaitokaioaraiitakobandodaigosuifuinaamikasumigaurakashimaomitamayachiyoshimodatetomobetoridehitachinakainashikisakuragawakasamayawaramoriyahitachiomiyanamegatayamagatahitachikamisuushikutakahagiibarakitonekoganakasowayukimihojosomitoryugasakishimotsumafujishirotsuchiurachikuseihitachiotashirosatotamatsukuriuchiharashikahakuinanaotsubatawajimakahokukawakitatsurugikaganominotosuzuuchinadakomatsuanamizunakanotohakusannonoichikanazawaiwateshiwafudaikawaimoriokaofunatohanamakikuzumakikitakamininohekunoheyamadayahabasumitaichinosekitanohatahiraizumirikuzentakatajobojiotsuchihironomiyakoiwaizumikarumaiichinohenodakujitonooshushizukuishifujisawamizusawakamaishikanegasakimannoutazukotohiraayagawazentsujihigashikagawauchinomikanonjisanukimarugamemitoyotakamatsutadotsunaoshimatonoshoakuneamamiizumihiokiyusuikinkoisasookouyamanakatanekagoshimakanoyaisenkawanabeminamitanemakurazakitarumizunishinoomotematsumotosatsumasendaioimatsudaayaseebinamiurazushinakaiodawaraiseharasagamiharahakoneaikawakaiseiatsugitsukuihadanoyamatoyamakitazamaoisochigasakininomiyayokosukakamakuraminamiashigarafujisawasamukawakiyokawahiratsukayugawaraokawaumajikochitsunootoyoakiinonishitosayasudahidakamiharasakawaniyodogawahigashitsunokagamigeiseisusakiotsukinaharisukumomurototosakamiochitoyotosashimizumotoyamanankokunakamurakitagawayusuharaogunichoyoukiasoutoozugyokutoamakusamifunetakamoriyamagaminamataminamiogunikikuchisumotoyamatonagasumashikiaraokumamotokamiamakusanishiharayatsushiroayabeseikasakyoideineujinakagyokameokakyotangokyotanabekyotambaminamiyamashiroyamashinatanabeyawatawazukaminaminantanmiyazuhigashiyamafukuchiyamakitamukokamojoyokizumaizuruujitawaraoyamazakinagaokakyokumiyamakawagoeinabeshimameiwaasahitaikiudonoisetsukisosakikuwanamihamamiyamasuzukatamakimisuginabarikumanokomonominamiisewataraitobakiwatakikihotadomatsusakayokkaichikameyamaureshinoishinomakishichikashukuohirataiwaosakizaohigashimatsushimashikamaiwanumashibataogawaraonagawakawasakiseminemarumoriminamisanrikukakudamuratawakuyatomiyanatoriwataritagajomisatotomekamirifushiroishimatsushimayamamotoshiogamafurukawahyugaebinotsunosaitoayakushimanobeokakitauramiyazakitakazakigokaseshiibamimatashintomikunitomikitakatakobayashikawaminamitakaharukijotakanabemiyakonojonishimeranichinankitagawakadogawamorotsukakisofukushimaminamimakisakaeobuseikedaogawamiasaokayaasahiotakiotarichinoinaomichikumakomaganechikuhokukaruizawayasuokaooshikaikusakaminamiaikitogakushimatsukawakawakamitateshinatakamorikitaaikishiojirimiyadahakubaiizunaiijimaiiyamamiyotasuzakayasakatoguraookuwanagawaminowahirayayamagataminamiminowafujimiomachisakakitakaginaganonakanosakuhokomoronagisoshinanomachiwadauedaiidaharasuwatomiachiaokianankisosakunozawaonsenagematsutakayamashimosuwamatsumotoyamanouchinakagawamochizukiazuminotatsunoobamaomuraseihiunzenosetofutsuikichijiwanagasakiisahayahasamisaikaikawatanasasebohiradokuchinotsugototogitsutsushimashimabarashinkamigotomatsuurayamazoekashibaikomakawaitenrioyodosangokoryoudaojiikarugayamatokoriyamatenkawakatsuragikurotakikawakamimiyakemitsuetakatorikamikitayamayamatotakadahegurishinjokanmakisakuraitawaramotogoseoudanarasoniandokawanishishimoichihigashiyoshinokashiharashimokitayamanosegawayoshinomintsivorytopazsakuragehirnsumomoaseinetopalmail-boxmokurenyoitamuikaojiyagosensanjoaganomyokoseiroagaomishibataniigatanagaokamurakamiuonumayuzawakariwatagamitainaitsunanminamiuonumatochioyahikojoetsuseiroukamosadoizumozakitokamachiitoigawasekikawakashiwazakitsubamemitsukekokonoesaikiusukibeppuusahimeshimakunisakihasamataketatsukumihitaoitahijikusuyufukujukamitsuebungoonobungotakadaibaraniimibizentsuyamaokayamakasaokahayashimayakagemaniwaakaiwamisakishinjotamanotakahashikibichuowakesojanagishookumenannishiawakurakurashikiasakuchisetouchikagaminosatoshotomigusukunakagusukuyaeseizenaurumaiheyaaguniogiminanjokinminamidaitokitanakagusukuyonaguniokinawaishigakikunigamiurasoekadenataramahiraraginozataketomishimojizamamitonakiitomanhigashimotobuyonabarugushikamionnanahanagohaebarukumejimakitadaitonakijinnishiharayomitanginowantokashikiishikawaikedasuitaminohizuminishisakaikananabenodaitoosakasayamayaokishiwadatadaokakaizukatondabayashichihayaakasakakumatorikadomasayamahigashiosakashijonawatehirakatataishimisakitajirihannansennankatanotoyonominatosettsuhigashiyodogawaibarakinosekitachuohigashisumiyoshifujiiderakashiwaraizumiotsutoyonakamatsubaramoriguchiizumisanoshimamototakatsukineyagawahabikinotakaishikawachinaganoyoshinogarikamiminearitaouchiimarihizenogikashimaariakekiyamafukudomikitagatakitahataomachigenkaikanzakinishiaritakyuragisagataratosutakushiroishikaratsuhamatamakouhokukawagoeyoshidasatteogoseirumaasakaurawaogawaniizaomiyayoriiotakishikihonjooganohannohanyuinasaitamaokegawaarakawayoshikawayokozehasudasayamahidakafukayachichibuiwatsukiryokamiyoshimikamiizumifujimiwarabiranzanmiyoshiminanoyashiosakadosugitomisatohigashichichibutodasokakukiyonokazoshiraokakasukabekounosukawajimatsurugashimamiyashirokitamotohatoyamamoroyamahatogayakumagayakawaguchinagatorokamisatomatsubushinamegawatokigawakamikawafujiminohigashimatsuyamakoshigayatokorozawas3isk01isk02ryuohkoseikonanaishorittotakashimamaibarahikonetorahimenishiazaikokagamokotoyasuotsukusatsunagahamamoriyamatoyosatotakatsukinotogawaomihachimanhigashiomiakagiunnanizumogotsuamayatsukakakinokimatsuehamadamasudahikawahikimiokuizumoyasugiyakumomisatotamayuohdahigashiizumookinoshimanishinoshimatsuwanoshimaneshimadafujiedayoshidashimodagotembaiwataatamikosaiyaizuitoizumishimahaibaramakinoharaomaezakikawanehonkannamisusonohigashiizufukuroinumazukawazufujiaraishizuokahamamatsushimizuizunokunimatsuzakimorimachiminamiizunishiizukikugawakakegawafujikawafujinomiyaujiietsugaoyamayaitaohiranikkoashikagakuroisokanumasakurashioyakarasuyamamotegiichikaikaminokawatochigihagamokanogisanobatonasumibunasushiobaranishikatautsunomiyaiwafunemashikoshimotsukeohtawaratakanezawaitanokomatsushimatokushimaichibaminamiaizumiwajikikainanmiyoshinarutomimamugiananmatsushigesanagochishishikuinakagawamachidachiyodakomaefussainagitaitochofufuchuomeotahigashiyamatotoshimaokutamaaogashimakodairaedogawaarakawahachiojishinagawatachikawashibuyasuginamihinodekiyosesumidaoshimanerimamitakahamuraadachinakanomizuhobunkyomegurominatokoganeihigashikurumekokubunjihigashimurayamamusashimurayamatamakitahinochuokotokatsushikakouzushimaogasawaraakishimakunitachishinjukusetagayamusashinohachijoitabashiakirunohinoharachizunanbukotouramisasawakasayonagokogehinoyazutottorinichinansakaiminatokawaharaoyabetairainamiasahinantoimizufuchutakaokakurobeyamadajohanatoyamatonaminyuzenfunahashinakaniikawanamerikawaunazukitogahimiuozufukumitsutateyamakamiichiiwadearidayuasainamitaijikatsuragiaridagawatanabemihamahidakakainankiminomisatoshingushirahamakamitondayurakozakoyagobokitayamawakayamakudoyamahashimotokushimotokozagawahirogawakinokawanachikatsuurarsuseroeoishidasagaeoguniasahinagaitendonanyoobanazawanishikawasakataohkuratozawamikawamamurogawayamagatafunagatatakahatashonaishinjokahokuiideyuzakawanishitsuruokakaminoyamayamanobeshiratakamurayamanakayamakaneyamahigashineyonezawasakegawamitouubeyuuabushimonosekitabuseoshimatoyotaiwakunihikarishunannagatohagihofukudamatsutokuyamashowadoshitsurunanbukoshukaiminami-alpsnirasakikosugeotsukioshinohokutominobuyamanashifuefukichuokofuichikawamisatoyamanakakonakamichitabayamanishikatsuranarusawafujikawahayakawafujiyoshidafujikawaguchikouenohara長野京都岐阜大阪三重群馬千葉滋賀佐賀奈良adednelgaccogogror秋田愛知高知埼玉沖縄栃木熊本岩手青森山梨新潟島根鳥取長崎香川宮城石川大分宮崎茨城山口兵庫山形徳島広島福島福岡岡山富山静岡愛媛福井東京xn--4it168dhatenadiaryxn--vgu402ckawaiishophatenablogcocottenamaste北海道penneehimeiwateversestabachibashigagonnagunmapermahaccaakitaosakauh-ohblushkochiaichifukuikuroncapooitigohyogotokyokyotopunyuthickcheap0t00g00j0mie2-ddaapyawjg0amfemsubxiiboomoobutchueekpgwrgrherskrboyrdyupperunderflierchipsmydnsheavyangryhippygirlyrulez神奈川鹿児島和歌山bambinaxn--nit225kokayamasaitamaxn--k7yn95exn--1lqs03nsapporoparasitelolipopmcxn--efvn9sniigatafukuokatokushimafukushimahiroshimakagoshimafakefurokinawaxn--8pvr4ucoolblogxn--0trq7p7nnkawasakinagasakimiyazakichilloutxn--8ltr62kxn--klty5xpeeweezombiecutegirlxn--rny31hxn--uuwu58axn--ntso0iqx3axn--djrs72d6uytoyamanikitanyantakagawamimozanagoyaboyfriendxn--2m4a15egreaterchowderegoismyamagatafashionstorexn--elqq16hxn--pssu33lsendaimiyagixn--rht27zpecoriaomorisaloonwatsonvivianxn--djty4knobushipigboatnaganopinokoxn--f6qx53asadistvelvetsecretxn--5js045dchicappayamanashiibarakidigickgirlfriendxn--1lqs71dmongolianxn--c3s14mxn--qqqt11mtochigixn--5rtq34kparallelo0o0mondkobesagabonadecaoitanarafoolkilldecimainhiholomosblokilociaoundopupugifutankcrapflopnooroopsmodsholyjeezstripperpepperbittershizuokaxn--rht3dkitakyushureadymadeicurusversusmatrixxn--rht61ehungryfloppygloomycrankyhandcraftedlittlestarxn--klt787dxn--kltx9awhitesnowsunnydaytottorilovepoptheshopbuyshopxn--5rtp49cxn--d5qv7z876cwebaccelxn--kbrq7oxn--4pvxsxn--1ctwolovesickkumamotocatfoodxn--tor131oyokohamawakayamatonkotsuxn--ehqz56nxn--uist22hxn--6btw5axn--kltp7dyamaguchifrenchkisspussycatxn--4it797kxn--uisz3gbabybluexn--zbx025dnetgamersxn--7t0a264ckanagawaxn--6orx2rishikawaxn--ntsq17ghalfmoonschoolbusjellybeanxn--mkru45iusercontentlolitapunkxn--32vp30hsakurastoragehokkaidoshimanecandypopbabymilksupersaleweblikeraindropbackdropwebsozaikikirarahateblodaynightmeneacsccogoormobiinfoaeusxxorgmilcomnetedugovorgcomnetedugovbizinfotmprdorgmilcomnomedugovassnotairespresseassocoopgouvveterinairemedecinpharmaciensorgnetedugovtraorgcomedurepgovmeneperekgacscaiiocogoitoresmshsseoulbusanulsandaeguc01milvkimmvchungnamjeonnamjeonbukeliv-dnsgyeonggijejueliv-cdnincheondaejeongangwongyeongbukgwangjuchungbukgyeongnameliv-apicoeduindorgcomembnetedugovorgmilcomnetedugovjcloudorgcomnetintedugovperbnrinfocooyorgcomnetedugovethipfscanvamypepethw3sstorachakeeneticjoinmcinbrowserdwebcyonnftstoragemyfritzaemewphlxachotelltdorgcomwebsocschngonetintedugrpgovassnomgacsccoorgnetedugovbizinfo123websiteidorgmilcomasnnetedugovconfidmedorgcomplcschnetedugovaccoorgnetgovpresstmassoirseproxaccosoundcasthoptocraftvp4c66orgnetedugovitsmcdirmyboxbarsyedgestacksynologylogintoopencloudnohostwebhopdiskstationi234tcp4hoocgroknoipprivmydsddnsdnsforlohmustransipdscloudfilegear-sgbrasiliafilegearframerbarsybarsyonlinecoprdorgmilcomnomedugovinforgcomnetedugovnameacprorgcomartnetedugovpresseinfoassoinstgouvorgnycedugovbarsydscloudjuorgcomnetedugovminisiteaccoororgcomnetgovorgmilcompronetintedugovbizmuseumnameinfoaerocoopaccoorgcomnetintedugovbizcooporgcomgobneteduorgmilcomnetedugovbiznameaccoorgmilneteduadvgovcoorgcomnetaltgovforgotherhiskeeneticispmanagernomassoprod5476132eastasiacentraluswesteuropewestus2eastus2pnortheurope-01newzealandnorth-01southindia-01southcentralus2-01norwaywest-01eastus2-01westus2-01australiaeast-01italynorth-01israelnorthwest-01swedencentral-01westeurope-01centraluseuap-01taiwannorthwest-01uaecentral-01northcentralusstage-01israelcentral-01mexicocentral-01canadacentral-01austriaeast-01germanywestcentral-01francecentral-01ukwest-01denmarkeast-01polandcentral-01eastus-01westus-01swedensouth-01eastus3-01westus3-01brazilsouth-01centralus-01francesouth-01australiacentral-01westindia-01uaenorth-01jioindiacentral-01canadaeast-01belgiumcentral-01spaincentral-01koreacentral-01chilecentral-01qatarcentral-01westcentralus-01eastus2euap-01norwayeast-01southafricanorth-01brazilsoutheast-01germanynorth-01switzerlandnorth-01switzerlandwest-01japanwest-01southafricawest-01japaneast-01eastasia-01indiasouthcentral-01taiwannorth-01centralindia-01uksouth-01southcentralus-01northcentralus-01eastasiastage-01indonesiacentral-01australiacentral2-01australiasoutheast-01malaysiawest-01koreasouth-01southeastasia-01southeastus5-01northeastus5-01jioindiawest-01rucdnwest1-usfra1-desandboxjls-sto1jls-sto3jls-sto2aglobalabglobalsslmapprodfreetlsmapvpslon-1lon-2ny-1fr-1sg-1ny-2paassnwebpaashostingjelasticnordeste-idcsocuserpagescwebfileblobservicebuscoreatlricnjsjelasticwebsitestoragesezagbinruhuukjptsmyspreadshopmynetnameakamaiorigin-stagingfrom-coipv64dynv6cdn77serveblogadobeaemcloudhicamsprytdnsupno-ipownipde5ovhicpfirewall-gatewaysytesmypsxbarsyusgovcloudapimyamazemyradwebakamaihdsaveincloudfastlylbfrom-lasubsc-paysquare7in-the-bandblackbaudcdnhomelinuxoninfernoctfcloudservebbsdns-dynamiccloudfrontakamai-stagingipifonyham-radio-opsenseeringclickrisingcommunity-profrom-nylocalcertgrafana-devedgesuite-stagingcloudflareanycasteating-organicatlassian-devmydattofeste-iplocaltotorprojectknx-serveredgekeycloudflareglobalcloudyclustercasacamserveftpakamaized-stagingakamaiorigindns-cloudmyeffectboomlabotdashbuyshousestwmailhetemlazure-mobilein-dslthruhereredirectmedynuddnsbouncemesupabaseluyanicloudappakamaicloudfunctionsdebiannhlfanpgafanstatic-accessin-vpnmysynologymafeloappudohomeftptrafficmanagersiteleafseidatmemsetcloudflarecloudaccesskeyword-onazure-apiis-a-chefdoes-itgets-itwebhopselfiphomeipkicks-assedgesuitewindowsserver-ontunnelmolemydissentscrapper-sitecloudflarecnuni5srcfggffiobbzabchrsndenodynuopikddnsvpndnsakadnselastxkinghostvps-hostfastlyhomeunixazureedgeshopselectdontexistmyfritzcloudjiffyalwaysdatasells-itsquaresbroke-itazurefddattolocalat-band-campmeinforumfamilydsazurestaticappsdefinimabplaceddnsaliasdynaliasnow-dnsblogdnsroutingthecloudendofinternetdsmynasakamaiedgemymediapcadobeio-staticakamaiedge-stagingakamaihd-stagingddns-ipprivatizehealthinsurancelive-onkrellianschokokeksmassivegridmysecuritycamerarackmazeserveminecraftfrom-azis-a-geekakamaizedmoonscaleoffice-on-theusgovtrafficmanageradobeioruntimeedgekey-stagingreserve-onlinechannelsdvrdnsdojousgovcloudappcdn77-sslapps-1and1podzoneazurewebsitesdynathomescaleforceyandexcloudvusercontentisa-geekcdn-edgescoaemalcesappwriteazimuthtlonarvobuiltwithrocketnoticeablestorecomwebrecnetperotherfirminfoartslgdloncogoiltdorgmilcolcomplcschgenngonetedugovbiznamefirmmobiacincoorgmilcomnomwebgobnetintedubizinfocomyspreadshopdemongovtransurl123websitehosting-clusterkhplaycistrongsnesosvalervålerxn--vler-qoaossandeheroysandeherøybøboheroyherøyxn--hery-iraxn--b-5gavalerbøboxn--b-5gasandesandexn--hery-iraxn--vler-qoavålerhåreålaahavaofsfvfhlolnlalrlhmfmtmahcostntbuåstrmreigersundmyspreadshopgálsáeidsvolltingvollgildeskalflorøvadsøvardøvanylvenxn--bhccavuotna-k7astrandaxn--kvnangen-k0axn--sknland-fxaxn--mosjen-eyarakkestadhyllestadnannestadvevelstadvaapstenordre-landsondre-landsøndre-landtjieltexn--vrggt-xqadsør-aurdalsor-aurdalheradstordmoldefordeførdeseljefedjeryggehemnexn--krehamn-dxasognegranesøgnebrynetjomevallebykletokkegiskedovretjømehobølvoldasaudatolgasømnaviknadønnasomnadonnatranafrananesnaraumasmolatrænafrænalesjasmølaørstaorstahitrafloraaukraloppafrøyarissasnasahalsagalsaromsaraisaráisafroyasnåsagronghobolfjelltydalårdalardalaskimharamkraanghkekråanghkesorumbarumhurumbærumsørummodumsálátbálátfrognbjugnvåganvagangulenskienløtenlotenstrynvefsnxn--merker-kuaskaunsveiobømlobomloskjåkvardoflorovadsosalatbalatsálatklæbuklabuselbubarduulvikskjakklepprisørxn--nttery-byaeflåeidflahofmilgolholsellomskifetvikdepvgsfhsaskerrisorhamarasnesåsnesrørosrorosxn--slat-5namasoynaroyvaroyluroydyroyaskoyradoyandoyrodoymeloyradøyandøyrødøymeløyaskøylurøydyrøymåsøyværøynærøyhoylandethøylandetdivtasvuodnalørenskoglorenskognesoddtangenxn--tjme-hraxn--smla-hraxn--stjrdal-s1aunjargalillehammerunjárgaxn--hamary-fyadavvenjargaxn--bearalvhki-y4a123hjemmesidegjerdrumxn--brnnysund-m8acxn--tnsberg-q1axn--mlatvuopmi-s4axn--snsa-roaxn--skierv-utaxn--brum-voatysfjordkvafjordeidfjordkvæfjordsongdalenmjondalenmjøndalenxn--gls-elackragerogáŋgaviikagangaviikasørreisasorreisasør-varangersor-varangerxn--risr-iraskiervaxn--frna-woaxn--trna-woakvinesdalleksvikleirvikrøyrvikroyrviksvelvikvenneslaevje-og-hornnessandnessjøenmarnardalvindafjordsandefjordenebakksnillfjordullensvangxn--trany-yuabrønnøysundnamsskoganaustevollxn--stjrdalshalsen-sqbnord-aurdalnord-frontrøgstadtrogstadgrimstadflakstadgjerstadxn--sandy-yuaxn--leagaviika-52bnore-og-uvdalvegarsheixn--rlingen-mxaxn--ggaviika-8ya47hvegårsheikarlsoykvitsoymasfjordenhamaroyinderoyosteroydavvenjárgasauheradguovdageaidnuxn--vre-eiker-k8abronnoysiellakkrødsheradkrodsheradkvinnheradbrønnøyxn--mtta-vrjjat-k7afxn--lrenskog-54akvitsøyvárggátkarlsøyosterøyinderøyhamarøybronnoysundxn--aurskog-hland-jnbbahccavuotnabáhccavuotnagiehtavuoatnastor-elvdalmidtre-gauldalxn--gildeskl-g0akarasjokevenassixn--bievt-0qaxn--yer-znalebesbynessebyxn--hbmer-xqamalselvmålselvxn--unjrga-rtamøre-og-romsdalmore-og-romsdalhareidmelandørlandorlandstrandålgårdsolundalgardafjordåfjorddielddanuorrikautokeinoxn--stre-toten-zcbskodjeaejriestangeliernebamblestokkefauskesnåasesnaasekongsvingerlangevagberlevagxn--flor-jrahattfjelldalostre-totenøstre-totenvestfoldxn--mely-iraálaheadjualaheadjunordreisaxn--troms-zuaxn--lgrd-poacporsangerflatangerstavangerleikangerbremangersamnangergieldakarasjohkaxn--rdy-0nabfrostautsirasnoasatromsaxn--sr-aurdal-l8aflekkefjordjølsterjolsteraremarkhedmarknååmesjevuemienaamesjevuemiexn--vard-jrarollagmeråkermerakerorskogørskogxn--bdddj-mrabdákŋoluoktaxn--osyro-wuaaknoluoktatrysilskjervøymandaljondalbindalrindalmeldalsuldalorkdalsigdalalvdallærdalhurdalsirdalverdallerdallardaloppdalåseralaseralhadselkragerødivttasvuotnaoverhallasteinkjerxn--hnefoss-q1askedsmokorsettromsøxn--dyry-iravestre-totenmuseumxn--sandnessjen-ogbrahkkeravjufylkesbiblbájddarbajddarxn--laheadju-7yarennesøyxn--koluokta-7ya57hxn--hgebostad-g3aleirfjordstorfjordbalsfjordbåtsfjordbatsfjordmuosátbievátloabátkárášjohkanøtterøyxn--mjndalen-64anordkappláhppilahppialstahaugsiljanverranrøykenroykenhaldenlyngenbergenhortenhønefosshonefosstroandinbeiarnvarggatosoyroosøyrotromsoidrettmuosatbievatruovatloabatvoagattynsetnessetxn--indery-fyaskánitskanitraholtråholtxn--ystre-slidre-ujbandebusarpsborgbearduxn--karlsy-fyahordalandjorpelandjørpelanddeatnuringsakersør-odalsor-odalxn--slt-elabringerikeaudnedalnittedalnissedalhemsedalslattumsurnadalxn--blt-elabelverumstjørdalnaustdalhjartdalgjøvikfyresdalhasviknarviklarvikgjovikmalvikgamviklenvikporsgrunnstjordalengerdaldrobakdrøbakxn--msy-ula0hvestvagoyxn--vgan-qoaxn--ryken-vuaxn--lten-graxn--stfold-9xaxn--hpmir-xqaxn--lury-iramálatvuopmimalatvuopmitysværkirkenesbirkenesmoskenesbáidárxn--fjord-lraxn--rdal-poabahcavuotnabáhcavuotnaxn--frde-gralindåsbearalvahkixn--hobl-iraráhkkerávjuxn--loabt-0qavågåáltábodøsundlundraderådeetnetimeholeauregrueoddavagavegaranatanaarnasolasulaaltalekafusavangbergkvamåmliamlibokntinnroangranosenoslobodorøstroststatåmotamotivguprivøyeroyerliermossvossxn--nvuotna-hwalusterlunnermarkerhábmerhabmerhvalerfjalerxn--rholt-mratysvarbaidarfitjargaularhápmirhapmirmelhusfosnesøksnesoksnestysneshemnesevenesflesbergeidsbergtonsbergtønsberglindasxn--sndre-land-0cbnamsosxn--srum-graøystre-slidreoystre-slidrevestre-slidretrondheimbalestrandxn--langevg-jxaaustrheimxn--skjk-soavagsoyaveroysandoykarmoyfinnoytranoyvestbytranbysykkylvenxn--hyanger-q1aspjelkavikandasuoloxn--fl-ziaxn--drbak-wuastathellexn--sr-varanger-ggbtelemarkxn--bhcavuotna-s4axn--porsgu-sta26fčáhcesuolocahcesuoloakrehamnåkrehamnsandøykarmøyfinnøytranøyvågsøyaverøynamdalseidxn--lesund-huabadaddjaxn--vegrshei-c0axn--btsfjord-9zagildeskålporsanguxn--trgstad-r1anávuotnanavuotnahammerfestxn--sgne-graxn--brnny-wuacibestadharstadnarviikaevenáššivestnesgjemnessandnesagdenesrennesoyxn--avery-yuaxn--tysvr-vrabearalváhkikongsbergspydebergrandabergxn--andy-iradavvesiidaxn--krdsherad-m8aporsáŋgufredrikstadbjerkreimringeburennebuaurskog-holandnotteroyxn--vgsy-qoa0jxn--rmskog-byaskierváivelandbyglandfrolandaurlandforsandxn--bjddar-ptamidsundålesundalesundfetsundfarsundovre-eikerøvre-eikerakershusxn--moreke-juasørfoldøstfoldostfoldsorfoldhøyangerhoyangerlevangerorkangertanangerxn--vestvgy-ixa6olillesandulsteinxn--rennesy-v1agranvinskjervoyxn--klbu-woalavagisxn--h-2faxn--ryrvik-byakafjordkåfjordseljordfolkebiblxn--gjvik-wuajevnakerxn--kfjord-iuabudejjuxn--kranghke-b0axn--davvenjrga-y4axn--rland-uuaxn--ldingen-q1axn--mlselv-iuaxn--rady-iraxn--linds-prabrumunddalxn--ygarden-p1amo-i-ranaeidskogrømskogromskoghjelmelandxn--finny-yuaxn--sr-odal-q1axn--skjervy-v1aballangenkvanangenkvænangengratangenxn--hmmrfeasta-s4acvossevangensuohkanxn--rde-ulaxn--mli-tlaxn--ksnes-uuanordlandskanlandskånlandsortlandfuoiskuxn--rros-graxn--hcesuolo-7ya35bxn--eveni-0qa01gagaivuotnagáivuotnaxn--seral-lradrammenmodalenmosjoenjan-mayentorskensteigengloppenxn--snes-poamatta-varjjatxn--sr-fron-q1aomasvuotnajessheimbådåddjåxn--krager-gyaxn--kvfjord-nxaxn--asky-iraxn--snase-nraxn--bidr-5nacholtålenxn--vads-jraxn--jlster-byamosjøenxn--rst-0nastavernxn--ostery-fyaxn--oppegrd-ixaxn--sknit-yqaxn--risa-5naoppegårdskiptvetrendalenholtalenxn--mot-tlaxn--lhppi-xqaxn--holtlen-hxaxn--srreisa-q1akopervikxn--muost-0qaxn--bmlo-grahokksundkvalsundegersundxn--karmy-yuaullensakerxn--hylandet-54axn--kvitsy-fyaxn--bod-2nalangevågberlevågkristiansandxn--rsta-frahornindalstjørdalshalsenstjordalshalsensandnessjoenhámmárfeastaxn--lrdal-srasør-fronsor-fronnord-odalkristiansundmátta-várjjatvestvågøynesoddennotoddenbuskerudøygardenoygardensalangenlavangenralingenrælingenlodingenlødingenleaŋgaviikalaakesvuemieleangaviikauenorgexn--srfold-byaaskvollxn--rskog-uuaxn--nry-yla5gxn--vry-yla5ghammarfeastaxn--rhkkervju-01afxn--givuotna-8yakommunekrokstadelvanedre-eikerhagebostadhægebostadxn--berlevg-jxakviteseidxn--s-1faxn--l-1faxn--nmesjevuemie-tcbafuosskomoårekemoarekexn--lt-liacxn--jrpeland-54asvalbardoppegardholmestrandtvedestrandsogndalsokndalarendalsunndalfolldalxn--krjohka-hwab49jlyngdaletnedalnorddalsaltdalgausdalskedsmovaksdalgjesdalstordalxn--frya-hraaarbortedrangedalxn--smna-graaurskog-hølandxn--vg-yiabtjeldsundhaugesundlindesnesxn--mre-og-romsdal-qqbxn--dnna-gradyntmpheremerseineshacknetenterprisecloudmineaccomaorimāoriorgmilcriiwigennetschoolhealthkiwigovtgeekxn--mori-qsacloudnsparliamentcomedorgcompronetedugovmuseumwebsitekinservicebarsywebsitebuildereerobookheimdnsleapcelleero-stagetechcrscsslorigingohomecdbedeeeiemesecabgngilnlalplchfisiincnnoroptatitmtltruauhulumkdkukskjplvtrgrfrkrhrusesismycynzcznetinteduassoososcloudstgbetaaezaeuhkusjshatenadiarycdn77hoptozaptois-a-knightmyftpno-ipjpnddnssdpdnsspdnsbarsysweetpepperis-a-bruinsfanis-very-sweetservegameis-a-soxfanhomelinuxcdn77-secureservebbsmisconfusedwebredirectblogsitefreedesktopcouchpotatofriestoolforgeaccesscamis-lostreadmyblogsmall-webfedorapeopleserveftpis-a-celticsfanmywirepotagertwmailin-dslsellsyourhomeread-booksfreeddnscable-modemis-savednflfanufcfanmlbfanstuff-4-saleendoftheinternetin-vpnmy-firewallhomeftpis-localis-a-chefboldlygoingnowherewebhopselfipkicks-assroxatunkcamdvrfedoraprojectgotdnsdvrdnsdyndnspubtlspimientahomeunixdontexistfedorainfracloudwmflabsfspagesbmoattachmentsteckidsfamilydsdnsaliasdynaliasnow-dnscloudnsdoomdnsduckdnsblogdnshomednsroutingthecloudendofinternetdsmynasip-dynamicpoivronhttpbinmyfirewallis-very-evilmysecuritycamerais-a-linux-userwmcloudis-a-geektuxfamilyis-a-candidatedoesntexistis-very-badhobby-sitegame-hostaltervistais-foundis-a-patsfandnsdojohepforgepodzonedynservcollegefanis-very-goodfrom-meis-very-niceisa-geeknerdpolacmedsldingorgcomnomgobabonetedupleskaemhlxmyboxrockyprvcydeuxfleurspdnscodebergheyflowstatichostorgmilcomnomgobneteduorgcomeduiorgmilcomngonetedugovcloudns1337ngrokacorggogfamcomwebgobnetedugokgopgkpgovgosbizpasaugumicsopozpapuwmwsrprusiskwpspkppspkmpspokeoiawsawifoumsdnskokwpmuppuppsppiwwiwoowuzswkzoschrzpisdnwzmiuwwitdpssewsseumigugimoirmpinbwinbwiihupporzgwgriwupowwskrwioswuozstarostwokonsulattmpccopruszkowmyspreadshopostrodakartuzyopolegminamediaustkazgorajgoraolawailawalomzawloclradombytomjaworznotargilubinkoninzagantorunkutnokepnonakloczestsopotsanokturekplockslasksklepzarowlukowmedaidgdaorgmilrelcomnomatmgsmartneteduelkgovwawsossexbiztgorysejnytychypomorzeboleslawiechomesklepsdscloudunicloudzakopanelegnicarawa-mazbydgoszczswidnikkrasnikwloclawekbielawamragowograjeworealestatebeskidykaszubymalopolskaprzeworskswiebodzinlecznadfirmaszkolawarmiagdyniamiastakazimierz-dolnymalborkswidnicadlugolekaostrolekapodlasieelblagtravelsimplesitezachpomormielecszczecinnieruchomosciwalbrzychlezajsklublinbedzinpoznanwielunmielnooleckostarachowicedkontopowiatwroclawrybniksuwalkileborkslupskgdanskostrowwlkptarnobrzegtourismwegrowkrakowglogowyou2pilanysamailwrocinfoagroautobeepshopprivlapypiszlodzcfolksecommerce-shopmazurypulawyskoczowrzeszowpomorskiezgierzkaliszolkuszlowiczostrowiecsosnowiecmazowszewodzislawbialowiezazgorzeleckatowicepabianicejelenia-gorawolominkarpaczsieradznowarudaczeladzkonskowolaskierniewiceswinoujscieturystykabieszczadycieszynketrzynolsztynbialystokbabia-goraprochowicewarszawastalowa-wolapolkowicegorlicegliwiceponiatowalimanowalubartowaugustowkobierzyceopocznognieznoszczytnokolobrzegshoparenapodhalebielskoklodzkostargardatwithplayitownnamecoorgnetedugovacorgcomproestnetedugovbiznameislaprofinforechtngrokmedaaaacacpaenglawjurbarbarsykeeneticavocatacctcloudnsorgcomsecplonetedugov123paginaweborgcomnetintedugovnomepublidkinbarsygovx443cloudnsorgmilcomnetedugovcooporgmilcomschnetedugovnamecomcannetlibassoaemclantmcontstoreorgcomnomrecwwwbarsyfirminfoshopartsstackitmyddnswebspacelima-cityacincooxorgedugovbarsybrendlyhbvpsvpsspectrumlandinghostingacppmordoviamcprecbgorgmilcomspbnetintedumsknovgovbirrasmcdirmytismircloudvladimirnalchikadygeyamarinepyatigorskmyjinobashkiriaeurodirvladikavkazna4ugroznykustanaikalmykiacldmaildagestaniranbuildcloudcanvaliaravalwixdevelopmentappwritemigrationneedleverceldatabasestackitcodereplravendbonporterlovableaccoorgmilnetgovcoopmedorgcompubschnetedugovservicemecomygovorggovtvmedorgcomnetedugovinfoedgfacbmlonihkutwpsryxzbdtmacfhppmyspreadshopbrandpartiorgcomfhvpress123minsidaitcouldbeworlanbibkommunalforbundfhskiopsyskomvuxkomforbnaturbruksgymnloginlineorgcomnetedugovenscaledeuusentsurgebotdaorgmilcomnetgovnowteleporthashbangplatformlovablebarsyshopwarebasehoplixbarsyonlinemsf5gitappgitpagewawamscofigma-govcaffeinefigmacanvasoltstscwputerbarsysupportchatgptsquareomniweopensocialcpanelplaycodenotionnovecorewpsquaredpreviewjelecyonbyensrhtfastvpspieboxconvexjouwwebheyflowplatformshloginlinemadethissourcecraftclouderaorgorgcomartedugouvunivmeorgcomnetedugovsurveysstatichfheiyuxs4allprojectmyfastubervibehostapp-ionosdeployagentmecoorgcomschnetedugovbizcncostoreorgmilcomneteduembaixadaconsuladokiraranohoprincipesaotomeheliohobarsystorebaseshopwaresellfyaiabkhaziavologdamordoviapenzalenugsochinavoiexnetspbmsknovnorth-kazakhstanashgabadkareliaarmeniageorgiavladimirnalchikivanovobukharaadygeyakhakassiakalugakrasnodarjambylaktyubinsktroitskbryanskobninskkurganazerbaijanpokrovskbashkiriatselinogradvladikavkazmurmansktulatuvamangyshlaktashkentchimkentgroznykaragandatermezarkhangelskkustanaikalmykiabalashoveast-kazakhstankaracoldagestantogliattibarsyredorgcomgobedumirenknightpointaccoorgjelasticdiscoursecleverappsschacmiincogoornetonlineshopcogoorgmilcomwebnicnetintedugovbiznametestcoorgmilcomnomnetedugovorangecloudpersoindorgcomfinnatnetgovensmincomtourismintlinfox0611oyaorgmilcomnetedugovquickconnectvpnplusnettprequalifymeaddrmyaddrntdllwadlnctvavdrk12orgmilpolbeltelcomwebgennetedutskkepgovbbsbiznameinfocoorgmilcompronetedugovbiznameinfobetter-thanworse-thansakurafromdyndnson-the-webmymailerorgmilurlcomneteduidvgovmydnsgameclubebizmeneacsccogotvorhotelmilmobiinfovodteiflgplkmsmsbcckhincndnvncoztltmkckppzpdprvcvkvlvcrkrkscxuzchernovtsyrivneyaltaodesavolynrovnolutskltdinforgcomnetedugovbizvinnicazhitomirternopilpoltavakropyvnytskyizaporizhzhiasevastopolsebastopoluzhgoroduzhhorodkharkovkharkivvinnytsiakhmelnytskyizaporizhzhecrimeaodessazhytomyrnikolaevcherkassydonetskluganskluhanskkirovogradivano-frankivskchernivtsikrymkievkyivlvivsumyzakarpattiamykolaivcherkasychernigovkhersonchernihivdnipropetrovskdnepropetrovskkhmelnitskiyneacsccogoorusorgmilcomedugovmyspreadshopadimono-ipbarsybarsyonlinelayershiftnh-servretrosnubapicampaignservicelugaffinitylotteryweeklylotteryraffleentrygluglugsmeaccoindependent-inquestnimsitecopropymntltdorgplcschnetgovnhsbarsyindependent-commissionindependent-reviewpolicepublic-inquiryindependent-panelconnhospindependent-inquiryroyal-commissionoraclegovcloudappscck12libaws-govccphxcclibpvtparochchtrcck12libcceatonk12coglibtecgendstmusann-arborwashtenawcck12glghcck12sealibforksolympiabainbridge-islkeyporthoquiamyarrow-pointcentraliaport-townsendsequimport-ludlowrentonsilverdalebremertonredmondsheltonbellevueport-orchardport-angeleskingstonchehalisaberdeengig-harborseattlepoulsboidmdndsddemenegacalamaiavawapailalflnmdcncscohnhmihiviwiriinmntnmocoutvtctmtgunjokakwvnvprarorasmskstxwynykyazisadninsnngosrvis-bymircloudservernamepointtoenscaledland-4-salefreeddnsstuff-4-saleazure-apinoipdatabricksappscloudnsgolffanheliohostazurewebsitesgvorgmilcomgubneteducoorgcomnetd0egvorgmilcomnetedugovmydnsiacostoree12orgmilcomnomwebgobbibrectecnetintedugovraremprendefirminfoartseducok12orgcomnethidnsidacaiiosonlahanamhanoicamauhueorgcompronetintedugovbizbacninhtayninhhoabinhnamdinhtravinhhaiphongvinhlonghaiduongquangnamquangtrithuathienhuequangninhbacgianghaugiangquangbinhsoctrangbentrethanhphohochiminhdanangkontumhatinhkhanhhoathanhhoahealthgialailaocaiyenbaibackanngheanlonganphuyenphuthocanthodaklakdongnainameinfovinhphucdongthapkiengiangtiengiangquangngailaichaulangsonlamdongdaknonghagiangangiangcaobangbinhduongninhthuanbinhthuanbaclieuthaibinhninhbinhbinhdinhtuyenquanghungyenbaria-vungtauthainguyendienbienbinhphuocschbizputerimagine-proxyorgcomnetedugovcloud66advisormypetsdyndnsxn--8dbq2axn--4dbgdty6cxn--5dbhl8dxn--hebda8bxn--80auxn--d1atxn--c1avgxn--o1acxn--o1achxn--90azhxn--55qx5dxn--uc0atvxn--od0algxn--wcvs22dxn--gmqw5axn--mxtq1mxn--12c1fe0brxn--h3cuzk1dixn--12co0c3b4evaxn--12cfi8ixb8lxn--o3cyx2axn--m3ch0j3axn--j1adpxn--90amcxn--90a1afxn--h1ahnxn--j1ael8bxn--h1alizxn--c1avgxn--j1aefxn--80aaa0cvacxn--41acaffeineexeopentunnelbotdashtelebitorgtmaccoagricorgmilnomwebnicngonetaltedugovlawnisschoolgrondaraccoorgmilcomschnetedugovbizinfoprg1-zeropstritonstackitlimazeropsaccoorgmilgovяспборгкоммскбизмирсамаракрымсочиакодпроргобрупрצהלממשלישובאקדמיהองค์กรธุรกิจรัฐบาลศึกษาทหารเน็ต教育網絡組織公司政府個人닷넷한국澳门新闻澳門联通家電嘉里招聘通販닷컴삼성コムგეбгрфеюadcdbdgdidmdsdtdaebedeeegeiejekemenepereseveyegabacalamanauavapaqasazacfbfafgfnfpfwftfbgcgagggegkgngmgsgpgvgtgugilmlnlalclglplsltlhmimjmkmmmomambmcmdmfmgmzmpmsmtmgbbblbsbecccacnclcmcvctcscmhkhghchbhthphshlinikifigiaibicivisikninhnmncnbngnsnpnvntnjoionomobocoaofodorosotoptstttytatbtetgtithtmtltrusuvuaucueuguhulumunufjdjbjtjsjlkmkhkfkdkcktkukskpkgpmpnpkpjpgqaqmqiqsvtvcvbvmvlvrwpwtwzwbwcwawgwkwmwtrsrprgrfrercrbrarnrmrlrkrirhrwsusrssspsgsesbsaslsmsissxmxaxcxuypysylymykygybycyuztzsznzmzkzdzczbzazελευ世界台灣购物公益点看臺灣网络書籍在线网站手机机构大拿游戏信息台湾谷歌慈善商标香港中国餐厅网址中國商城食品微博政务移动集团公司八卦商店健康网店政府时尚佛山中信娱乐广东企业homedepotengineeringاماراتrepublicankuokgroupversicherungchannelcitadelxn--pgbs0dhxn--b4w605ferdstatebankwebsitexn--mgb9awbf亚马逊淡马锡alibabaxn--ngbc5azdxn--mgbbh1axn--45br5cyltoshibabuildworldcloudtradeguideplacespacedancemoviephoneprimesmilebiblestyleappleazurestoreskypegripexn--l1accdrivelottehorsehouseleasechasereisestadahondaomegaaetnaamicaninjanokiamediadeltavodkaedekaosakapizzaslingemailgmailtirolshelltmallfinallegaltotalhotelamfamforumrehabmusicciticricohcoachwatchboschearthfaithirishmiamiarchidubaiguccipraxiみんなストアセールcanonsalononionnikonepsonkoelngreensevencrownikanoradioaudioweiboglobopromogalloyahoociscorodeovideomangobingotokyovolvolottokyotophotosmartsportquesttrusthyattjetztadultcymrubaidutushuxn--kprw13dubankclickblackmerckgroupsharpcheapnowtvxn--h2brj9cקוםհայоргсрбмонкомбелмкдқазрусукрمصرقطرعربكومdadcfdmedwedredphdthdbidpidkrdmsdltdiceonewmeglemoerwecfageacbanbambaaaammakianraspacpaaxawtfbcgaegongingaigvigorgdogdhlmilrilonlaolloluoljllcalgalnflafltelsrlfrllplkimibmcamcombommomifmabbjcbscbwebcabnabtabmlbpubabcbbcnecincpncllcstcwtcpwcnyckfhbzhovhmoiskiobisbitcifyituipinvinwinxincbnbcnmanfangdnmenrenkpnmtnyunrunfununobiojioriohbogmofooboooooacoecoceongoproartistottnttbbtcateatlatvetpetbetnethktmitfitintjothotgotdotbotprueduicujnjyouinknhktdkappsapgapmapdnptopgopllpjmpzipvipripesqtrvdtvitvdevmovgovhivnrwlawsewnewbmwwownowhowdvrftrmtrsfrbarcartvscrseusawsupsubssbsadsddsldssasbmsmlsxxxboxfoxgmxtjxsextaxbuyflydiysoyjoyskypaydaygayxyzanzbizwebersenerpokerlameractortatarsolarລາວคอมไทยtourslocusnexuslexusgiftsbeatsboatspartspressglassswissकॉमनेटtiresgivescodeshomesgamestunesshoescardswalesloansvegastoolsdealsautosparisファッションworkssucksrocksxeroxforexfedexpartylillymoneystudyrugbytoraytoday中文网xn--unup4y天主教飞利浦新加坡enterprises我爱你嘉里大酒店christmasxn--fct429kholdingsxn--8y0a063axn--mgbx4cd0ablifestyleabogadoallstatenetbankكاثوليكxn--s9brj9cxn--gk3at1ebestbuycharityxn--55qx5dmicrosoftpropertybasketballhomegoodscorsicajewelrygallerygrocerysurgerycountrybrusselsverisignferreroxn--czr694bhdfcbankcommbanksoftbankپاكستانپاکستانnextdirectالسعوديهالعليانxn--h2brj9c8cxn--80adxhksshikshaxn--mgbai9azgqp6jcuisinellabarclayscatholicxn--kpry57dcompanyxn--xhq521bblackfridayxn--mgba3a3ejtsandvikxn--d1acj3bacademydownloadمليسياxn--j1amhxn--w4r85el8fhu5dnraipirangaathletaxn--fhbeixn--mgbqly7cvafrzuerichxn--c2br7gஇலங்கைcontractorsxn--io0a7igraphicsinsurancetemasekxn--xkc2al3hye2amotorcyclesphotographydirectoryplumbingxn--vhquvclothingtrainingcleaningwilliamhilllightingxn--mgba3a4f16ashoppingcateringeducationokinawapicturesventuresproductionsxn--9et52uwalmartഭാരതംsupportrealestatecapitalonexn--nqv7fs00emaauspostfloristdentistxn--qxamgodaddybradescobargainsmitsubishikerryhotelsxn--9dbq2axn--3pxu8kimmobilienxn--fjq720axn--mgbtx2bholidaymckinseymadridbusinessbuildershelsinkixn--4gbrimмоскваالسعودیةcoffeedegreelacaixapartnersalsaceofficeabbvievoyageorangegeorgeonlinechromemobilekindlegoogleoraclecircleschulesecureinsurexn--mgba7c0bbn0aestatexn--mgbc0a9azcgcruisehangoutxn--vuq861bxn--42c2d9arexrothfirestoneuniversityxn--nnx388alifeinsuranceextraspaceонлайнvermögensberatersoftwarexn--fiqs8sxn--mgbab2bdxn--w4rs40ltiendaभारतम्africatoyotaotsukasakuracameracreditcardnagoyaconsultingnetworkjunipertheatermonsterprogressivepioneerxn--55qw42gracingdatingvotingvikinglivinggivingxn--bck1b9a5dre4cbrotherweatherjoburgفلسطينlplfinancialxn--clchc0ea0b2g2a9gcdfutbolschoolsocialglobaldentalwoodsidechanelairtelmatteltravelrealtorwebcamstreamభారత్unicomalstomxn--nodexn--6frz82gmuseumfurniturexn--rvc1e0am3exn--mix891faccenturexn--11b4c3dismailineustardiscountquebeccomsecclinicservicesxn--y9a3aqxn--c1avgswatchchurchsearchالاردنmarketingcontacthealthmonashshoujisanofitaipeiamericanexpresssuzukiアマゾンクラウドポイントbhartiグーグルxn--mgberp4a5d4armemorialxn--1qqw23alondonmormoninstitutevisionbostonnortoncouponmaisonamazonvirginberlindesigndurbanolayannissananquanxihuanhitachikaufengardenreisenbayerntechnologydatsunxn--90a3aclatinocasinostudiophysioxn--ngbe9e0apharmacytattootaobaoaramcoexpertreportabbottdirectselectimamatfairwindspictettargetmarketintuittravelersinsurancecreditdupontryukyusuppliesxn--tckwebnpparibasschmidtmerckmsdyodobashirestaurantbridgestonecricketxn--fpcrj9c3dbostikbroadwayattorneylefrakemerckxn--fiq228c5hscareersfarmerswinnersflowersxn--wgbh1cguitarsxn--54b7fta0ccxn--p1acfmakeupgalluplandroverxn--kcrx77d1x4agoldpointbauhausxn--mgbayh7gpahiphopplaystationxn--mgba3a4fraxn--eckvdtc9dhyundaixn--gckr3f0fistanbulticketsmarketsflightschintaireviewsxn--3e0b707ewindowsxn--fiqz9sfinancialxn--fzys8d69uvgmابوظبيdiscoverreviewবাংলাxn--5su34j936bgsgmoscowobserverapartmentsдетиارامكوсайтeurovisionxn--i1b6b1a6a2exn--xkc2dl3a5ee0hتونسموقعبارتڀارتشبكةعمانبيتكعراقreadkredbondlandbandfundfoodprodgoldfordtubecafesafelifeggeeieeefreefagepagegugezonewinememenamegamesaleablebikenikelikecarecbreherefiresaveloveliveblueartedatesitevotecaseluxebofamodaltdaasdatiaayogasinavanashiaasiajavabbvatevavivadatazaraarpacasavisasncfprofmaifsurfgolfdvagsongbingpingwangkpmggoogblogpohlfailcooldellcalldeallidlsarlfilmteamroomfarmimdbarabclubhdfcicbchsbcgmbhrichtechfishdishcashminiernikddiaudiwikimobitaxicitikiwidesiqponskinloanakdnwienopenporncerntownimmolimoolloinfonicofidolegosaxozeroaerovivoautovotomotofastbestresthostpostnextlgbtchatseatgiftmeetdietreitmintrentgentspotscotguruitausohumenucyoubanklinkpinkdclktalksilkbookseekworkrsvpaarpjeepshopcoophelpcamppccwshowbeerstarruhrflirweirhaircarsparsjprshausplusnewstipstoysjobskidsfanspicsdocsxboxamexsexynavycitysonyarmyallybabyplaydeliverybuzzgbizlamborghiniphilipsලංකාಭಾರತfitnessexpresslanxesspfizercenterwalterlawyersoccercareerkosherbrokerlockerdealerdoctorauthorxn--mgbqly7c0a67fbcvermögensberatungjaguarxn--pssy2uxn--hxt814eflickrrepairrogersairbusxn--mgbai9a5eva00beventsyachtsxn--t60b56aভাৰতভারতभारतभारोतviajeshermeshughesxn--j1aefसंगठनvillasଭାରତclaimshotelsભારતzapposphotosjuegoscondostatamotorsgratistennisਭਾਰਤtkmaxxtjmaxxschaeffleryandexxn--80aswgrealtysafetybeautyluxuryxn--3ds443gsupplyfamilyxn--o3cw4hhockeysydneyxn--90aenissayalipayenergycomputeragencyxn--rovu88b電訊盈科xn--gecrj9cstatefarmaccountantaquarelleolayangroup香格里拉xn--p1ai组织机构xn--1ck2e1bxn--mgbt3dhdschwarzموريتانياabudhabinowruzkomatsufujitsuhospitalxn--80asehdbxn--mgbtf8flxn--j6w193gxn--yfro4i67oprudentialxn--flw351ecruisescoursesrecipesxn--e1a4cferrarixn--ses554gxn--wgbl6awatchesstaplessinglesxn--mgbcpq6gpa1axn--otu796dpropertiescreditunionxn--mgbah1a3hjkrdstockholmhisamitsuالسعوديةstcgroupdomainsoriginscouponsbloombergclubmedfroganslimitedxn--80aqecdr1aexposedinternationalequipmentbarclaycardxn--q7ce6axn--mgbi4ecexpprotectionassociatesconstructionxn--cck2b3bxn--45q11candroidfoundationישראלxn--mgbca7dzdocliniqueboutiqueengineerxn--qxa6asystemsfirmdalefashionauctionxn--nqv7finfinitirentalsreliancetradingweddingfishinghostinggentingbookingcookingxn--3hcrj9cgraingerxn--czrs0tdemocratsamsungyokohamaxn--h2breg3evexn--nyqy26alundbeckmelbournevacationssolutionsfrontierxn--vermgensberatung-pwbmanagementxn--cg4bkixn--mgb2ddeslincolnhamburgsandvikcoromantblockbusterairforcebarefootxn--4dbrk0ceinvestmentsfeedbackcommunityxn--ngbrxالبحرينdiamondsamsterdamhealthcareredumbrellaxn--mxtq1mxn--2scrj9cagakhanxn--mgbpl2fhкатоликcaravanசிங்கப்பூர்richardlimortgageamericanfamilyxn--fzc2c9e2cscholarshipssaarlandxn--imr513nvlaanderensamsclubgoodyearkitchenஇந்தியாweatherchannelallfinanzxn--kput3iالسعودیۃxn--90aisxn--efvy88hالجزائرxn--mgbaam7a8hexchangejpmorganxn--tiq49xqyjfidelitysecurityxn--mk1bu44cwanggouxn--fiq64bxn--6qq986b3xlxn--mgbbh1a71exn--80ao21amarshallsxn--5tzm5gtravelerspanasoniclatrobeyoutubeaccountantsxn--rhqv96gxn--cckwcxetdanalyticsxn--ygbi2ammxبازاربھارتسوريةorganicfreseniusسورياxn--9krt00axn--qcka1pmcxn--jlq480n2rgdeloittesciencefinancexn--jvr189mxn--30rr7yhomesensehotmailbaseballfootballleclercboehringerxn--q9jyb4cxn--mix082fاليمنهمراهpolitieسودانايرانایرانnetflixyamaxunxn--lgbbat1ad8jcollegestoragecapetowncolognekerrypropertiesxn--mgbgu82axn--ogbpf8flxn--czru2dwhoswhociprianilasallexn--g2xx48cforsalebanamexaudiblexn--vermgensberater-ctbxn--zfr164bericssonvanguardxn--45brj9cindustriestheatremarriottxn--3bst00mcomparexn--mgberp4a5d4a87gcapitaldigitalالمغربbarcelonashangrilaxn--d1alfcalvinkleinwwwcitysapporokawasakinagoyasendaikobekitakyushuyokohamackjp\";\nexport const rulesRoot = 624;\nexport const exceptionsRoot = 628;\n","// NOTE: kept (intentionally) near-identical to packages/tldts-icann/src/suffix-trie.ts.\n// They are separate copies rather than a shared helper because the lookup is\n// only fast when the typed arrays are module-scope monomorphic globals —\n// closing over them (a shared factory) measured ~20% slower. The ICANN build\n// also specializes (constant mask, no isIcann/isPrivate). Keep the two in sync.\nimport {\n fastPathLookup,\n IPublicSuffix,\n ISuffixLookupOptions,\n} from 'tldts-core';\nimport {\n edgeChild,\n edgeLength,\n edgeStart,\n exceptionsRoot,\n labelText,\n nodeFlags,\n rulesRoot,\n} from './data/trie';\n\nconst enum RULE_TYPE {\n ICANN = 1,\n PRIVATE = 2,\n}\n\n// `edgeOffset` (where each label starts in `labelText`), `edgeHash` (djb2 of\n// each label) and `wildcardEdge` (each node's '*' edge, or -1) are derived once\n// at load instead of being shipped: the bundle then carries only the\n// compressible `labelText` + structure, while the lookup binary-searches\n// integer hashes. The cost is a single ~1ms pass at first import — cheaper than\n// the object trie it replaces. Kept at module scope (not captured in a closure)\n// so V8 treats the typed arrays as fast monomorphic globals.\nconst numberOfNodes = nodeFlags.length;\nconst numberOfEdges = edgeLength.length;\nconst edgeOffset = new Uint32Array(numberOfEdges);\nconst edgeHash = new Uint32Array(numberOfEdges);\nconst wildcardEdge = new Int32Array(numberOfNodes).fill(-1);\nfor (let node = 0, offset = 0; node < numberOfNodes; node += 1) {\n for (let edge = edgeStart[node]!; edge < edgeStart[node + 1]!; edge += 1) {\n edgeOffset[edge] = offset;\n const end = offset + edgeLength[edge]!;\n let hash = 5381;\n for (let i = end - 1; i >= offset; i -= 1) {\n hash = (hash * 33) ^ labelText.charCodeAt(i);\n }\n edgeHash[edge] = hash >>> 0;\n if (\n edgeLength[edge] === 1 &&\n labelText.charCodeAt(offset) === 42 /* '*' */\n ) {\n wildcardEdge[node] = edge;\n }\n offset = end;\n }\n}\n\n// Result of the last `walk`, kept in module scope to avoid allocating a match\n// object. Safe because lookups are synchronous and read right after `walk`.\nlet matchNode = -1;\nlet matchStart = 0;\nlet matchEnd = 0;\n\n/**\n * True if edge `edge`'s label equals `hostname[start, start + length)`.\n */\nfunction labelEquals(\n edge: number,\n hostname: string,\n start: number,\n length: number,\n): boolean {\n if (edgeLength[edge] !== length) {\n return false;\n }\n const offset = edgeOffset[edge]!;\n for (let i = 0; i < length; i += 1) {\n if (labelText.charCodeAt(offset + i) !== hostname.charCodeAt(start + i)) {\n return false;\n }\n }\n return true;\n}\n\n/**\n * Find the child edge of `node` whose label is `hostname[start, start + length)`.\n * Edges are sorted by hash, so binary-search the hash then verify the label\n * (scanning the rare run of equal hashes). Returns the edge index or -1.\n */\nfunction findEdge(\n node: number,\n hash: number,\n hostname: string,\n start: number,\n length: number,\n): number {\n let lo = edgeStart[node]!;\n let hi = edgeStart[node + 1]!;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n const value = edgeHash[mid]!;\n if (value < hash) {\n lo = mid + 1;\n } else if (value > hash) {\n hi = mid;\n } else {\n for (let e = mid; e >= lo && edgeHash[e] === hash; e -= 1) {\n if (labelEquals(e, hostname, start, length)) return e;\n }\n for (let e = mid + 1; e < hi && edgeHash[e] === hash; e += 1) {\n if (labelEquals(e, hostname, start, length)) return e;\n }\n return -1;\n }\n }\n return -1;\n}\n\n/**\n * Walk `hostname`'s labels right-to-left from `root`, recording the deepest\n * node whose flag passes `allowedMask` (with the label boundaries of that match\n * in `matchStart`/`matchEnd`). Returns whether any match was found.\n */\nfunction walk(hostname: string, root: number, allowedMask: number): boolean {\n let node = root;\n let end = hostname.length;\n let hash = 5381;\n matchNode = -1;\n for (let i = hostname.length - 1; i >= 0; i -= 1) {\n const code = hostname.charCodeAt(i);\n if (code === 46 /* '.' */) {\n const start = i + 1;\n let edge = findEdge(node, hash >>> 0, hostname, start, end - start);\n if (edge === -1) {\n edge = wildcardEdge[node]!;\n }\n if (edge === -1) {\n return matchNode !== -1;\n }\n node = edgeChild[edge]!;\n if ((nodeFlags[node]! & allowedMask) !== 0) {\n matchNode = node;\n matchStart = start;\n matchEnd = end;\n }\n end = i;\n hash = 5381;\n } else {\n hash = (hash * 33) ^ code;\n }\n }\n\n // Left-most label: hostname[0, end). Same find/descend/record as the loop —\n // duplicated rather than folded into the loop (via `i >= -1`) because that\n // extra per-character branch measured slightly slower on the hot path.\n let edge = findEdge(node, hash >>> 0, hostname, 0, end);\n if (edge === -1) {\n edge = wildcardEdge[node]!;\n }\n if (edge !== -1) {\n node = edgeChild[edge]!;\n if ((nodeFlags[node]! & allowedMask) !== 0) {\n matchNode = node;\n matchStart = 0;\n matchEnd = end;\n }\n }\n return matchNode !== -1;\n}\n\n/**\n * Check if `hostname` has a valid public suffix in the trie.\n */\nexport default function suffixLookup(\n hostname: string,\n options: ISuffixLookupOptions,\n out: IPublicSuffix,\n): void {\n if (fastPathLookup(hostname, options, out)) {\n return;\n }\n\n const allowedMask =\n (options.allowPrivateDomains ? RULE_TYPE.PRIVATE : 0) |\n (options.allowIcannDomains ? RULE_TYPE.ICANN : 0);\n\n // Exceptions have priority and strip their own left-most label (e.g. the\n // rule '!www.ck' makes the suffix of 'www.ck' be 'ck').\n if (walk(hostname, exceptionsRoot, allowedMask)) {\n out.isIcann = (nodeFlags[matchNode]! & RULE_TYPE.ICANN) !== 0;\n out.isPrivate = (nodeFlags[matchNode]! & RULE_TYPE.PRIVATE) !== 0;\n out.publicSuffix = hostname.slice(matchEnd + 1);\n return;\n }\n\n if (walk(hostname, rulesRoot, allowedMask)) {\n out.isIcann = (nodeFlags[matchNode]! & RULE_TYPE.ICANN) !== 0;\n out.isPrivate = (nodeFlags[matchNode]! & RULE_TYPE.PRIVATE) !== 0;\n out.publicSuffix = hostname.slice(matchStart);\n return;\n }\n\n // No match: the prevailing '*' rule makes the right-most label the suffix.\n out.isIcann = false;\n out.isPrivate = false;\n const lastDot = hostname.lastIndexOf('.');\n out.publicSuffix = lastDot === -1 ? hostname : hostname.slice(lastDot + 1);\n}\n","import {\n FLAG,\n getEmptyResult,\n IOptions,\n IResult,\n parseImpl,\n resetResult,\n} from 'tldts-core';\n\nimport suffixLookup from './src/suffix-trie';\n\n// For all methods but 'parse', it does not make sense to allocate an object\n// every single time to only return the value of a specific attribute. To avoid\n// this un-necessary allocation, we use a global object which is re-used.\nconst RESULT: IResult = getEmptyResult();\n\nexport function parse(url: string, options?: Partial<IOptions>): IResult {\n return parseImpl(url, FLAG.ALL, suffixLookup, options, getEmptyResult());\n}\n\nexport function getHostname(\n url: string,\n options?: Partial<IOptions>,\n): string | null {\n /*@__INLINE__*/ resetResult(RESULT);\n return parseImpl(url, FLAG.HOSTNAME, suffixLookup, options, RESULT).hostname;\n}\n\nexport function getPublicSuffix(\n url: string,\n options?: Partial<IOptions>,\n): string | null {\n /*@__INLINE__*/ resetResult(RESULT);\n return parseImpl(url, FLAG.PUBLIC_SUFFIX, suffixLookup, options, RESULT)\n .publicSuffix;\n}\n\nexport function getDomain(\n url: string,\n options?: Partial<IOptions>,\n): string | null {\n /*@__INLINE__*/ resetResult(RESULT);\n return parseImpl(url, FLAG.DOMAIN, suffixLookup, options, RESULT).domain;\n}\n\nexport function getFullDomain(\n url: string,\n options?: Partial<IOptions>,\n): string | null {\n /*@__INLINE__*/ resetResult(RESULT);\n const result = parseImpl(url, FLAG.DOMAIN, suffixLookup, options, RESULT);\n // The hostname *is* the full domain (subdomain + domain) whenever a\n // registrable domain exists; gate on `domain` so non-registrable inputs\n // (IPs, suffix-less or invalid hostnames) return `null` like `getDomain`.\n return result.domain === null ? null : result.hostname;\n}\n\nexport function getSubdomain(\n url: string,\n options?: Partial<IOptions>,\n): string | null {\n /*@__INLINE__*/ resetResult(RESULT);\n return parseImpl(url, FLAG.SUB_DOMAIN, suffixLookup, options, RESULT)\n .subdomain;\n}\n\nexport function getDomainWithoutSuffix(\n url: string,\n options?: Partial<IOptions>,\n): string | null {\n /*@__INLINE__*/ resetResult(RESULT);\n return parseImpl(url, FLAG.ALL, suffixLookup, options, RESULT)\n .domainWithoutSuffix;\n}\n","/**\n * What a Google Ads criterion targets or excludes — one shape for every place a criterion lives.\n *\n * A criterion is the same thing wherever it sits: a placement is `{ placement: { url } }` on a\n * campaign, an ad group, the account's exclusions and a placement exclusion list alike. So the spec\n * (`CriterionSpec`) and the one function that turns it into Google's oneof (`buildCriterion`) are\n * shared by every op that carries one — campaign criteria, ad-group criteria, account exclusions,\n * list members, audience attaches and (6h) asset-group signals — and so is the table of where each\n * type may go.\n *\n * Where a type may go is two tables, both what Google ANSWERED rather than what its docs imply:\n *\n * - `CRITERION_PLACEMENTS` — the shape of the API itself. Google's CampaignCriterion has no\n * `audience` field, AdGroupCriterion has no `proximity` / `ipBlock` / `device`…, so those pairs are\n * refused by the schema whatever the campaign.\n * - `CRITERIA_BY_CHANNEL` — what each campaign type accepts at each level, probed validate-only on\n * v25 against 3865083115 (2026-10-09): every type × campaign / ad group × target / exclude on a\n * Search (with a dynamic ad group), Display, Demand Gen, Performance Max and Shopping campaign.\n * Checked at stage time, once the campaign's type is known. A channel with no row (App, Travel,\n * Hotel, Video) refuses nothing: publish is the backstop there, like the bidding matrix.\n */\nimport { parse as parseHost } from \"tldts\";\nimport { z } from \"zod\";\nimport { GEO_TARGET_COUNTRIES, LANGUAGE_CONSTANTS } from \"./geo-constants\";\nimport {\n DAYS_OF_WEEK,\n DEVICE_TYPES,\n GEO_TARGET_CONSTANT_REGEX,\n GOOGLE_ADS_LIMITS,\n type GoogleSharedSetType,\n LANGUAGE_CONSTANT_REGEX,\n NUMERIC_ID_REGEX,\n RESOURCE_NAME_REGEX,\n TEMP_REF_REGEX,\n} from \"./limits\";\nimport type { GoogleDraftEntity } from \"./ops\";\n\n// --- Enums ---\n\nexport const AGE_RANGES = [\n \"AGE_RANGE_18_24\",\n \"AGE_RANGE_25_34\",\n \"AGE_RANGE_35_44\",\n \"AGE_RANGE_45_54\",\n \"AGE_RANGE_55_64\",\n \"AGE_RANGE_65_UP\",\n \"AGE_RANGE_UNDETERMINED\",\n] as const;\nexport const GENDERS = [\"MALE\", \"FEMALE\", \"UNDETERMINED\"] as const;\nexport const PARENTAL_STATUSES = [\"PARENT\", \"NOT_A_PARENT\", \"UNDETERMINED\"] as const;\nexport const INCOME_RANGES = [\n \"INCOME_RANGE_0_50\",\n \"INCOME_RANGE_50_60\",\n \"INCOME_RANGE_60_70\",\n \"INCOME_RANGE_70_80\",\n \"INCOME_RANGE_80_90\",\n \"INCOME_RANGE_90_UP\",\n \"INCOME_RANGE_UNDETERMINED\",\n] as const;\nconst BRAND_SUITABILITY_LABELS = [\n \"BRAND_SUITABILITY_CONTENT_FOR_FAMILIES\",\n \"BRAND_SUITABILITY_GAMES_FIGHTING\",\n \"BRAND_SUITABILITY_GAMES_MATURE\",\n \"BRAND_SUITABILITY_HEALTH_SENSITIVE\",\n \"BRAND_SUITABILITY_HEALTH_SOURCE_UNDETERMINED\",\n \"BRAND_SUITABILITY_NEWS_RECENT\",\n \"BRAND_SUITABILITY_NEWS_SENSITIVE\",\n \"BRAND_SUITABILITY_NEWS_SOURCE_NOT_FEATURED\",\n \"BRAND_SUITABILITY_POLITICS\",\n \"BRAND_SUITABILITY_RELIGION\",\n] as const;\n/** Google's `ContentLabelType` values an exclusion can name (v25). */\nexport const CONTENT_LABELS = [\n \"SEXUALLY_SUGGESTIVE\",\n \"BELOW_THE_FOLD\",\n \"PARKED_DOMAIN\",\n \"JUVENILE\",\n \"PROFANITY\",\n \"TRAGEDY\",\n \"VIDEO\",\n \"VIDEO_RATING_DV_G\",\n \"VIDEO_RATING_DV_PG\",\n \"VIDEO_RATING_DV_T\",\n \"VIDEO_RATING_DV_MA\",\n \"VIDEO_NOT_YET_RATED\",\n \"EMBEDDED_VIDEO\",\n \"LIVE_STREAMING_VIDEO\",\n \"SOCIAL_ISSUES\",\n ...BRAND_SUITABILITY_LABELS,\n] as const;\n/** Account-wide only: a campaign answers CANNOT_EXCLUDE_CRITERION (probed v25). */\nconst ACCOUNT_ONLY_CONTENT_LABELS: ReadonlySet<string> = new Set(BRAND_SUITABILITY_LABELS);\n/** Campaign only: the account answers CANNOT_EXCLUDE_CRITERION. */\nconst CAMPAIGN_ONLY_CONTENT_LABELS: ReadonlySet<string> = new Set([\"VIDEO\"]);\nexport const PROXIMITY_RADIUS_UNITS = [\"KILOMETERS\", \"MILES\"] as const;\nexport const WEBPAGE_OPERANDS = [\"URL\", \"CATEGORY\", \"PAGE_TITLE\", \"PAGE_CONTENT\", \"CUSTOM_LABEL\"] as const;\nexport const WEBPAGE_OPERATORS = [\"EQUALS\", \"CONTAINS\"] as const;\nconst SCHEDULE_MINUTES = [\"ZERO\", \"FIFTEEN\", \"THIRTY\", \"FORTY_FIVE\"] as const;\nconst MINUTE_DIGITS: Record<(typeof SCHEDULE_MINUTES)[number], string> = {\n ZERO: \"00\",\n FIFTEEN: \"15\",\n THIRTY: \"30\",\n FORTY_FIVE: \"45\",\n};\n\n// --- Primitives ---\n\nconst refSchema = z.union([\n z.string().regex(RESOURCE_NAME_REGEX, \"expected a customers/…/…/… resource name\"),\n z.string().regex(NUMERIC_ID_REGEX, \"expected a numeric id\"),\n z.string().regex(TEMP_REF_REGEX, \"expected a g_temp_* reference\"),\n]);\n/** A reference that must already exist in the account — nothing in a draft can create it. */\nconst existingRefSchema = z.union([\n z.string().regex(RESOURCE_NAME_REGEX, \"expected a customers/…/…/… resource name\"),\n z.string().regex(NUMERIC_ID_REGEX, \"expected a numeric id\"),\n]);\n/** A global constant (`topicConstants/5` or `5`). */\nfunction constantSchema(collection: string) {\n return z.union([z.string().regex(new RegExp(`^${collection}/\\\\d+$`)), z.string().regex(NUMERIC_ID_REGEX)]);\n}\n\n/**\n * Google's `bid_modifier`: \"The modifier must be in the range 0.1 - 10.0. Use 0 to opt out of a\n * Device type.\" So 0 (stop serving on it) and 0.1–10.0 are valid; the (0, 0.1) gap is not.\n */\nexport const bidModifierSchema = z\n .number()\n .min(0)\n .max(10)\n .refine((v) => v === 0 || v >= 0.1, {\n message: \"bid modifier must be 0 (exclude the device) or between 0.1 and 10.0\",\n });\n\n/** Google takes a placement only on a host under a real public suffix (`spam.example`, `localhost` are refused). */\nfunction isPlacementSite(url: string): boolean {\n const host = parseHost(url);\n return !/\\s/.test(url) && host.isIcann === true && host.domain !== null;\n}\n\n// --- The spec union ---\n\n/** Every criterion but a device: 0 opts a device out and is refused on anything else. */\nexport const criterionBidModifierSchema = z\n .number()\n .min(0.1, \"bid modifier must be between 0.1 and 10.0 — only a device takes 0\")\n .max(10);\n\nconst bid = { bidModifier: criterionBidModifierSchema.optional() };\nconst deviceBid = { bidModifier: bidModifierSchema.optional() };\n\nconst criterionSchemas = [\n z.strictObject({\n criterionType: z.literal(\"location\"),\n geoTargetConstant: z.union([z.string().regex(GEO_TARGET_CONSTANT_REGEX), z.string().regex(NUMERIC_ID_REGEX)]),\n ...bid,\n }),\n z.strictObject({\n criterionType: z.literal(\"language\"),\n languageConstant: z.union([z.string().regex(LANGUAGE_CONSTANT_REGEX), z.string().regex(NUMERIC_ID_REGEX)]),\n }),\n z.strictObject({\n criterionType: z.literal(\"adSchedule\"),\n dayOfWeek: z.enum(DAYS_OF_WEEK),\n startHour: z.number().int().min(0).max(23),\n startMinute: z.enum(SCHEDULE_MINUTES).default(\"ZERO\"),\n endHour: z.number().int().min(0).max(24),\n endMinute: z.enum(SCHEDULE_MINUTES).default(\"ZERO\"),\n ...bid,\n }),\n z.strictObject({ criterionType: z.literal(\"device\"), device: z.enum(DEVICE_TYPES), ...deviceBid }),\n /** A radius around a point (latitude/longitude in degrees) or around an address. */\n z.strictObject({\n criterionType: z.literal(\"proximity\"),\n latitude: z.number().min(-90).max(90).optional(),\n longitude: z.number().min(-180).max(180).optional(),\n address: z\n .strictObject({\n streetAddress: z.string().min(1).optional(),\n cityName: z.string().min(1).optional(),\n postalCode: z.string().min(1).optional(),\n countryCode: z.string().length(2),\n })\n .optional(),\n radius: z.number().positive(),\n radiusUnits: z.enum(PROXIMITY_RADIUS_UNITS),\n ...bid,\n }),\n /** A website, app or YouTube page the ads show on (`example.com`, `example.com/news`). */\n z.strictObject({\n criterionType: z.literal(\"placement\"),\n url: z.string().min(1).refine(isPlacementSite, {\n error:\n 'a placement is a website address with a real domain ending, like example.com or example.com/news — Google refuses any other (\"Placement URL has wrong format\")',\n }),\n ...bid,\n }),\n /** A mobile app by Google's id: `1-<appStoreId>` for iOS, `2-<packageName>` for Android. */\n z.strictObject({\n criterionType: z.literal(\"mobileApp\"),\n appId: z.string().regex(/^[12]-.+$/, \"appId is 1-<App Store id> for iOS or 2-<package name> for Android\"),\n ...bid,\n }),\n z.strictObject({\n criterionType: z.literal(\"mobileAppCategory\"),\n mobileAppCategoryConstant: constantSchema(\"mobileAppCategoryConstants\"),\n ...bid,\n }),\n z.strictObject({ criterionType: z.literal(\"youtubeChannel\"), channelId: z.string().min(1), ...bid }),\n z.strictObject({ criterionType: z.literal(\"youtubeVideo\"), videoId: z.string().min(1), ...bid }),\n z.strictObject({ criterionType: z.literal(\"topic\"), topicConstant: constantSchema(\"topicConstants\"), ...bid }),\n z.strictObject({ criterionType: z.literal(\"ageRange\"), ageRange: z.enum(AGE_RANGES), ...bid }),\n z.strictObject({ criterionType: z.literal(\"gender\"), gender: z.enum(GENDERS), ...bid }),\n z.strictObject({ criterionType: z.literal(\"parentalStatus\"), parentalStatus: z.enum(PARENTAL_STATUSES), ...bid }),\n z.strictObject({ criterionType: z.literal(\"incomeRange\"), incomeRange: z.enum(INCOME_RANGES), ...bid }),\n z.strictObject({ criterionType: z.literal(\"ipBlock\"), ipAddress: z.string().min(1) }),\n z.strictObject({ criterionType: z.literal(\"contentLabel\"), contentLabel: z.enum(CONTENT_LABELS) }),\n z.strictObject({ criterionType: z.literal(\"carrier\"), carrierConstant: constantSchema(\"carrierConstants\") }),\n z.strictObject({\n criterionType: z.literal(\"operatingSystem\"),\n operatingSystemVersionConstant: constantSchema(\"operatingSystemVersionConstants\"),\n }),\n /** Pages of the advertiser's own site, for Dynamic Search Ads targeting or URL exclusions. */\n z.strictObject({\n criterionType: z.literal(\"webpage\"),\n name: z.string().min(1).max(255),\n conditions: z\n .array(\n z.strictObject({\n operand: z.enum(WEBPAGE_OPERANDS),\n operator: z.enum(WEBPAGE_OPERATORS).optional(),\n argument: z.string().min(1),\n }),\n )\n .min(1)\n .max(3),\n }),\n /** A BRANDS shared set (`keyword-lists create --type BRANDS`), attached as an inclusion or exclusion. */\n z.strictObject({ criterionType: z.literal(\"brandList\"), sharedSet: refSchema }),\n /** A member of a BRANDS list: Google's brand entity id (`/g/11txzrylsb`, from `baker ads google brands`). */\n z.strictObject({ criterionType: z.literal(\"brand\"), entityId: z.string().regex(/^\\/[a-z]\\/\\w+$/) }),\n z.strictObject({ criterionType: z.literal(\"userList\"), userList: refSchema, ...bid }),\n z.strictObject({ criterionType: z.literal(\"userInterest\"), userInterest: existingRefSchema, ...bid }),\n z.strictObject({ criterionType: z.literal(\"customAudience\"), customAudience: existingRefSchema, ...bid }),\n /** A Demand Gen ad group's one combined audience (the `audiences/{id}` resource). */\n z.strictObject({ criterionType: z.literal(\"audience\"), audience: existingRefSchema }),\n /** An ACCOUNT_LEVEL_NEGATIVE_KEYWORDS list applied to the whole account (account exclusions only). */\n z.strictObject({ criterionType: z.literal(\"negativeKeywordList\"), sharedSet: refSchema }),\n /** A Performance Max search theme (asset-group signal only). */\n z.strictObject({\n criterionType: z.literal(\"searchTheme\"),\n text: z.string().min(1).max(GOOGLE_ADS_LIMITS.assetGroupSignal.searchThemeTextMax),\n }),\n] as const;\n\nexport const LOCATION_GROUP_MESSAGE =\n 'Targeting near business locations (a location group) needs the account\\'s location assets, which Baker cannot stage yet. Target a radius instead — `criterionType: \"proximity\"` with an address or latitude/longitude and a radius — or tell the user to add the business locations in Google Ads; carry on with the rest of the job.';\n\n/** Criterion types that are not part of the union, each answered with the way out. */\nconst RETIRED_CRITERION_TYPES: Readonly<Record<string, string>> = {\n locationGroup: LOCATION_GROUP_MESSAGE,\n keyword:\n \"Keywords are not criteria here: target them with `baker ads google keywords add`, exclude them with `baker ads google negative-keywords add`, or put them in a list with `baker ads google keyword-lists add`.\",\n};\n\nexport const criterionSpecSchema = z.discriminatedUnion(\"criterionType\", criterionSchemas, {\n error: (issue) => {\n const input = issue.input as { criterionType?: unknown } | undefined;\n const type = typeof input?.criterionType === \"string\" ? input.criterionType : undefined;\n return type ? RETIRED_CRITERION_TYPES[type] : undefined;\n },\n});\nexport type CriterionSpec = z.infer<typeof criterionSpecSchema>;\nexport type CriterionType = CriterionSpec[\"criterionType\"];\nexport const CRITERION_TYPES = criterionSchemas.map((schema) => schema.shape.criterionType.value) as CriterionType[];\n\n/** Cross-field rules a discriminated-union option cannot carry itself. */\nexport function criterionSpecIssues(spec: CriterionSpec): Array<{ path: string[]; message: string }> {\n if (spec.criterionType === \"adSchedule\" && spec.endHour === 24 && spec.endMinute !== \"ZERO\") {\n return [{ path: [\"endMinute\"], message: \"endHour 24 (midnight) cannot have a non-zero endMinute\" }];\n }\n if (spec.criterionType === \"proximity\") {\n const point = spec.latitude !== undefined || spec.longitude !== undefined;\n const both = spec.latitude !== undefined && spec.longitude !== undefined;\n if (point === (spec.address !== undefined) || (point && !both)) {\n return [\n {\n path: [],\n message:\n \"a radius is around either a point (latitude AND longitude) or an address (countryCode plus street, city or postal code) — give exactly one\",\n },\n ];\n }\n }\n return [];\n}\n\n// --- Where each type may go (the API's own shape) ---\n\nexport type CriterionLevel = \"campaign\" | \"adGroup\" | \"account\" | \"sharedSet\" | \"assetGroup\";\ntype Polarity = \"target\" | \"exclude\";\nconst BOTH: readonly Polarity[] = [\"target\", \"exclude\"];\nconst TARGET: readonly Polarity[] = [\"target\"];\nconst EXCLUDE: readonly Polarity[] = [\"exclude\"];\n\ninterface CriterionPlacement {\n label: string;\n campaign?: readonly Polarity[];\n adGroup?: readonly Polarity[];\n /** Account-level exclusion (`CustomerNegativeCriterion`). */\n account?: boolean;\n /** The shared-set types it can be a member of. */\n sharedSet?: readonly GoogleSharedSetType[];\n assetGroup?: boolean;\n}\n\nconst PLACEMENT_LISTS: readonly GoogleSharedSetType[] = [\"NEGATIVE_PLACEMENTS\"];\n\nexport const CRITERION_PLACEMENTS: Readonly<Record<CriterionType, CriterionPlacement>> = {\n location: { label: \"location\", campaign: BOTH, adGroup: BOTH },\n language: { label: \"language\", campaign: TARGET, adGroup: TARGET },\n adSchedule: { label: \"ad schedule\", campaign: TARGET },\n // A device is never excluded: a bid adjustment of 0 is how it stops serving.\n device: { label: \"device\", campaign: TARGET },\n proximity: { label: \"radius\", campaign: TARGET },\n placement: { label: \"placement\", campaign: EXCLUDE, adGroup: BOTH, account: true, sharedSet: PLACEMENT_LISTS },\n mobileApp: { label: \"app\", campaign: EXCLUDE, adGroup: BOTH, account: true, sharedSet: PLACEMENT_LISTS },\n mobileAppCategory: {\n label: \"app category\",\n campaign: EXCLUDE,\n adGroup: BOTH,\n account: true,\n sharedSet: PLACEMENT_LISTS,\n },\n youtubeChannel: {\n label: \"YouTube channel\",\n campaign: EXCLUDE,\n adGroup: BOTH,\n account: true,\n sharedSet: PLACEMENT_LISTS,\n },\n youtubeVideo: {\n label: \"YouTube video\",\n campaign: EXCLUDE,\n adGroup: BOTH,\n account: true,\n sharedSet: PLACEMENT_LISTS,\n },\n topic: { label: \"topic\", campaign: EXCLUDE, adGroup: BOTH },\n ageRange: { label: \"age\", campaign: EXCLUDE, adGroup: BOTH },\n gender: { label: \"gender\", campaign: EXCLUDE, adGroup: BOTH },\n parentalStatus: { label: \"parental status\", campaign: EXCLUDE, adGroup: BOTH },\n incomeRange: { label: \"household income\", campaign: EXCLUDE, adGroup: BOTH },\n ipBlock: { label: \"IP address\", campaign: EXCLUDE, account: true },\n contentLabel: { label: \"content type\", campaign: EXCLUDE, account: true },\n carrier: { label: \"mobile carrier\", campaign: TARGET },\n operatingSystem: { label: \"operating system\", campaign: TARGET },\n webpage: { label: \"web pages\", campaign: EXCLUDE, adGroup: BOTH },\n brandList: { label: \"brand list\", campaign: BOTH, adGroup: TARGET },\n brand: { label: \"brand\", sharedSet: [\"BRANDS\"] },\n negativeKeywordList: { label: \"account negative keyword list\", account: true },\n userList: { label: \"audience list\", campaign: BOTH, adGroup: BOTH },\n userInterest: { label: \"interest\", campaign: BOTH, adGroup: BOTH },\n customAudience: { label: \"custom segment\", campaign: BOTH, adGroup: BOTH },\n audience: { label: \"audience\", adGroup: TARGET, assetGroup: true },\n searchTheme: { label: \"search theme\", assetGroup: true },\n};\n\n/**\n * Audience segments go through `audiences attach`, never a generic criterion op: on a campaign or ad\n * group their effect depends on the parent's Observation / Targeting setting, and that op is the one\n * that reads it, warns, and stages the switch.\n */\nexport const AUDIENCE_SEGMENT_TYPES: ReadonlySet<CriterionType> = new Set([\n \"userList\",\n \"userInterest\",\n \"customAudience\",\n]);\nexport const AUDIENCE_SEGMENT_MESSAGE =\n \"Audience lists, interests and custom segments go on a campaign or ad group with `baker ads google audiences attach` (`--user-list`, `--interest` or `--custom-segment`) — that command reads whether the parent narrows its reach to them (Targeting) or only adjusts bids (Observation) and stages the switch. Use it instead.\";\n\nconst LEVEL_WORDS: Readonly<Record<CriterionLevel, string>> = {\n campaign: \"a campaign\",\n adGroup: \"an ad group\",\n account: \"the account's exclusions\",\n sharedSet: \"a list\",\n assetGroup: \"an asset group signal\",\n};\n\nconst PAST: Readonly<Record<Polarity, string>> = { target: \"targeted\", exclude: \"excluded\" };\n\n/** Where the API accepts this type, in words — the way out a refusal names. */\nfunction acceptedAt(type: CriterionType): string {\n const placement = CRITERION_PLACEMENTS[type];\n const where: string[] = [];\n for (const level of [\"campaign\", \"adGroup\"] as const) {\n const polarities = placement[level];\n if (polarities) {\n where.push(\n `${polarities.length === 2 ? \"targeted or excluded\" : PAST[polarities[0] ?? \"target\"]} on ${LEVEL_WORDS[level]}`,\n );\n }\n }\n if (placement.account) {\n where.push(\"excluded account-wide\");\n }\n if (placement.sharedSet) {\n where.push(`a member of a ${placement.sharedSet.join(\"/\")} list`);\n }\n if (placement.assetGroup) {\n where.push(\"an asset group signal\");\n }\n return where.join(\", \");\n}\n\n/**\n * Why Google's API has no place for this criterion at this level and polarity, or undefined. Static\n * — it does not depend on the campaign type (that is `criterionChannelVerdict`).\n */\nexport function criterionLevelIssue(\n spec: CriterionSpec,\n level: CriterionLevel,\n options: { negative?: boolean; viaAudiences?: boolean } = {},\n): string | undefined {\n const type = spec.criterionType;\n const placement = CRITERION_PLACEMENTS[type];\n const audience = audienceRouteIssue(type, level, options.viaAudiences === true);\n if (audience) {\n return audience;\n }\n const polarity: Polarity = options.negative ? \"exclude\" : \"target\";\n if (levelAllows(placement, level, polarity)) {\n return spec.criterionType === \"contentLabel\" ? contentLabelLevelIssue(spec.contentLabel, level) : undefined;\n }\n if (type === \"device\" && options.negative) {\n return \"A device is never excluded — stage it with bidModifier 0 to stop the ads showing on it.\";\n }\n const what = withArticle(placement.label);\n const where =\n level === \"account\" || level === \"sharedSet\"\n ? `put ${what} in ${LEVEL_WORDS[level]}`\n : `${polarity} ${what} on ${LEVEL_WORDS[level]}`;\n return `Google's API cannot ${where} — ${what} can be ${acceptedAt(type)}.`;\n}\n\nfunction withArticle(label: string): string {\n return `${/^[aeiou]/i.test(label) ? \"an\" : \"a\"} ${label}`;\n}\n\n/** Audience segments go through `audiences attach` on a campaign or ad group, and only they do. */\nfunction audienceRouteIssue(type: CriterionType, level: CriterionLevel, viaAudiences: boolean): string | undefined {\n if ((level !== \"campaign\" && level !== \"adGroup\") || AUDIENCE_SEGMENT_TYPES.has(type) === viaAudiences) {\n return undefined;\n }\n return viaAudiences\n ? `\\`audiences attach\\` takes an audience list, interest or custom segment — a ${CRITERION_PLACEMENTS[type].label} is a criterion: stage it with \\`baker ads google ${level === \"campaign\" ? \"campaign\" : \"ad-group\"}-criteria add\\`.`\n : AUDIENCE_SEGMENT_MESSAGE;\n}\n\nfunction levelAllows(placement: CriterionPlacement, level: CriterionLevel, polarity: Polarity): boolean {\n switch (level) {\n case \"campaign\":\n case \"adGroup\":\n return (placement[level] ?? []).includes(polarity);\n case \"account\":\n return placement.account === true;\n case \"assetGroup\":\n return placement.assetGroup === true;\n default:\n return (placement.sharedSet?.length ?? 0) > 0;\n }\n}\n\nfunction contentLabelLevelIssue(label: string, level: CriterionLevel): string | undefined {\n if (level === \"campaign\" && ACCOUNT_ONLY_CONTENT_LABELS.has(label)) {\n return `${label} is excluded account-wide only (Google answers CANNOT_EXCLUDE_CRITERION on a campaign) — stage it with \\`baker ads google account-exclusions add\\`.`;\n }\n if (level === \"account\" && CAMPAIGN_ONLY_CONTENT_LABELS.has(label)) {\n return `${label} is excluded per campaign only (Google answers CANNOT_EXCLUDE_CRITERION account-wide) — stage it with \\`baker ads google campaign-criteria add\\`.`;\n }\n return undefined;\n}\n\n/** Why a bid adjustment cannot ride on this criterion, or undefined. */\nexport function criterionBidIssue(spec: CriterionSpec, negative: boolean): string | undefined {\n if (!(\"bidModifier\" in spec) || spec.bidModifier === undefined) {\n return undefined;\n }\n return negative\n ? \"An exclusion carries no bid adjustment — Google refuses one on a negative criterion (FIELD_INCOMPATIBLE_WITH_NEGATIVE_TARGETING). Drop bidModifier.\"\n : undefined;\n}\n\n// --- What each campaign type accepts (probed) ---\n\ntype Types = readonly CriterionType[];\ninterface LevelCriteria {\n target: Types;\n exclude: Types;\n /** Types whose criterion takes a bid adjustment at this level. */\n bid?: Types;\n}\n/** A pair Google accepts only when something else on the campaign is true. */\ntype Condition = \"aiMax\" | \"dynamicAdGroup\";\n\nexport interface ChannelCriteria {\n campaign: LevelCriteria;\n /** Absent: the campaign type has no ad groups criteria can go on (Performance Max). */\n adGroup?: LevelCriteria;\n /** `${level}:${polarity}:${type}` pairs accepted only under a condition — staged with a warning. */\n conditional?: Readonly<Record<string, Condition>>;\n /** Devices an ad group's own bid adjustment (`AdGroupBidModifier`) can name; absent = none. */\n adGroupDevices?: readonly (typeof DEVICE_TYPES)[number][];\n}\n\nconst AUDIENCES: Types = [\"userList\", \"userInterest\", \"customAudience\"];\nconst PLACEMENT_TYPES: Types = [\"placement\", \"mobileApp\", \"mobileAppCategory\", \"youtubeChannel\", \"youtubeVideo\"];\nconst SEARCH_DEMOGRAPHICS: Types = [\"ageRange\", \"gender\", \"incomeRange\"];\nconst DEMOGRAPHICS: Types = [\"ageRange\", \"gender\", \"parentalStatus\", \"incomeRange\"];\nconst CAMPAIGN_REACH: Types = [\"location\", \"language\", \"adSchedule\", \"device\", \"proximity\"];\nconst BID_AT_CAMPAIGN: Types = [\"location\", \"adSchedule\", \"device\", \"proximity\"];\nconst PHONE_DEVICES = [\"MOBILE\", \"TABLET\", \"DESKTOP\"] as const;\n\nexport const CRITERIA_BY_CHANNEL: Readonly<Record<string, ChannelCriteria>> = {\n SEARCH: {\n campaign: {\n target: [...CAMPAIGN_REACH, ...AUDIENCES, \"brandList\"],\n exclude: [\n \"location\",\n ...SEARCH_DEMOGRAPHICS,\n \"ipBlock\",\n \"contentLabel\",\n ...PLACEMENT_TYPES,\n \"webpage\",\n ...AUDIENCES,\n \"brandList\",\n ],\n bid: [...BID_AT_CAMPAIGN, ...AUDIENCES],\n },\n adGroup: {\n target: [...SEARCH_DEMOGRAPHICS, ...AUDIENCES, \"webpage\", \"location\", \"brandList\"],\n exclude: [...SEARCH_DEMOGRAPHICS, ...PLACEMENT_TYPES, ...AUDIENCES, \"webpage\"],\n bid: [...SEARCH_DEMOGRAPHICS, ...AUDIENCES],\n },\n conditional: {\n \"campaign:target:brandList\": \"aiMax\",\n \"campaign:exclude:brandList\": \"aiMax\",\n \"adGroup:target:location\": \"aiMax\",\n \"adGroup:target:brandList\": \"aiMax\",\n \"adGroup:target:webpage\": \"dynamicAdGroup\",\n \"adGroup:exclude:webpage\": \"dynamicAdGroup\",\n },\n adGroupDevices: PHONE_DEVICES,\n },\n DISPLAY: {\n campaign: {\n target: [...CAMPAIGN_REACH, \"carrier\", \"operatingSystem\"],\n exclude: [\"location\", ...DEMOGRAPHICS, \"ipBlock\", \"contentLabel\", ...PLACEMENT_TYPES, \"topic\", ...AUDIENCES],\n bid: BID_AT_CAMPAIGN,\n },\n adGroup: {\n target: [...PLACEMENT_TYPES, \"topic\", ...DEMOGRAPHICS, ...AUDIENCES],\n exclude: [...PLACEMENT_TYPES, \"topic\", ...DEMOGRAPHICS, ...AUDIENCES],\n bid: [...PLACEMENT_TYPES, \"topic\", ...DEMOGRAPHICS, ...AUDIENCES],\n },\n adGroupDevices: [\"MOBILE\", \"TABLET\", \"DESKTOP\", \"CONNECTED_TV\"],\n },\n DEMAND_GEN: {\n campaign: {\n target: [\"adSchedule\", \"device\", \"carrier\", \"operatingSystem\"],\n exclude: [\"ipBlock\", ...PLACEMENT_TYPES, \"topic\"],\n bid: [\"adSchedule\", \"device\"],\n },\n adGroup: {\n target: [\"location\", \"language\", ...PLACEMENT_TYPES, \"topic\", \"audience\"],\n exclude: [\"location\", ...PLACEMENT_TYPES, \"topic\"],\n bid: [],\n },\n },\n PERFORMANCE_MAX: {\n campaign: {\n target: CAMPAIGN_REACH,\n exclude: [\"location\", \"ageRange\", \"gender\", \"webpage\", \"brandList\", \"userList\"],\n bid: BID_AT_CAMPAIGN,\n },\n },\n SHOPPING: {\n campaign: {\n target: [\"location\", \"adSchedule\", \"device\", \"proximity\", \"brandList\", ...AUDIENCES],\n exclude: [\"location\", \"ipBlock\", \"webpage\", \"brandList\", ...AUDIENCES],\n bid: [...BID_AT_CAMPAIGN, ...AUDIENCES],\n },\n adGroup: { target: AUDIENCES, exclude: AUDIENCES, bid: AUDIENCES },\n adGroupDevices: PHONE_DEVICES,\n },\n};\n\nconst CHANNEL_WORDS: Readonly<Record<string, string>> = {\n SEARCH: \"Search\",\n DISPLAY: \"Display\",\n DEMAND_GEN: \"Demand Gen\",\n PERFORMANCE_MAX: \"Performance Max\",\n SHOPPING: \"Shopping\",\n};\n\n/** The specific way out for a refusal that has a well-known one. */\nconst CHANNEL_REFUSAL_ROUTES: Readonly<Record<string, string>> = {\n \"DEMAND_GEN:campaign:location\":\n 'A Demand Gen campaign takes its locations on each ad group, not the campaign (Google answers \"The error code is not in this version.\"). Stage them with `baker ads google ad-group-criteria add` on every ad group instead.',\n \"DEMAND_GEN:campaign:language\":\n \"A Demand Gen campaign takes its languages on each ad group, not the campaign. Stage them with `baker ads google ad-group-criteria add` on every ad group instead.\",\n \"DEMAND_GEN:campaign:proximity\":\n \"A Demand Gen campaign takes no radius targeting on the campaign; target locations on each ad group with `baker ads google ad-group-criteria add` instead.\",\n \"DEMAND_GEN:adGroup:audience-segment\":\n 'A Demand Gen ad group\\'s audience is ONE combined audience, not individual lists or interests (Google answers CANNOT_ADD_AUDIENCE_SEGMENT_CRITERION_WHEN_AUDIENCE_GROUPED_IS_SET). Point the ad group at an existing combined audience with `baker ads google ad-group-criteria add` (`criterionType: \"audience\"`), or tell the user to build it in Google Ads; carry on with the rest of the job.',\n \"DISPLAY:campaign:audience-segment\":\n \"On Display an audience goes on the ad group, not the campaign — attach it with `--level adGroup` on each ad group (an exclusion can stay on the campaign).\",\n \"PERFORMANCE_MAX:campaign:audience-segment\":\n \"Performance Max takes no audience targeting on the campaign — an audience there is a signal on the asset group, not a criterion. Exclusions of a customer list are allowed.\",\n};\n\nexport interface CriterionPlacementQuery {\n channelType: string | undefined;\n level: \"campaign\" | \"adGroup\";\n criterionType: CriterionType;\n negative: boolean;\n /** Whether the criterion carries a bid adjustment. */\n bid: boolean;\n /** The ad group's own type, when the ad group is known (`SEARCH_DYNAMIC_ADS` decides webpages). */\n adGroupType?: string;\n}\n\n/**\n * Whether this campaign type takes this criterion here: a refusal (Google will refuse it at publish),\n * a warning (it takes it only when something on the campaign is true), or nothing. Unknown channel or\n * a channel with no row → nothing.\n */\nexport function criterionChannelVerdict(query: CriterionPlacementQuery): { refusal?: string; warning?: string } {\n const row = query.channelType ? CRITERIA_BY_CHANNEL[query.channelType] : undefined;\n if (!(row && query.channelType)) {\n return {};\n }\n const refusal = channelRefusal(row, query.channelType, query);\n return refusal ? { refusal } : channelCondition(row, query);\n}\n\nfunction channelRefusal(row: ChannelCriteria, channelType: string, query: CriterionPlacementQuery): string | undefined {\n const channel = CHANNEL_WORDS[channelType] ?? channelType;\n const label = CRITERION_PLACEMENTS[query.criterionType].label;\n const level = row[query.level];\n if (!level) {\n return `A ${channel} campaign has no ad groups to put a ${label} on — stage it on the campaign instead.`;\n }\n if (!level[query.negative ? \"exclude\" : \"target\"].includes(query.criterionType)) {\n return notAcceptedRefusal(row, channelType, query);\n }\n if (query.bid && !(level.bid ?? []).includes(query.criterionType)) {\n const where = query.level === \"adGroup\" ? \"ad group\" : \"campaign\";\n return `Google takes no bid adjustment on a ${label} on a ${channel} ${where} (CANNOT_BID_MODIFY_CRITERION_TYPE) — stage it without bidModifier.`;\n }\n return undefined;\n}\n\n/** The refusal for a pair the campaign type does not take: its known way out, or where it does go. */\nfunction notAcceptedRefusal(row: ChannelCriteria, channelType: string, query: CriterionPlacementQuery): string {\n const segment = AUDIENCE_SEGMENT_TYPES.has(query.criterionType) ? \"audience-segment\" : query.criterionType;\n const route = CHANNEL_REFUSAL_ROUTES[`${channelType}:${query.level}:${segment}`];\n if (route) {\n return route;\n }\n const channel = CHANNEL_WORDS[channelType] ?? channelType;\n const label = CRITERION_PLACEMENTS[query.criterionType].label;\n const polarity: Polarity = query.negative ? \"exclude\" : \"target\";\n const other = query.level === \"campaign\" ? row.adGroup : row.campaign;\n const elsewhere = other?.[polarity].includes(query.criterionType)\n ? ` It can be ${PAST[polarity]} on ${query.level === \"campaign\" ? \"each ad group\" : \"the campaign\"} instead.`\n : \"\";\n const where = query.level === \"adGroup\" ? \"ad group\" : \"campaign\";\n return `Google does not let a ${channel} ${where} ${polarity} a ${label} (it answers OPERATION_NOT_PERMITTED_FOR_CONTEXT).${elsewhere} Leave it out and carry on with the rest of the job.`;\n}\n\nfunction channelCondition(row: ChannelCriteria, query: CriterionPlacementQuery): { warning?: string } {\n const polarity: Polarity = query.negative ? \"exclude\" : \"target\";\n const condition = row.conditional?.[`${query.level}:${polarity}:${query.criterionType}`];\n if (!condition || (condition === \"dynamicAdGroup\" && query.adGroupType === \"SEARCH_DYNAMIC_ADS\")) {\n return {};\n }\n const label = CRITERION_PLACEMENTS[query.criterionType].label;\n return {\n warning:\n condition === \"aiMax\"\n ? `Google takes a ${label} here only when the Search campaign has AI Max for Search switched on (AI_MAX_MUST_BE_ENABLED) — check it is on, or this change is refused at publish. Run \\`baker ads google draft validate\\` before asking the user to publish.`\n : \"Google takes web pages on a Search ad group only when it is a Dynamic Search Ads ad group (or the campaign has AI Max on) — this one may be refused at publish. Run `baker ads google draft validate` before asking the user to publish.\",\n };\n}\n\n/** Why an ad group's own device bid adjustment is not possible on this campaign type, or undefined. */\nexport function adGroupDeviceVerdict(channelType: string | undefined, device: string): string | undefined {\n const row = channelType ? CRITERIA_BY_CHANNEL[channelType] : undefined;\n if (!(row && channelType)) {\n return undefined;\n }\n const channel = CHANNEL_WORDS[channelType] ?? channelType;\n const devices: readonly string[] = row.adGroupDevices ?? [];\n if (devices.length === 0) {\n return `A ${channel} ad group takes no device bid adjustment of its own (OPERATION_NOT_PERMITTED_FOR_CONTEXT) — set it on the campaign with \\`baker ads google campaign-criteria add\\` (criterionType \"device\").`;\n }\n return devices.includes(device)\n ? undefined\n : `A ${channel} ad group takes a device bid adjustment for ${devices.join(\", \")} only — not ${device}.`;\n}\n\n// --- Building Google's oneof ---\n\nexport interface CriterionBuildContext {\n customerId: string;\n /** A ref (temp, bare id or resource name) as the full resource name of the entity it names. */\n rn: (value: string, entity: GoogleDraftEntity) => string;\n}\n\nfunction constant(collection: string, value: string): string {\n return NUMERIC_ID_REGEX.test(value) ? `${collection}/${value}` : value;\n}\n\nfunction accountResource(customerId: string, collection: string, value: string): string {\n return NUMERIC_ID_REGEX.test(value) ? `customers/${customerId}/${collection}/${value}` : value;\n}\n\n/** Latitude/longitude in degrees → Google's micro-degrees. */\nfunction microDegrees(value: number): number {\n return Math.round(value * 1_000_000);\n}\n\n/**\n * The criterion's oneof field — `{ placement: { url } }`, `{ ageRange: { type } }` — plus its bid\n * adjustment, ready to spread into a CampaignCriterion, AdGroupCriterion, CustomerNegativeCriterion,\n * SharedCriterion or AssetGroupSignal. The parent, `negative` and `status` are the caller's.\n */\nexport function buildCriterion(spec: CriterionSpec, ctx: CriterionBuildContext): Record<string, unknown> {\n const withBid = (field: Record<string, unknown>) =>\n \"bidModifier\" in spec && spec.bidModifier !== undefined ? { ...field, bidModifier: spec.bidModifier } : field;\n switch (spec.criterionType) {\n case \"location\":\n return withBid({ location: { geoTargetConstant: constant(\"geoTargetConstants\", spec.geoTargetConstant) } });\n case \"language\":\n return { language: { languageConstant: constant(\"languageConstants\", spec.languageConstant) } };\n case \"adSchedule\":\n return withBid({\n adSchedule: {\n dayOfWeek: spec.dayOfWeek,\n startHour: spec.startHour,\n startMinute: spec.startMinute,\n endHour: spec.endHour,\n endMinute: spec.endMinute,\n },\n });\n case \"device\":\n return withBid({ device: { type: spec.device } });\n case \"proximity\":\n return withBid({\n proximity: {\n ...(spec.address\n ? { address: spec.address }\n : {\n geoPoint: {\n latitudeInMicroDegrees: microDegrees(spec.latitude ?? 0),\n longitudeInMicroDegrees: microDegrees(spec.longitude ?? 0),\n },\n }),\n radius: spec.radius,\n radiusUnits: spec.radiusUnits,\n },\n });\n case \"placement\":\n return withBid({ placement: { url: spec.url } });\n case \"mobileApp\":\n return withBid({ mobileApplication: { appId: spec.appId } });\n case \"mobileAppCategory\":\n return withBid({\n mobileAppCategory: {\n mobileAppCategoryConstant: constant(\"mobileAppCategoryConstants\", spec.mobileAppCategoryConstant),\n },\n });\n case \"youtubeChannel\":\n return withBid({ youtubeChannel: { channelId: spec.channelId } });\n case \"youtubeVideo\":\n return withBid({ youtubeVideo: { videoId: spec.videoId } });\n case \"topic\":\n return withBid({ topic: { topicConstant: constant(\"topicConstants\", spec.topicConstant) } });\n case \"ageRange\":\n return withBid({ ageRange: { type: spec.ageRange } });\n case \"gender\":\n return withBid({ gender: { type: spec.gender } });\n case \"parentalStatus\":\n return withBid({ parentalStatus: { type: spec.parentalStatus } });\n case \"incomeRange\":\n return withBid({ incomeRange: { type: spec.incomeRange } });\n case \"ipBlock\":\n return { ipBlock: { ipAddress: spec.ipAddress } };\n case \"contentLabel\":\n return { contentLabel: { type: spec.contentLabel } };\n case \"carrier\":\n return { carrier: { carrierConstant: constant(\"carrierConstants\", spec.carrierConstant) } };\n case \"operatingSystem\":\n return {\n operatingSystemVersion: {\n operatingSystemVersionConstant: constant(\n \"operatingSystemVersionConstants\",\n spec.operatingSystemVersionConstant,\n ),\n },\n };\n case \"webpage\":\n return {\n webpage: {\n criterionName: spec.name,\n conditions: spec.conditions.map((c) => ({\n operand: c.operand,\n ...(c.operator ? { operator: c.operator } : {}),\n argument: c.argument,\n })),\n },\n };\n case \"brandList\":\n return { brandList: { sharedSet: ctx.rn(spec.sharedSet, \"sharedSet\") } };\n case \"brand\":\n return { brand: { entityId: spec.entityId } };\n case \"negativeKeywordList\":\n return { negativeKeywordList: { sharedSet: ctx.rn(spec.sharedSet, \"sharedSet\") } };\n case \"userList\":\n return withBid({ userList: { userList: ctx.rn(spec.userList, \"audience\") } });\n case \"userInterest\":\n return withBid({\n userInterest: {\n userInterestCategory: accountResource(ctx.customerId, \"userInterests\", spec.userInterest),\n },\n });\n case \"customAudience\":\n return withBid({\n customAudience: { customAudience: accountResource(ctx.customerId, \"customAudiences\", spec.customAudience) },\n });\n case \"audience\":\n return { audience: { audience: accountResource(ctx.customerId, \"audiences\", spec.audience) } };\n case \"searchTheme\":\n return { searchTheme: { text: spec.text } };\n default:\n return spec satisfies never;\n }\n}\n\n/** The temp refs a criterion consumes, with the entity each must resolve to. */\nexport function criterionTempRefs(spec: CriterionSpec): Array<{ ref: string; entity: GoogleDraftEntity }> {\n const refs: Array<{ ref: string; entity: GoogleDraftEntity }> = [];\n if (\n (spec.criterionType === \"brandList\" || spec.criterionType === \"negativeKeywordList\") &&\n TEMP_REF_REGEX.test(spec.sharedSet)\n ) {\n refs.push({ ref: spec.sharedSet, entity: \"sharedSet\" });\n }\n if (spec.criterionType === \"userList\" && TEMP_REF_REGEX.test(spec.userList)) {\n refs.push({ ref: spec.userList, entity: \"audience\" });\n }\n return refs;\n}\n\n// --- Words ---\n\nfunction bare(value: string): string {\n return value.split(\"/\").pop() ?? value;\n}\n\nconst ENUM_WORDS: Readonly<Record<string, string>> = {\n AGE_RANGE_65_UP: \"65+\",\n INCOME_RANGE_0_50: \"lower 50%\",\n INCOME_RANGE_50_60: \"41–50%\",\n INCOME_RANGE_60_70: \"31–40%\",\n INCOME_RANGE_70_80: \"21–30%\",\n INCOME_RANGE_80_90: \"11–20%\",\n INCOME_RANGE_90_UP: \"top 10%\",\n NOT_A_PARENT: \"not a parent\",\n};\n\n/** A criterion enum as a marketer reads it: AGE_RANGE_25_34 → \"25–34\", INCOME_RANGE_90_UP → \"top 10%\". */\nexport function criterionEnumWords(value: string): string {\n const known = ENUM_WORDS[value];\n if (known) {\n return known;\n }\n const age = /^AGE_RANGE_(\\d+)_(\\d+)$/.exec(value);\n if (age) {\n return `${age[1]}–${age[2]}`;\n }\n return value\n .replace(/^(AGE_RANGE_|INCOME_RANGE_)/, \"\")\n .replace(/_/g, \" \")\n .toLowerCase();\n}\n\n/**\n * What the criterion names, as words: \"placement example.com\", \"age 18–24\", \"location Poland\". This\n * is what the agent reads back after staging and what the review lists, so a criterion is never just\n * its type. `resolvedName` is a stage-time read of an id no table carries (a city, a topic).\n */\nexport function criterionValueText(spec: CriterionSpec, resolvedName?: string): string {\n return resolvedName ?? offlineName(spec) ?? rawValueText(spec);\n}\n\n/** A name the offline tables carry (countries, languages), so a common criterion needs no read. */\nfunction offlineName(spec: CriterionSpec): string | undefined {\n if (spec.criterionType === \"location\") {\n return GEO_TARGET_COUNTRIES[bare(spec.geoTargetConstant)];\n }\n return spec.criterionType === \"language\" ? LANGUAGE_CONSTANTS[bare(spec.languageConstant)] : undefined;\n}\n\n/** What the criterion's own fields say, when nothing better names it. */\nfunction rawValueText(spec: CriterionSpec): string {\n switch (spec.criterionType) {\n case \"location\":\n return bare(spec.geoTargetConstant);\n case \"language\":\n return bare(spec.languageConstant);\n case \"adSchedule\":\n return `${spec.dayOfWeek.toLowerCase()} ${spec.startHour}:${MINUTE_DIGITS[spec.startMinute]}–${spec.endHour}:${MINUTE_DIGITS[spec.endMinute]}`;\n case \"device\":\n return spec.device.toLowerCase().replace(/_/g, \" \");\n case \"proximity\":\n return proximityText(spec);\n case \"placement\":\n return spec.url;\n case \"mobileApp\":\n return spec.appId;\n case \"mobileAppCategory\":\n return bare(spec.mobileAppCategoryConstant);\n case \"youtubeChannel\":\n return spec.channelId;\n case \"youtubeVideo\":\n return spec.videoId;\n case \"topic\":\n return bare(spec.topicConstant);\n case \"ageRange\":\n return criterionEnumWords(spec.ageRange);\n case \"gender\":\n return criterionEnumWords(spec.gender);\n case \"parentalStatus\":\n return criterionEnumWords(spec.parentalStatus);\n case \"incomeRange\":\n return criterionEnumWords(spec.incomeRange);\n case \"ipBlock\":\n return spec.ipAddress;\n case \"contentLabel\":\n return criterionEnumWords(spec.contentLabel);\n case \"carrier\":\n return bare(spec.carrierConstant);\n case \"operatingSystem\":\n return bare(spec.operatingSystemVersionConstant);\n case \"webpage\":\n return spec.name;\n case \"brandList\":\n return bare(spec.sharedSet);\n case \"brand\":\n return spec.entityId;\n case \"negativeKeywordList\":\n return bare(spec.sharedSet);\n case \"userList\":\n return bare(spec.userList);\n case \"userInterest\":\n return bare(spec.userInterest);\n case \"customAudience\":\n return bare(spec.customAudience);\n case \"audience\":\n return bare(spec.audience);\n case \"searchTheme\":\n return spec.text;\n default:\n return spec satisfies never;\n }\n}\n\nfunction proximityText(spec: Extract<CriterionSpec, { criterionType: \"proximity\" }>): string {\n const where = spec.address\n ? [spec.address.streetAddress, spec.address.postalCode, spec.address.cityName, spec.address.countryCode]\n .filter(Boolean)\n .join(\", \")\n : `${spec.latitude}, ${spec.longitude}`;\n return `${spec.radius} ${spec.radiusUnits === \"MILES\" ? \"mi\" : \"km\"} around ${where}`;\n}\n\n/** \"placement example.com\" — the type's label, then what it names. */\nexport function criterionPhrase(spec: CriterionSpec, resolvedName?: string): string {\n return `${CRITERION_PLACEMENTS[spec.criterionType].label} ${criterionValueText(spec, resolvedName)}`.trim();\n}\n\n/** The GAQL resource and id a criterion's display name is read from, for ids no offline table names. */\nexport function criterionNameSource(spec: CriterionSpec): { resource: string; id: string } | undefined {\n switch (spec.criterionType) {\n case \"location\":\n return { resource: \"geo_target_constant\", id: bare(spec.geoTargetConstant) };\n case \"language\":\n return { resource: \"language_constant\", id: bare(spec.languageConstant) };\n case \"topic\":\n return { resource: \"topic_constant\", id: bare(spec.topicConstant) };\n case \"carrier\":\n return { resource: \"carrier_constant\", id: bare(spec.carrierConstant) };\n case \"operatingSystem\":\n return { resource: \"operating_system_version_constant\", id: bare(spec.operatingSystemVersionConstant) };\n case \"mobileAppCategory\":\n return { resource: \"mobile_app_category_constant\", id: bare(spec.mobileAppCategoryConstant) };\n case \"userInterest\":\n return { resource: \"user_interest\", id: bare(spec.userInterest) };\n case \"customAudience\":\n return { resource: \"custom_audience\", id: bare(spec.customAudience) };\n case \"audience\":\n return { resource: \"audience\", id: bare(spec.audience) };\n case \"userList\":\n return TEMP_REF_REGEX.test(spec.userList) ? undefined : { resource: \"user_list\", id: bare(spec.userList) };\n case \"brandList\":\n case \"negativeKeywordList\":\n return TEMP_REF_REGEX.test(spec.sharedSet) ? undefined : { resource: \"shared_set\", id: bare(spec.sharedSet) };\n default:\n return undefined;\n }\n}\n\n/** Google's `CriterionType` enum (what a read returns as `.type`) → the spec's `criterionType`. */\nconst CRITERION_TYPE_BY_GOOGLE: Readonly<Record<string, CriterionType>> = {\n LOCATION: \"location\",\n LANGUAGE: \"language\",\n AD_SCHEDULE: \"adSchedule\",\n DEVICE: \"device\",\n PROXIMITY: \"proximity\",\n PLACEMENT: \"placement\",\n MOBILE_APPLICATION: \"mobileApp\",\n MOBILE_APP_CATEGORY: \"mobileAppCategory\",\n YOUTUBE_CHANNEL: \"youtubeChannel\",\n YOUTUBE_VIDEO: \"youtubeVideo\",\n TOPIC: \"topic\",\n AGE_RANGE: \"ageRange\",\n GENDER: \"gender\",\n PARENTAL_STATUS: \"parentalStatus\",\n INCOME_RANGE: \"incomeRange\",\n IP_BLOCK: \"ipBlock\",\n CONTENT_LABEL: \"contentLabel\",\n CARRIER: \"carrier\",\n OPERATING_SYSTEM_VERSION: \"operatingSystem\",\n WEBPAGE: \"webpage\",\n BRAND_LIST: \"brandList\",\n BRAND: \"brand\",\n NEGATIVE_KEYWORD_LIST: \"negativeKeywordList\",\n USER_LIST: \"userList\",\n USER_INTEREST: \"userInterest\",\n CUSTOM_AUDIENCE: \"customAudience\",\n AUDIENCE: \"audience\",\n SEARCH_THEME: \"searchTheme\",\n};\n\nexport function criterionTypeOfGoogle(type: string | undefined): CriterionType | undefined {\n return type ? CRITERION_TYPE_BY_GOOGLE[type] : undefined;\n}\n","/**\n * The structured snippet headers Google Ads accepts.\n *\n * `StructuredSnippetAsset.header` looks like free text and is not: Google\n * rejects anything outside its own published list with \"The input string value\n * is invalid for the associated field.\", which names neither the field nor the\n * list. A campaign launch lost two snippet assets — and, with them, the asset\n * links that depended on them — to the header \"Features\", which is not on it.\n *\n * The list below is Google's, verbatim: the thirteen English headers plus every\n * translation it publishes, so a Portuguese campaign can stage \"Tipos\" and a\n * French one \"Émissions\". A header is matched case-insensitively and rewritten\n * to Google's exact spelling, because a snippet that only differs in casing is\n * a valid intent Google would otherwise refuse.\n *\n * Source: https://developers.google.com/google-ads/api/data/structured-snippet-headers\n */\n\n/** The English headers, in Google's own order — what an error message offers back. */\nexport const STRUCTURED_SNIPPET_HEADERS_EN = [\n \"Brands\",\n \"Amenities\",\n \"Styles\",\n \"Types\",\n \"Destinations\",\n \"Services\",\n \"Courses\",\n \"Neighborhoods\",\n \"Shows\",\n \"Insurance coverage\",\n \"Degree programs\",\n \"Featured hotels\",\n \"Models\",\n] as const;\n\n/** Google's translations of those thirteen headers, across every locale it publishes. */\nconst STRUCTURED_SNIPPET_HEADERS_LOCALIZED: readonly string[] = [\n \"Aanbevolen hotels\",\n \"Acara\",\n \"Apdrošināšana\",\n \"Apkaimes\",\n \"Arredores\",\n \"Asigurare\",\n \"Assegurança\",\n \"Ausstattung\",\n \"Automerkit\",\n \"Bairros\",\n \"Barrios\",\n \"Barris\",\n \"Bestemmingen\",\n \"Biztosítási módozat\",\n \"Blagovne znamke\",\n \"Brand\",\n \"Brändid\",\n \"Brändit\",\n \"Buurten\",\n \"Cakupan asuransi\",\n \"Carreras universitarias\",\n \"Cartiere\",\n \"Chương trình\",\n \"Cilji\",\n \"Cobertura de seguro\",\n \"Cobertura do seguro\",\n \"Comodidades\",\n \"Coperture assicurativa\",\n \"Corsi\",\n \"Corsi di laurea\",\n \"Cours\",\n \"Couverture d'assurance\",\n \"Cursos\",\n \"Cursuri\",\n \"Cursussen\",\n \"Cíle\",\n \"Cấp bằng\",\n \"Degree programmes\",\n \"Dekking\",\n \"Design\",\n \"Destinacions\",\n \"Destinasi\",\n \"Destinasjoner\",\n \"Destinationer\",\n \"Destinazioni\",\n \"Destinații\",\n \"Destinos\",\n \"Destinácie\",\n \"Dienstleistungen\",\n \"Diplomaprogramok\",\n \"Dotări\",\n \"Draudimo aprėptis\",\n \"Dzielnice\",\n \"Dịch vụ\",\n \"Emisije\",\n \"Emisiuni\",\n \"Espectáculos\",\n \"Estilos\",\n \"Estils\",\n \"Faciliteter\",\n \"Fasilitas\",\n \"Fasiliteter\",\n \"Forsikringsdekning\",\n \"Forsikringsdækning\",\n \"Försäkringstyper\",\n \"Galamērķi\",\n \"Gaya\",\n \"Hizmetler\",\n \"Hotel consigliati\",\n \"Hotel ditampilkan\",\n \"Hotel pilihan\",\n \"Hoteles destacados\",\n \"Hotels destacats\",\n \"Hoteluri prezentate\",\n \"Hotéis em destaque\",\n \"Istaknuti hoteli\",\n \"Itinatampok na hotel\",\n \"Jenama\",\n \"Jenis\",\n \"Kaupunginosat\",\n \"Kawasan\",\n \"Kejiranan\",\n \"Kemudahan\",\n \"Khách sạn nổi bật\",\n \"Khóa học\",\n \"Kiemelt szállodák\",\n \"Kierunki studiów\",\n \"Kindlustuskaitse\",\n \"Kiểu\",\n \"Kohteet\",\n \"Kraadiõppeprogrammid\",\n \"Kritje zavarovanj\",\n \"Kurs\",\n \"Kursai\",\n \"Kurse\",\n \"Kurser\",\n \"Kursi\",\n \"Kurslar\",\n \"Kurssit\",\n \"Kursus\",\n \"Kursused\",\n \"Kursy\",\n \"Kurzy\",\n \"Laidos\",\n \"Layanan\",\n \"Licenciaturas\",\n \"Liputan insurans\",\n \"Lisans programları\",\n \"Lisäpalvelut\",\n \"Lokalområder\",\n \"Loại\",\n \"Mahalleler\",\n \"Marcas\",\n \"Markalar\",\n \"Marken\",\n \"Marki\",\n \"Marques\",\n \"Mata pelajaran\",\n \"Merek\",\n \"Merken\",\n \"Merkevarer\",\n \"Mga Amenity\",\n \"Mga Brand\",\n \"Mga Destinasyon\",\n \"Mga Istilo\",\n \"Mga Komunidad\",\n \"Mga Kurso\",\n \"Mga Modelo\",\n \"Mga Palabas\",\n \"Mga Serbisyo\",\n \"Mga Uri\",\n \"Mga degree program\",\n \"Miejsca\",\n \"Model\",\n \"Modele\",\n \"Modeli\",\n \"Modeliai\",\n \"Modelle\",\n \"Modellek\",\n \"Modellen\",\n \"Modeller\",\n \"Modelli\",\n \"Modelos\",\n \"Modely\",\n \"Modeļi\",\n \"Modèles\",\n \"Moksliniai laipsniai\",\n \"Mudelid\",\n \"Mugavusteenused\",\n \"Márkák\",\n \"Mărci\",\n \"Műsorok\",\n \"Nabolag\",\n \"Namų apylinkės\",\n \"Neighbourhoods\",\n \"Oddaje\",\n \"Odporúčané hotely\",\n \"Odredišta\",\n \"Oppiaineet\",\n \"Osiguranje\",\n \"Pakalpojumi\",\n \"Palvelut\",\n \"Paskirties vietos\",\n \"Paslaugos\",\n \"Patogumai\",\n \"Perkhidmatan\",\n \"Phạm vi bảo hiểm\",\n \"Piedāvātās viesnīcas\",\n \"Poistenie\",\n \"Pojištění\",\n \"Polecane hotele\",\n \"Ponudba\",\n \"Pořady\",\n \"Predstavljeni hoteli\",\n \"Prekių ženklai\",\n \"Program\",\n \"Program ijazah\",\n \"Program sarjana\",\n \"Programas\",\n \"Programas de graduação\",\n \"Programe de studiu\",\n \"Programes\",\n \"Programlar\",\n \"Programmer\",\n \"Programmes d'études\",\n \"Programmi\",\n \"Programy\",\n \"Pārraides\",\n \"Quartieri\",\n \"Quartiers\",\n \"Rancangan\",\n \"Relácie\",\n \"Resmål\",\n \"Robne marke\",\n \"Saated ja etendused\",\n \"Sadržaji\",\n \"Sakop ng insurance\",\n \"Serien\",\n \"Serier\",\n \"Serveis\",\n \"Serveis addicionals\",\n \"Servicii\",\n \"Servicios\",\n \"Servicios adicionales\",\n \"Servizi\",\n \"Serviços\",\n \"Show't\",\n \"Sigorta kapsamı\",\n \"Sihtkohad\",\n \"Siūlomi viešbučiai\",\n \"Slogi\",\n \"Služby\",\n \"Soovitatud hotellid\",\n \"Soseske\",\n \"Stiilid\",\n \"Stijlen\",\n \"Stilar\",\n \"Stile\",\n \"Stiler\",\n \"Stili\",\n \"Stiliai\",\n \"Stiller\",\n \"Stilovi\",\n \"Stiluri\",\n \"Storitve\",\n \"Studiengänge\",\n \"Studieprogramma's\",\n \"Studijní programy\",\n \"Studijski programi\",\n \"Studiju programmas\",\n \"Style\",\n \"Styly\",\n \"Stílusok\",\n \"Sunulan olanaklar\",\n \"Suositellut hotellit\",\n \"Szolgáltatások\",\n \"Sélection d'hôtels\",\n \"Tanfolyamok\",\n \"Teenused\",\n \"Tečajevi\",\n \"Tečaji\",\n \"Thương hiệu\",\n \"Tipai\",\n \"Tipi\",\n \"Tipos\",\n \"Tipuri\",\n \"Tipus\",\n \"Titulacions\",\n \"Tiện nghi\",\n \"Tjenester\",\n \"Tjänster\",\n \"Typen\",\n \"Typer\",\n \"Typy\",\n \"Tyylit\",\n \"Tyypit\",\n \"Típusok\",\n \"Türler\",\n \"Tüübid\",\n \"Ubezpieczenia\",\n \"Uddannelser\",\n \"Udogodnienia\",\n \"Udvalgte hoteller\",\n \"Usluge\",\n \"Usługi\",\n \"Utbildningsprogram\",\n \"Utdanningsprogrammer\",\n \"Utvalda hotell\",\n \"Utvalgte hoteller\",\n \"Vakuutukset\",\n \"Varumärken\",\n \"Veidi\",\n \"Versicherungsleistung\",\n \"Viertel\",\n \"Voorzieningen\",\n \"Vorgestellte Hotels\",\n \"Vrste\",\n \"Vybavenie\",\n \"Vybavení\",\n \"Vybrané hotely\",\n \"Vzdelávacie programy\",\n \"Városrészek\",\n \"Vùng lân cận\",\n \"Ziele\",\n \"Značky\",\n \"Známé oblasti\",\n \"Zīmoli\",\n \"destinasyonlar\",\n \"Émissions\",\n \"Équipements\",\n \"Öne çıkan oteller\",\n \"Úti célok\",\n \"Ümbruskonnad\",\n \"Četvrti\",\n \"Điểm đến\",\n \"Ērtības\",\n \"Študijski programi\",\n \"Štvrte\",\n \"Štýly\",\n \"Ασφαλιστική κάλυψη\",\n \"Γειτονιές\",\n \"Εκπομπές\",\n \"Επωνυμίες\",\n \"Μαθήματα\",\n \"Μοντέλα\",\n \"Ξενοδοχεία\",\n \"Παροχές\",\n \"Προγράμματα πτυχίων\",\n \"Προορισμοί\",\n \"Στυλ\",\n \"Τύποι\",\n \"Υπηρεσίες\",\n \"Бренди\",\n \"Бренды\",\n \"Дестинации\",\n \"Застраховка\",\n \"Зручності\",\n \"Квартали\",\n \"Курси\",\n \"Курсове\",\n \"Курсы\",\n \"Марки\",\n \"Места\",\n \"Модели\",\n \"Моделі\",\n \"Місця\",\n \"Освітні програми\",\n \"Послуги\",\n \"Предавания\",\n \"Представени хотели\",\n \"Программы высшего образования\",\n \"Районы\",\n \"Рекомендовані готелі\",\n \"Рекомендуемые отели\",\n \"Специалности\",\n \"Стили\",\n \"Стилове\",\n \"Стилі\",\n \"Страховая защита\",\n \"Страховий захист\",\n \"Типи\",\n \"Типове\",\n \"Типы\",\n \"Удобства\",\n \"Услуги\",\n \"Шоу\",\n \"брендови\",\n \"делови града\",\n \"дестинације\",\n \"дипломе\",\n \"емисије\",\n \"истакнути хотели\",\n \"курсеви\",\n \"модели\",\n \"осигурање\",\n \"садржаји\",\n \"стилови\",\n \"типови\",\n \"услуге\",\n \"דגמים\",\n \"הופעות ותוכניות\",\n \"יעדים גיאוגרפיים\",\n \"כיסוי ביטוחי\",\n \"מותגים\",\n \"מלונות מומלצים\",\n \"סגנונות\",\n \"סוגים\",\n \"קורסים\",\n \"שירותי המקום\",\n \"שירותים\",\n \"שכונות\",\n \"תוכניות ללימודי תואר\",\n \"الأحياء\",\n \"الأنماط\",\n \"الأنواع\",\n \"التغطية التأمينية\",\n \"الخدمات\",\n \"الدورات التدريبية\",\n \"العروض\",\n \"العلامات التجارية\",\n \"الفنادق المميّزة\",\n \"النماذج\",\n \"الوجهات\",\n \"برامج الشهادات\",\n \"وسائل الراحة\",\n \"आस-पड़ोस\",\n \"गंतव्य\",\n \"डिग्री कार्यक्रम\",\n \"पाठ्‍यक्रम\",\n \"प्रकार\",\n \"प्रदर्शित होटल\",\n \"बीमा कवरेज\",\n \"ब्रांड\",\n \"मॉडल\",\n \"शैलियां\",\n \"शो\",\n \"सुविधाएं\",\n \"सेवाएं\",\n \"ความคุ้มครองในประกัน\",\n \"บริการ\",\n \"ประเภท\",\n \"ปลายทาง\",\n \"ย่านใกล้เคียง\",\n \"รุ่น\",\n \"สิ่งอำนวยความสะดวก\",\n \"สไตล์\",\n \"หลักสูตร\",\n \"หลักสูตรปริญญา\",\n \"แบรนด์\",\n \"โชว์\",\n \"โรงแรมเด่น\",\n \"おすすめのホテル\",\n \"コース\",\n \"サービス\",\n \"スタイル\",\n \"タイプ\",\n \"ブランド\",\n \"モデル\",\n \"保険の保障\",\n \"保障範圍\",\n \"到着地\",\n \"周辺地域\",\n \"品牌\",\n \"型号\",\n \"型號\",\n \"学位プログラム\",\n \"学位课程\",\n \"學位課程\",\n \"承保範圍\",\n \"服务\",\n \"服務\",\n \"款式\",\n \"特色酒店\",\n \"番組\",\n \"目的地\",\n \"社区\",\n \"社區\",\n \"節目\",\n \"类型\",\n \"精选酒店\",\n \"精選飯店\",\n \"节目\",\n \"設備\",\n \"設施\",\n \"課程\",\n \"设施\",\n \"课程\",\n \"险种\",\n \"類型\",\n \"과정\",\n \"모델\",\n \"목적지\",\n \"보험 보상 범위\",\n \"브랜드\",\n \"서비스\",\n \"스타일\",\n \"유형\",\n \"인근 지역\",\n \"추천 호텔\",\n \"편의 시설\",\n \"프로그램\",\n \"학위 취득 프로그램\",\n];\n\n/**\n * Headers Google renamed but still documents under the old name, so a marketer\n * reading an older help page does not lose an asset to it.\n *\n * A `Map`, not an object literal: an object answers `\"constructor\"` with a\n * function off `Object.prototype`, and the schema downstream would take that as\n * a valid header and stage a snippet whose header vanishes on serialization —\n * the exact failure this module exists to stop, from a lookup that never\n * touched the list.\n */\nconst HEADER_ALIASES = new Map<string, string>([[\"service catalog\", \"Services\"]]);\n\nconst ACCEPTED = new Set<string>([...STRUCTURED_SNIPPET_HEADERS_EN, ...STRUCTURED_SNIPPET_HEADERS_LOCALIZED]);\n\n/**\n * One case-folded entry per accepted header. Two locales disagree on the casing\n * of the same word, so an exact match is always answered before this map — the\n * fold is a fallback for the caller's casing, not a canonicalization of\n * Google's.\n */\nconst BY_FOLDED_CASE = new Map<string, string>([...ACCEPTED].map((header) => [header.toLowerCase(), header] as const));\n\n/**\n * Google's own spelling of `header`, or `undefined` if Google does not accept\n * any spelling of it. Callers stage the returned string, never the input.\n */\nexport function canonicalStructuredSnippetHeader(header: string): string | undefined {\n const trimmed = header.trim();\n if (ACCEPTED.has(trimmed)) {\n return trimmed;\n }\n const folded = trimmed.toLowerCase();\n return HEADER_ALIASES.get(folded) ?? BY_FOLDED_CASE.get(folded);\n}\n","/**\n * Staged Google Ads write operations — the wire + storage payload contract.\n *\n * Ops are staged per chat and applied only when the chat publishes as a single\n * atomic `GoogleAdsService.Mutate` batch. Every payload here is exhaustively\n * validated at stage time (lengths, enums, micros, match types, resource-name\n * shapes, cross-field constraints); referential checks (customer scope, parent\n * existence, asset readiness) happen in the backend stage action on top of\n * these schemas.\n *\n * Money is in micros (major currency × 1,000,000) — the CLI converts before\n * staging so the contract, builders, and audit log all speak the API's units.\n */\nimport { z } from \"zod\";\nimport { biddingMatrixRefusal, embeddedTargetRefusal, PORTFOLIO_STRATEGY_TYPES } from \"./bidding-matrix\";\nimport {\n appCampaignSettingSchema,\n assetAutomationSchema,\n brandGuidelinesCreateSchema,\n brandGuidelinesUpdateSchema,\n campaignEnableBrandGuidelinesSchema,\n channelSettingsCreateIssues,\n dynamicSearchAdsSettingSchema,\n dynamicSearchAdsSettingUpdateSchema,\n frequencyCapsSchema,\n hotelSettingSchema,\n selectiveOptimizationSchema,\n shoppingSettingSchema,\n shoppingSettingUpdateSchema,\n travelCampaignSettingsSchema,\n} from \"./channel-settings\";\nimport { conversionUploadSchema } from \"./conversion-upload\";\nimport {\n bidModifierSchema,\n type CriterionSpec,\n criterionBidIssue,\n criterionBidModifierSchema,\n criterionLevelIssue,\n criterionSpecIssues,\n criterionSpecSchema,\n criterionTempRefs,\n} from \"./criteria\";\nimport {\n ACCELERATED_DELIVERY_MESSAGE,\n AD_GROUP_TYPES,\n ADVERTISING_CHANNEL_SUB_TYPES,\n ADVERTISING_CHANNEL_TYPES,\n ASSET_FIELD_TYPES,\n ASSET_GROUP_ASSET_FIELD_TYPES,\n BIDDING_STRATEGY_TYPES,\n BUDGET_DELIVERY_METHODS,\n BUSINESS_LOGO_LEVEL_MESSAGE,\n CALL_AD_RETIRED_MESSAGE,\n CAMPAIGN_OBJECTIVES,\n CHANNEL_CREATE_REFUSALS,\n CONVERSION_ACTION_CATEGORIES,\n CONVERSION_ACTION_TYPES,\n CONVERSION_COUNTING_TYPES,\n CONVERSION_ORIGINS,\n DEVICE_TYPES,\n demandGenOnlyStrategyRefusal,\n embeddedTargetOnDemandGenRefusal,\n GA4_CONVERSION_CREATE_MESSAGE,\n GOOGLE_ADS_LIMITS,\n type GoogleBiddingStrategyType,\n isImageAssetLinkFieldType,\n KEYWORD_MATCH_TYPES,\n LOOKALIKE_EXPANSION_LEVELS,\n manualCpcOnDemandGenRefusal,\n mergedTargetStrategyRefusal,\n NEGATIVE_GEO_TARGET_TYPES,\n NUMERIC_ID_REGEX,\n PINNED_FIELDS,\n PLAYBOOK_DAILY_BUDGET_FLOOR_MICROS,\n POSITIVE_GEO_TARGET_TYPES,\n RESOURCE_NAME_REGEX,\n retiredChoiceError,\n SHARED_SET_TYPES,\n STAGEABLE_CREATE_STATUSES,\n SUB_TYPE_CHANNEL,\n SUB_TYPE_CREATE_REFUSALS,\n TARGET_IMPRESSION_SHARE_LOCATIONS,\n TARGETING_DIMENSIONS,\n TEMP_REF_REGEX,\n USER_LIST_LOGICAL_OPERATORS,\n USER_LIST_NUMBER_OPERATORS,\n USER_LIST_STRING_OPERATORS,\n USER_LIST_TYPES,\n VIDEO_BRAND_SAFETY_LEVELS,\n} from \"./limits\";\nimport { canonicalStructuredSnippetHeader, STRUCTURED_SNIPPET_HEADERS_EN } from \"./structured-snippet-headers\";\n\n// --- Shared primitives ---\n\nexport const tempRefSchema = z.string().regex(TEMP_REF_REGEX, \"expected a g_temp_* reference\");\n\n/** A reference to another entity: a full resource name, a bare numeric id, or a g_temp_* ref staged earlier. */\nexport const refSchema = z.union([\n z.string().regex(RESOURCE_NAME_REGEX, \"expected a customers/…/…/… resource name\"),\n z.string().regex(NUMERIC_ID_REGEX, \"expected a numeric id\"),\n tempRefSchema,\n]);\n\n/** Update/status/remove targets: a real resource name or bare id, or a g_temp_* ref (AMENDS the staged create). */\nexport const targetRefSchema = refSchema;\n\nconst microsSchema = z.number().int().positive(\"expected a positive micros amount\");\nconst httpsUrlSchema = z\n .string()\n .url()\n .refine((u) => u.startsWith(\"https://\"), \"final URLs must be https\");\n\nconst customerIdSchema = z.string().regex(NUMERIC_ID_REGEX, \"customerId must be the bare numeric customer id\");\n\nconst stageableStatusSchema = z.enum(STAGEABLE_CREATE_STATUSES);\nconst matchTypeSchema = z.enum(KEYWORD_MATCH_TYPES);\n\n/**\n * `final_url_suffix` — bare query parameters appended to every final URL under the entity\n * (`utm_source=google&utm_agency=baker`). Not a URL and not a tracking template: a leading `?`\n * or `&` and a `{lpurl}` placeholder are both rejected by Google, so they are rejected here\n * before they can fail the whole atomic publish batch. The empty string clears the suffix.\n */\nexport const finalUrlSuffixSchema = z\n .string()\n .max(GOOGLE_ADS_LIMITS.campaign.finalUrlSuffixMax)\n .refine((s) => !/^[?&]/.test(s), \"drop the leading ? or & — a final URL suffix is bare query parameters\")\n .refine((s) => !s.includes(\"{lpurl}\"), \"{lpurl} belongs in a tracking template, not in a final URL suffix\")\n .refine((s) => !/\\s/.test(s), \"a final URL suffix cannot contain whitespace\")\n .refine((s) => s === \"\" || s.includes(\"=\"), 'expected key=value pairs, e.g. \"utm_source=google&utm_agency=baker\"');\n\n/** The ValueTrack tags that carry the landing page into a tracking template. */\nconst LANDING_PAGE_TAGS = [\"{lpurl}\", \"{unescapedlpurl}\", \"{escapedlpurl}\", \"{lpurl+2}\", \"{lpurl+3}\"];\n\n/**\n * `tracking_url_template` — the click-measurement URL every ad under the entity routes through.\n *\n * A template without a landing-page tag sends the click to the tracker and nowhere after it, which\n * Google rejects (and which would strand traffic if it didn't), so the tag is required here rather\n * than at publish where the rejection fails the whole atomic batch. The empty string clears the\n * template back to the account-level one.\n */\nexport const trackingUrlTemplateSchema = z\n .string()\n .max(GOOGLE_ADS_LIMITS.campaign.trackingUrlTemplateMax)\n .refine((t) => !/\\s/.test(t), \"a tracking template cannot contain whitespace\")\n .refine(\n (t) => t === \"\" || LANDING_PAGE_TAGS.some((tag) => t.includes(tag)),\n `a tracking template must carry the landing page through one of ${LANDING_PAGE_TAGS.join(\", \")}, e.g. \"https://tracker.example/?url={lpurl}\"`,\n )\n .refine(\n (t) => t === \"\" || /^(https?:\\/\\/|\\{)/.test(t),\n \"a tracking template must start with http://, https:// or a {lpurl} tag\",\n );\n\n/**\n * `url_custom_parameters` — the `{_name}` placeholders a tracking template or final URL can\n * reference. Google REPLACES the whole set on update, so an empty array clears them.\n */\nexport const urlCustomParametersSchema = z\n .array(\n z.strictObject({\n key: z\n .string()\n .min(1)\n .max(GOOGLE_ADS_LIMITS.campaign.urlCustomParameterKeyMax)\n .regex(/^[A-Za-z0-9_]+$/, \"a custom parameter key is letters, digits and underscores only\"),\n value: z.string().max(GOOGLE_ADS_LIMITS.campaign.urlCustomParameterValueMax),\n }),\n )\n .max(GOOGLE_ADS_LIMITS.campaign.urlCustomParametersMax)\n .refine(\n (params) => new Set(params.map((p) => p.key)).size === params.length,\n \"each custom parameter key can appear only once\",\n );\n\nconst keywordTextSchema = z\n .string()\n .min(1)\n .max(GOOGLE_ADS_LIMITS.keyword.textMax)\n .refine((t) => t.trim().split(/\\s+/).length <= GOOGLE_ADS_LIMITS.keyword.wordsMax, \"keyword exceeds 10 words\");\n\n// --- Campaign budget ---\n\nconst deliveryMethodSchema = z.enum(BUDGET_DELIVERY_METHODS, {\n error: retiredChoiceError({ ACCELERATED: ACCELERATED_DELIVERY_MESSAGE }),\n});\n\nexport const TOTAL_BUDGET_NOT_SHARED_MESSAGE =\n \"a total budget belongs to one campaign and cannot be shared — leave explicitlyShared out\";\nconst ONE_BUDGET_AMOUNT_MESSAGE =\n \"set amountMicros (a daily budget) OR totalAmountMicros (one total for the campaign's whole flight), not both\";\n\n/**\n * A daily budget (`amountMicros`) or a total budget (`totalAmountMicros`, Google's\n * `period: CUSTOM_PERIOD`): one total spent across the campaign's start and end dates. Google\n * refuses a total with a daily amount beside it, a shared total, and a total budget on a campaign\n * without an end date (live, v25); which campaign types take one is checked at stage.\n */\nexport const budgetCreateSchema = z\n .strictObject({\n name: z.string().min(1).max(GOOGLE_ADS_LIMITS.budget.nameMax),\n amountMicros: microsSchema.optional(),\n /** A total for the campaign's whole flight instead of a daily amount (needs the campaign's end date). */\n totalAmountMicros: microsSchema.optional(),\n deliveryMethod: deliveryMethodSchema.default(\"STANDARD\"),\n explicitlyShared: z.boolean().default(false),\n })\n .superRefine((p, ctx) => {\n if ((p.amountMicros === undefined) === (p.totalAmountMicros === undefined)) {\n ctx.addIssue({ code: \"custom\", path: [\"amountMicros\"], message: ONE_BUDGET_AMOUNT_MESSAGE });\n }\n if (p.totalAmountMicros !== undefined && p.explicitlyShared) {\n ctx.addIssue({ code: \"custom\", path: [\"explicitlyShared\"], message: TOTAL_BUDGET_NOT_SHARED_MESSAGE });\n }\n });\nexport type BudgetCreate = z.infer<typeof budgetCreateSchema>;\n\nexport const budgetUpdateSchema = z\n .strictObject({\n name: z.string().min(1).max(GOOGLE_ADS_LIMITS.budget.nameMax).optional(),\n amountMicros: microsSchema.optional(),\n /** A total budget's new total. A budget's kind (daily or total) never changes after it is created. */\n totalAmountMicros: microsSchema.optional(),\n deliveryMethod: deliveryMethodSchema.optional(),\n })\n .superRefine((p, ctx) => {\n if (Object.values(p).every((v) => v === undefined)) {\n ctx.addIssue({ code: \"custom\", message: \"update needs at least one field\" });\n }\n if (p.amountMicros !== undefined && p.totalAmountMicros !== undefined) {\n ctx.addIssue({ code: \"custom\", path: [\"amountMicros\"], message: ONE_BUDGET_AMOUNT_MESSAGE });\n }\n });\nexport type BudgetUpdate = z.infer<typeof budgetUpdateSchema>;\n\n// --- Bidding (inline standard strategy on a campaign) ---\n\n/**\n * Strict for the same reason as `networkSettings`: Target Impression Share goal keys\n * (`location`, `locationFractionMicros`) were stripped by a non-strict object, so the update\n * staged with no warning and published a campaign whose goal never changed.\n */\nexport const biddingConfigSchema = z\n .strictObject({\n type: z.enum(BIDDING_STRATEGY_TYPES),\n targetCpaMicros: microsSchema.optional(),\n targetRoas: z.number().positive().optional(),\n /** Demand Gen only — `Campaign.target_cpc.target_cpc_micros`. */\n targetCpcMicros: microsSchema.optional(),\n cpcBidCeilingMicros: microsSchema.optional(),\n enhancedCpcEnabled: z.boolean().optional(),\n /** Target impression share: where on the page the share is counted. */\n location: z.enum(TARGET_IMPRESSION_SHARE_LOCATIONS).optional(),\n /** Target impression share: the share to reach, in millionths (700000 = 70%). */\n locationFractionMicros: z.number().int().min(1).max(1_000_000).optional(),\n })\n .superRefine((p, ctx) => {\n if (p.type !== \"TARGET_IMPRESSION_SHARE\" && (p.location !== undefined || p.locationFractionMicros !== undefined)) {\n ctx.addIssue({\n code: \"custom\",\n path: [\"location\"],\n message: \"location and locationFractionMicros belong to TARGET_IMPRESSION_SHARE only\",\n });\n }\n if (p.type === \"TARGET_CPA\" && p.targetCpaMicros === undefined) {\n ctx.addIssue({ code: \"custom\", path: [\"targetCpaMicros\"], message: \"TARGET_CPA needs targetCpaMicros\" });\n }\n if (p.type === \"TARGET_ROAS\" && p.targetRoas === undefined) {\n ctx.addIssue({ code: \"custom\", path: [\"targetRoas\"], message: \"TARGET_ROAS needs targetRoas\" });\n }\n if (p.type === \"TARGET_CPC\" && p.targetCpcMicros === undefined) {\n ctx.addIssue({ code: \"custom\", path: [\"targetCpcMicros\"], message: \"TARGET_CPC needs targetCpcMicros\" });\n }\n });\nexport type BiddingConfig = z.infer<typeof biddingConfigSchema>;\n\nconst TARGET_IMPRESSION_SHARE_FIELDS = [\n [\"location\", \"where on the page — ANYWHERE_ON_PAGE, TOP_OF_PAGE or ABSOLUTE_TOP_OF_PAGE\"],\n [\"locationFractionMicros\", \"the share to reach, in millionths (700000 = 70%)\"],\n [\"cpcBidCeilingMicros\", \"the max CPC Google may bid to reach it\"],\n] as const;\n\n/**\n * Target impression share has no default for any of its three fields: a create carrying only the\n * type was answered REQUIRED on each (v25). An update that only moves the ceiling is fine — the\n * campaign already has the other two — so this applies to a NEW strategy only.\n */\nfunction addTargetImpressionShareIssues(bidding: BiddingConfig | undefined, path: string, ctx: z.RefinementCtx): void {\n if (bidding?.type !== \"TARGET_IMPRESSION_SHARE\") {\n return;\n }\n for (const [field, meaning] of TARGET_IMPRESSION_SHARE_FIELDS) {\n if (bidding[field] === undefined) {\n ctx.addIssue({\n code: \"custom\",\n path: [path, field],\n message: `Target impression share needs ${field}: ${meaning}`,\n });\n }\n }\n}\n\n// --- Campaign ---\n\n/**\n * `campaign.network_settings` — which networks the campaign serves on. Strict for the same reason\n * as `geoTargetTypeSetting`: a typo'd key inside a non-strict object was stripped silently, so the\n * command reported success and the campaign published on Google's networks instead of the staged ones.\n */\nconst networkSettingsSchema = z.strictObject({\n targetGoogleSearch: z.boolean().optional(),\n targetSearchNetwork: z.boolean().optional(),\n targetContentNetwork: z.boolean().optional(),\n targetPartnerSearchNetwork: z.boolean().optional(),\n});\nexport type NetworkSettings = z.infer<typeof networkSettingsSchema>;\n\n/**\n * What Baker sends for a SEARCH campaign create that states no networks. Google's own default turns\n * Search partners AND the Display network on, which is spend on surfaces nobody chose and an audit\n * finding on the next Session — so the unstated case means Google Search only, and widening is an\n * explicit `networkSettings` in the payload.\n *\n * SEARCH only: Display campaigns need `targetContentNetwork` on, and Performance Max does not take\n * network settings at all, so there is no single safe default to apply across channel types.\n * Applied on the way OUT — at publish and on the review card — never on the way in, so the draft\n * keeps recording what the agent actually asked for (same convention as CONVERSION_ACTION_CREATE_DEFAULTS).\n */\nexport const SEARCH_CAMPAIGN_NETWORK_DEFAULTS = {\n targetGoogleSearch: true,\n targetSearchNetwork: false,\n targetContentNetwork: false,\n targetPartnerSearchNetwork: false,\n} as const satisfies NetworkSettings;\n\n/** The network settings that actually reach Google for a campaign create; undefined leaves it unset. */\nexport function resolveCampaignNetworkSettings(\n channelType: string | undefined,\n staged: NetworkSettings | undefined,\n): NetworkSettings | undefined {\n if (staged) {\n return staged;\n }\n return channelType === \"SEARCH\" ? SEARCH_CAMPAIGN_NETWORK_DEFAULTS : undefined;\n}\n\nconst dateSchema = z.string().regex(/^\\d{4}-\\d{2}-\\d{2}$/, \"expected a YYYY-MM-DD date\");\n\n/**\n * `campaign.geo_target_type_setting` — how the campaign's location criteria are interpreted.\n * Strict, because the whole point of staging this is that a typo'd key used to vanish silently\n * and the campaign published on Google's default (`PRESENCE_OR_INTEREST`) instead.\n */\nconst geoTargetTypeSettingSchema = z\n .strictObject({\n positiveGeoTargetType: z.enum(POSITIVE_GEO_TARGET_TYPES).optional(),\n negativeGeoTargetType: z.enum(NEGATIVE_GEO_TARGET_TYPES).optional(),\n })\n .refine(\n (p) => p.positiveGeoTargetType !== undefined || p.negativeGeoTargetType !== undefined,\n \"geoTargetTypeSetting needs positiveGeoTargetType and/or negativeGeoTargetType\",\n );\nexport type GeoTargetTypeSetting = z.infer<typeof geoTargetTypeSettingSchema>;\n\n/**\n * Text guidelines: what the text Google writes for an AI Max or Performance Max campaign must avoid.\n * Each list REPLACES the campaign's whole list on publish; `[]` clears it, an omitted list is left\n * alone. A messaging restriction is sent as Google's only restriction type, `RESTRICTION_BASED_EXCLUSION`.\n */\nconst textGuidelinesSchema = z\n .strictObject({\n termExclusions: z\n .array(z.string().trim().min(1).max(GOOGLE_ADS_LIMITS.campaign.termExclusionMax))\n .max(GOOGLE_ADS_LIMITS.campaign.termExclusionsMax)\n .optional(),\n messagingRestrictions: z\n .array(z.string().trim().min(1).max(GOOGLE_ADS_LIMITS.campaign.messagingRestrictionMax))\n .max(GOOGLE_ADS_LIMITS.campaign.messagingRestrictionsMax)\n .refine(\n (rules) => new Set(rules.map((rule) => rule.toLowerCase())).size === rules.length,\n \"each messaging restriction must be unique\",\n )\n .optional(),\n })\n .refine(\n (p) => p.termExclusions !== undefined || p.messagingRestrictions !== undefined,\n \"textGuidelines needs termExclusions and/or messagingRestrictions\",\n );\nexport type TextGuidelines = z.infer<typeof textGuidelinesSchema>;\n\nexport const AI_MAX_TEXT_NEEDS_AI_MAX_MESSAGE =\n \"AI Max text customization only works with AI Max on: also turn AI Max on, or leave text customization off.\";\nexport const AI_MAX_URL_NEEDS_TEXT_MESSAGE =\n \"AI Max final URL expansion only works with text customization on: also turn text customization on, or leave URL expansion off.\";\n\n/**\n * AI Max on a Search campaign: the switch itself (`ai_max_setting.enable_ai_max`) and its two\n * opt-in features, text customization (`TEXT_ASSET_AUTOMATION`) and final URL expansion\n * (`FINAL_URL_EXPANSION_TEXT_ASSET_AUTOMATION`). An omitted field keeps the campaign's value.\n * Google refuses text customization without AI Max and URL expansion without text customization,\n * so a payload that states both halves of either pair contradictorily is refused here; a half the\n * payload leaves out is checked against the live campaign at stage time.\n */\nconst aiMaxSchema = z\n .strictObject({\n enabled: z.boolean().optional(),\n textCustomization: z.boolean().optional(),\n finalUrlExpansion: z.boolean().optional(),\n })\n .superRefine((p, ctx) => {\n if (p.enabled === undefined && p.textCustomization === undefined && p.finalUrlExpansion === undefined) {\n ctx.addIssue({ code: \"custom\", message: \"aiMax needs enabled, textCustomization and/or finalUrlExpansion\" });\n }\n if (p.enabled === false && p.textCustomization === true) {\n ctx.addIssue({ code: \"custom\", path: [\"textCustomization\"], message: AI_MAX_TEXT_NEEDS_AI_MAX_MESSAGE });\n }\n if (p.textCustomization === false && p.finalUrlExpansion === true) {\n ctx.addIssue({ code: \"custom\", path: [\"finalUrlExpansion\"], message: AI_MAX_URL_NEEDS_TEXT_MESSAGE });\n }\n });\nexport type AiMax = z.infer<typeof aiMaxSchema>;\n\nexport const AI_MAX_SEARCH_ONLY_MESSAGE = \"AI Max exists only on Search campaigns.\";\n\n/** Why a new campaign's AI Max can't be created as staged. A new campaign starts with AI Max and both features off. */\nfunction aiMaxCreateRefusal(channelType: string, aiMax: AiMax | undefined): string | undefined {\n if (!aiMax) {\n return undefined;\n }\n if (channelType !== \"SEARCH\") {\n return AI_MAX_SEARCH_ONLY_MESSAGE;\n }\n if (aiMax.enabled !== true && aiMax.textCustomization === true) {\n return AI_MAX_TEXT_NEEDS_AI_MAX_MESSAGE;\n }\n if (aiMax.textCustomization !== true && aiMax.finalUrlExpansion === true) {\n return AI_MAX_URL_NEEDS_TEXT_MESSAGE;\n }\n return undefined;\n}\n\n/**\n * Why a new campaign of this type cannot take this inline bidding, or undefined. A create carries its\n * own channel, so this is answerable at the schema — an update has to wait for the stage-time snapshot\n * to say what channel it is editing.\n */\nfunction createBiddingRefusal(\n channelType: string,\n channelSubType: string | undefined,\n bidding: BiddingConfig | undefined,\n): string | undefined {\n if (channelType === \"PERFORMANCE_MAX\" && bidding?.type === \"MANUAL_CPC\") {\n return \"Performance Max does not support Manual CPC\";\n }\n return (\n mergedTargetStrategyRefusal(channelType, bidding?.type) ??\n demandGenOnlyStrategyRefusal(channelType, bidding?.type) ??\n manualCpcOnDemandGenRefusal(channelType, bidding?.type) ??\n embeddedTargetOnDemandGenRefusal(channelType, bidding) ??\n biddingMatrixRefusal({ channelType, channelSubType, strategy: bidding?.type }) ??\n embeddedTargetRefusal(channelType, bidding)\n );\n}\n\n/**\n * Strict: an unknown key on a campaign payload is a hard stage-time error, never a silent drop.\n * A `--file` payload that named a field this contract does not carry (`geoTargetTypeSetting`\n * before it existed here) used to be stripped by zod, so the command reported success and the\n * campaign went live on Google's defaults. Failing loudly is what lets the agent correct itself.\n */\nexport const campaignCreateSchema = z\n .strictObject({\n name: z.string().min(1).max(GOOGLE_ADS_LIMITS.campaign.nameMax),\n channelType: z.enum(ADVERTISING_CHANNEL_TYPES, { error: retiredChoiceError(CHANNEL_CREATE_REFUSALS) }),\n channelSubType: z\n .enum(ADVERTISING_CHANNEL_SUB_TYPES, { error: retiredChoiceError(SUB_TYPE_CREATE_REFUSALS) })\n .optional(),\n budget: refSchema,\n /** Inline standard bidding, or a portfolio strategy ref via biddingStrategy. */\n bidding: biddingConfigSchema.optional(),\n biddingStrategy: refSchema.optional(),\n networkSettings: networkSettingsSchema.optional(),\n /**\n * \"Location options\". Omitted stages Google's own default — reach people *in or interested in*\n * the targeted locations — so pass `PRESENCE` explicitly when only people physically there count.\n */\n geoTargetTypeSetting: geoTargetTypeSettingSchema.optional(),\n startDate: dateSchema.optional(),\n endDate: dateSchema.optional(),\n /** Campaign-level override of the account's final URL suffix — REPLACES it, never merges. */\n finalUrlSuffix: finalUrlSuffixSchema.optional(),\n /** Campaign-level override of the account's tracking template — REPLACES it, never merges. */\n trackingUrlTemplate: trackingUrlTemplateSchema.optional(),\n /** The `{_name}` parameters this campaign's tracking template and final URLs can reference. */\n urlCustomParameters: urlCustomParametersSchema.optional(),\n /** Advisory Google Ads UI objective — drives warnings, not sent to the API. */\n objective: z.enum(CAMPAIGN_OBJECTIVES).optional(),\n /**\n * Whether the campaign contains EU political advertising. Google requires the declaration on\n * every campaign create (FieldError.REQUIRED without it); omitted means it does not.\n */\n euPoliticalAds: z.boolean().optional(),\n /** AI Max for Search. A new campaign has it off unless this turns it on. */\n aiMax: aiMaxSchema.optional(),\n /** Shopping (required) and Performance Max (optional, a retail campaign): the Merchant Center feed. */\n shoppingSetting: shoppingSettingSchema.optional(),\n /** App campaigns (MULTI_CHANNEL): the app, its store and the goal. Fixed at creation. */\n appCampaignSetting: appCampaignSettingSchema.optional(),\n /** App campaigns with an in-app or value goal: the app's conversion actions to optimize toward. */\n selectiveOptimization: selectiveOptimizationSchema.optional(),\n /** Travel campaigns: the linked travel account (Things to do). */\n travelCampaignSettings: travelCampaignSettingsSchema.optional(),\n /** Hotel campaigns: the linked Hotel Center account. */\n hotelSetting: hotelSettingSchema.optional(),\n /** Search: the site dynamic ads are built from. */\n dynamicSearchAdsSetting: dynamicSearchAdsSettingSchema.optional(),\n /** Display: how often one person sees the campaign's ads. */\n frequencyCaps: frequencyCapsSchema.optional(),\n /** Performance Max, or Search with AI Max + text customization: what Google's generated text must avoid. */\n textGuidelines: textGuidelinesSchema.optional(),\n /** Performance Max: what Google may generate (text, final URL expansion, image and video enhancements). */\n assetAutomation: assetAutomationSchema.optional(),\n /** Performance Max: brand guidelines (business name + logo as campaign assets, colors, font). */\n brandGuidelines: brandGuidelinesCreateSchema.optional(),\n status: stageableStatusSchema.default(\"PAUSED\"),\n })\n .superRefine((p, ctx) => {\n for (const issue of channelSettingsCreateIssues(p)) {\n ctx.addIssue({ code: \"custom\", path: issue.path, message: issue.message });\n }\n if (!p.bidding && !p.biddingStrategy) {\n ctx.addIssue({\n code: \"custom\",\n path: [\"bidding\"],\n message: \"set an inline bidding strategy or reference a portfolio biddingStrategy\",\n });\n }\n if (p.bidding && p.biddingStrategy) {\n ctx.addIssue({\n code: \"custom\",\n path: [\"bidding\"],\n message: \"use inline bidding OR a portfolio biddingStrategy, not both\",\n });\n }\n addTargetImpressionShareIssues(p.bidding, \"bidding\", ctx);\n const channelRefusal = createBiddingRefusal(p.channelType, p.channelSubType, p.bidding);\n if (channelRefusal) {\n ctx.addIssue({ code: \"custom\", path: [\"bidding\"], message: channelRefusal });\n }\n if (p.startDate && p.endDate && p.endDate <= p.startDate) {\n ctx.addIssue({ code: \"custom\", path: [\"endDate\"], message: \"endDate must be after startDate\" });\n }\n if (p.channelSubType && SUB_TYPE_CHANNEL[p.channelSubType] !== p.channelType) {\n ctx.addIssue({\n code: \"custom\",\n path: [\"channelSubType\"],\n message: `${p.channelSubType} is a ${SUB_TYPE_CHANNEL[p.channelSubType]} sub-type, not ${p.channelType} — leave the sub-type out for a standard ${p.channelType} campaign`,\n });\n }\n const aiMaxRefusal = aiMaxCreateRefusal(p.channelType, p.aiMax);\n if (aiMaxRefusal) {\n ctx.addIssue({ code: \"custom\", path: [\"aiMax\"], message: aiMaxRefusal });\n }\n });\nexport type CampaignCreate = z.infer<typeof campaignCreateSchema>;\n\nexport const campaignUpdateSchema = z\n .strictObject({\n name: z.string().min(1).max(GOOGLE_ADS_LIMITS.campaign.nameMax).optional(),\n budget: refSchema.optional(),\n /**\n * The campaign's own (standard) bidding. On a campaign that is on a portfolio strategy this also\n * takes it OFF the portfolio — the builder clears `bidding_strategy` with it.\n */\n bidding: biddingConfigSchema.optional(),\n /**\n * Moves the campaign onto a portfolio bidding strategy (a ref: staged create, id or resource name).\n * `\"\"` takes it off its portfolio — only beside `bidding`, the campaign's own bidding from then on\n * (staging adds it when `bidding` is staged on a campaign that is on a portfolio).\n */\n biddingStrategy: z.union([refSchema, z.literal(\"\")]).optional(),\n networkSettings: networkSettingsSchema.optional(),\n /** Switches an existing campaign between \"Presence or interest\" and \"Presence\". */\n geoTargetTypeSetting: geoTargetTypeSettingSchema.optional(),\n startDate: dateSchema.optional(),\n endDate: dateSchema.optional(),\n /** Campaign-level override of the account's final URL suffix. `\"\"` clears it back to the account value. */\n finalUrlSuffix: finalUrlSuffixSchema.optional(),\n /** Campaign-level tracking template. `\"\"` clears it back to the account value. */\n trackingUrlTemplate: trackingUrlTemplateSchema.optional(),\n /** Replaces the campaign's custom parameters wholesale; `[]` removes them all. */\n urlCustomParameters: urlCustomParametersSchema.optional(),\n /** Corrects the campaign's EU political advertising declaration (true = contains, false = does not). */\n euPoliticalAds: z.boolean().optional(),\n /** AI Max / Performance Max text guidelines. Google refuses them on a Search campaign without AI Max. */\n textGuidelines: textGuidelinesSchema.optional(),\n /** Turns AI Max or its features on or off. Search campaigns only (checked against the live channel). */\n aiMax: aiMaxSchema.optional(),\n /** Feed label (Shopping, Performance Max), priority and local inventory (Shopping). Checked against the live channel. */\n shoppingSetting: shoppingSettingUpdateSchema.optional(),\n /** Search: the site dynamic ads are built from (each field on its own). Checked against the live channel. */\n dynamicSearchAdsSetting: dynamicSearchAdsSettingUpdateSchema.optional(),\n /** Display / Video: REPLACES the campaign's caps; `[]` removes them. Checked against the live channel. */\n frequencyCaps: frequencyCapsSchema.optional(),\n /** Performance Max: switches Google's generated assets; the ones left out keep their live value. */\n assetAutomation: assetAutomationSchema.optional(),\n /** Performance Max with brand guidelines on: its brand colors and font. Turning them on is `enableBrandGuidelines`. */\n brandGuidelines: brandGuidelinesUpdateSchema.optional(),\n status: z.enum([\"ENABLED\", \"PAUSED\", \"REMOVED\"]).optional(),\n })\n .superRefine((p, ctx) => {\n if (Object.values(p).every((v) => v === undefined)) {\n ctx.addIssue({ code: \"custom\", message: \"update needs at least one field\" });\n }\n if (p.bidding && p.biddingStrategy) {\n ctx.addIssue({\n code: \"custom\",\n path: [\"biddingStrategy\"],\n message:\n \"use the campaign's own bidding OR a portfolio biddingStrategy, not both — own bidding takes the campaign off its portfolio\",\n });\n }\n if (p.biddingStrategy === \"\" && !p.bidding) {\n ctx.addIssue({\n code: \"custom\",\n path: [\"biddingStrategy\"],\n message:\n \"leaving a portfolio needs the campaign's own bidding — stage bidding (e.g. MAXIMIZE_CONVERSIONS) with it\",\n });\n }\n });\nexport type CampaignUpdate = z.infer<typeof campaignUpdateSchema>;\n\n// --- Account (customer) settings ---\n\n/**\n * The account-wide settings a `google.customer.update` stages — Google Ads \"Admin → Account\n * settings\". It rides the same `GoogleAdsService.Mutate` batch as every other staged op\n * (`customerOperation`, update only), so it is staged in the chat and applied at Publish like the rest.\n *\n * `callConversionAction` is deliberately absent: v25 refuses a write of\n * `call_reporting_setting.call_conversion_action` even when it names the action the account already\n * uses (\"The error code is not in this version.\"), so it is not stageable.\n */\nexport const customerUpdateSchema = z\n .strictObject({\n /** Auto-tagging: Google appends the `gclid` click id to every landing page. */\n autoTaggingEnabled: z.boolean().optional(),\n /** Account tracking template. Campaign, ad group and ad templates REPLACE it; `\"\"` clears it. */\n trackingUrlTemplate: trackingUrlTemplateSchema.optional(),\n /** Account final URL suffix. Campaign, ad group and ad suffixes REPLACE it; `\"\"` clears it. */\n finalUrlSuffix: finalUrlSuffixSchema.optional(),\n /** Call reporting: Google counts and reports calls from call assets. */\n callReportingEnabled: z.boolean().optional(),\n /** Whether calls from ads count as conversions (needs call reporting on). */\n callConversionReportingEnabled: z.boolean().optional(),\n /** The account's video inventory type (brand safety) for YouTube and video placements. */\n videoBrandSafety: z.enum(VIDEO_BRAND_SAFETY_LEVELS).optional(),\n })\n .superRefine((p, ctx) => {\n if (Object.values(p).every((v) => v === undefined)) {\n ctx.addIssue({ code: \"custom\", message: \"update needs at least one setting\" });\n }\n if (p.callReportingEnabled === false && p.callConversionReportingEnabled === true) {\n ctx.addIssue({\n code: \"custom\",\n path: [\"callConversionReportingEnabled\"],\n message: \"calls can count as conversions only while call reporting is on\",\n });\n }\n });\nexport type CustomerUpdate = z.infer<typeof customerUpdateSchema>;\n\nexport const CUSTOMER_TARGET_MESSAGE =\n \"an account settings change targets the account itself — set target to the same id as customerId\";\n\n// --- Ad group ---\n\nexport const adGroupCreateSchema = z.strictObject({\n name: z.string().min(1).max(GOOGLE_ADS_LIMITS.adGroup.nameMax),\n campaign: refSchema,\n /**\n * Optional, and NOT defaulted: Google derives an ad group's type from its campaign's channel when\n * it is unset, and for a Demand Gen campaign that is the only way to say it — the v23 enum has no\n * Demand Gen value at all. A default of `SEARCH_STANDARD` would state a type nobody chose on every\n * ad group Baker stages, which on a Demand Gen campaign is a whole-batch publish failure.\n */\n type: z.enum(AD_GROUP_TYPES).optional(),\n cpcBidMicros: microsSchema.optional(),\n status: stageableStatusSchema.default(\"PAUSED\"),\n});\nexport type AdGroupCreate = z.infer<typeof adGroupCreateSchema>;\n\n/** Strict for the same reason as `campaignUpdateSchema`: an unknown key here used to be dropped in silence. */\nexport const adGroupUpdateSchema = z\n .strictObject({\n name: z.string().min(1).max(GOOGLE_ADS_LIMITS.adGroup.nameMax).optional(),\n cpcBidMicros: microsSchema.optional(),\n status: z.enum([\"ENABLED\", \"PAUSED\", \"REMOVED\"]).optional(),\n })\n .refine((p) => Object.values(p).some((v) => v !== undefined), \"update needs at least one field\");\nexport type AdGroupUpdate = z.infer<typeof adGroupUpdateSchema>;\n\n// --- Keywords (ad-group criteria) ---\n\nexport const keywordAddSchema = z.strictObject({\n adGroup: refSchema,\n text: keywordTextSchema,\n matchType: matchTypeSchema,\n cpcBidMicros: microsSchema.optional(),\n finalUrls: z.array(httpsUrlSchema).optional(),\n status: stageableStatusSchema.default(\"ENABLED\"),\n});\nexport type KeywordAdd = z.infer<typeof keywordAddSchema>;\n\nexport const keywordUpdateSchema = z\n .strictObject({\n cpcBidMicros: microsSchema.optional(),\n finalUrls: z.array(httpsUrlSchema).optional(),\n status: z.enum([\"ENABLED\", \"PAUSED\", \"REMOVED\"]).optional(),\n })\n .refine((p) => Object.values(p).some((v) => v !== undefined), \"update needs at least one field\");\nexport type KeywordUpdate = z.infer<typeof keywordUpdateSchema>;\n\nexport const negativeKeywordAddSchema = z.strictObject({\n level: z.enum([\"adGroup\", \"campaign\"]),\n parent: refSchema,\n text: keywordTextSchema,\n matchType: matchTypeSchema,\n});\nexport type NegativeKeywordAdd = z.infer<typeof negativeKeywordAddSchema>;\n\n/**\n * A negative keyword's new text or match type. Google never changes either on a live criterion\n * (both are immutable), so this publishes as a REPLACE — the new negative created and the old one\n * removed in one all-or-nothing request, so the term is never left unexcluded. Staging fills the\n * field left out from the live negative.\n */\nexport const negativeKeywordUpdateSchema = z\n .strictObject({ text: keywordTextSchema.optional(), matchType: matchTypeSchema.optional() })\n .refine((p) => p.text !== undefined || p.matchType !== undefined, \"update needs text or matchType\");\nexport type NegativeKeywordUpdate = z.infer<typeof negativeKeywordUpdateSchema>;\n\n// --- Shared sets (keyword lists) ---\n\nexport const sharedSetCreateSchema = z.strictObject({\n name: z.string().min(1).max(GOOGLE_ADS_LIMITS.sharedSet.nameMax),\n type: z.enum(SHARED_SET_TYPES).default(\"NEGATIVE_KEYWORDS\"),\n});\nexport type SharedSetCreate = z.infer<typeof sharedSetCreateSchema>;\n\n/** A keyword list's new name — the only thing about a list Google lets change (its type is fixed). */\nexport const sharedSetUpdateSchema = z.strictObject({\n name: z.string().min(1).max(GOOGLE_ADS_LIMITS.sharedSet.nameMax),\n});\nexport type SharedSetUpdate = z.infer<typeof sharedSetUpdateSchema>;\n\n/**\n * A member of a shared list: a keyword (`text` + `matchType`) in a negative keyword list, or a\n * criterion — a placement, app, app category or YouTube channel/video in a NEGATIVE_PLACEMENTS list,\n * a brand in a BRANDS list. Which list type takes which member is checked at stage, where the list's\n * type is known.\n */\nexport const sharedSetMemberAddSchema = z\n .strictObject({\n sharedSet: refSchema,\n text: keywordTextSchema.optional(),\n matchType: matchTypeSchema.optional(),\n criterion: criterionSpecSchema.optional(),\n })\n .superRefine((val, ctx) => {\n const keyword = val.text !== undefined || val.matchType !== undefined;\n if (keyword === (val.criterion !== undefined)) {\n ctx.addIssue({\n code: \"custom\",\n path: [],\n message:\n \"a list member is either a keyword (text + matchType) or a criterion (a placement, app, YouTube channel/video or brand) — give exactly one\",\n });\n return;\n }\n if (keyword && (val.text === undefined || val.matchType === undefined)) {\n ctx.addIssue({\n code: \"custom\",\n path: [val.text === undefined ? \"text\" : \"matchType\"],\n message: \"a keyword member needs text and matchType\",\n });\n }\n if (val.criterion) {\n const message = criterionLevelIssue(val.criterion, \"sharedSet\") ?? criterionBidIssue(val.criterion, true);\n if (message) {\n ctx.addIssue({ code: \"custom\", path: [\"criterion\"], message });\n }\n }\n });\nexport type SharedSetMemberAdd = z.infer<typeof sharedSetMemberAddSchema>;\n\nexport const campaignSharedSetAttachSchema = z.strictObject({\n campaign: refSchema,\n sharedSet: refSchema,\n});\nexport type CampaignSharedSetAttach = z.infer<typeof campaignSharedSetAttachSchema>;\n\n// --- Ads (asset-based, discriminated on format) ---\n\nconst adTextAssetSchema = z.strictObject({\n text: z.string().min(1),\n pinnedField: z.enum(PINNED_FIELDS).optional(),\n});\n\n/**\n * Every ad-content format is STRICT. An ad's creative lives in format-specific fields\n * (`images` on an App ad, `marketingImageAssets` on a Display ad, …), so a payload that names the\n * wrong one used to parse clean — zod dropped the unknown key, the derived updateMask never\n * mentioned the image field, and publish shipped headlines only while every staged image was\n * created in the account and attached to nothing. Rejecting the unknown key is the only place that\n * failure is visible; by publish the agent is long gone.\n */\nconst responsiveSearchAdSchema = z.strictObject({\n format: z.literal(\"responsiveSearch\"),\n headlines: z\n .array(\n adTextAssetSchema.refine(\n (a) => a.text.length <= GOOGLE_ADS_LIMITS.responsiveSearchAd.headlineTextMax,\n \"headline exceeds 30 chars\",\n ),\n )\n .min(GOOGLE_ADS_LIMITS.responsiveSearchAd.headlinesMin)\n .max(GOOGLE_ADS_LIMITS.responsiveSearchAd.headlinesMax),\n descriptions: z\n .array(\n adTextAssetSchema.refine(\n (a) => a.text.length <= GOOGLE_ADS_LIMITS.responsiveSearchAd.descriptionTextMax,\n \"description exceeds 90 chars\",\n ),\n )\n .min(GOOGLE_ADS_LIMITS.responsiveSearchAd.descriptionsMin)\n .max(GOOGLE_ADS_LIMITS.responsiveSearchAd.descriptionsMax),\n path1: z.string().max(GOOGLE_ADS_LIMITS.responsiveSearchAd.pathMax).optional(),\n path2: z.string().max(GOOGLE_ADS_LIMITS.responsiveSearchAd.pathMax).optional(),\n finalUrls: z.array(httpsUrlSchema).min(1),\n});\n\nconst responsiveDisplayAdSchema = z.strictObject({\n format: z.literal(\"responsiveDisplay\"),\n headlines: z\n .array(z.strictObject({ text: z.string().min(1).max(GOOGLE_ADS_LIMITS.responsiveDisplayAd.headlineTextMax) }))\n .min(1)\n .max(5),\n longHeadline: z.strictObject({\n text: z.string().min(1).max(GOOGLE_ADS_LIMITS.responsiveDisplayAd.longHeadlineTextMax),\n }),\n descriptions: z\n .array(z.strictObject({ text: z.string().min(1).max(GOOGLE_ADS_LIMITS.responsiveDisplayAd.descriptionTextMax) }))\n .min(1)\n .max(5),\n businessName: z.string().min(1).max(GOOGLE_ADS_LIMITS.responsiveDisplayAd.businessNameMax),\n // A Responsive Display Ad's images are fields on the ad's own content (never campaign-level\n // asset links). Google requires ≥1 landscape marketing image (1.91:1) AND ≥1 square marketing\n // image (1:1) to serve; the logo images are optional.\n marketingImageAssets: z.array(refSchema).optional(),\n squareMarketingImageAssets: z.array(refSchema).optional(),\n logoImageAssets: z.array(refSchema).optional(),\n finalUrls: z.array(httpsUrlSchema).min(1),\n});\n\n/**\n * An App ad's counts were unbounded here until a publish carrying 6 descriptions came back as the\n * bare word \"Too many.\" — Google's whole-batch rejection names no field, no count, and no limit, and\n * by then every image asset in the same draft had already been created in the account. The caps are\n * cheap to enforce at stage time and unreadable at publish.\n */\nconst appAdSchema = z.strictObject({\n format: z.literal(\"app\"),\n headlines: z\n .array(z.strictObject({ text: z.string().min(1).max(GOOGLE_ADS_LIMITS.appAd.headlineTextMax) }))\n .min(GOOGLE_ADS_LIMITS.appAd.headlinesMin)\n .max(GOOGLE_ADS_LIMITS.appAd.headlinesMax),\n descriptions: z\n .array(z.strictObject({ text: z.string().min(1).max(GOOGLE_ADS_LIMITS.appAd.descriptionTextMax) }))\n .min(GOOGLE_ADS_LIMITS.appAd.descriptionsMin)\n .max(GOOGLE_ADS_LIMITS.appAd.descriptionsMax),\n // An App campaign ad carries its images on its own content (`AppAdInfo.images`), not as\n // campaign-level asset links — same shape as a responsive display ad's marketing images.\n images: z.array(refSchema).max(GOOGLE_ADS_LIMITS.appAd.imagesMax).optional(),\n // `AppAdInfo.youtube_videos` — an App ad's videos live on its content too. Without this field\n // there is no way to express \"keep these videos on the ad\", so a content update that only\n // restated headlines silently left the ad's videos to whatever the mask happened to omit.\n youtubeVideos: z.array(refSchema).max(GOOGLE_ADS_LIMITS.appAd.youtubeVideosMax).optional(),\n});\n\nconst videoAdSchema = z.strictObject({\n format: z.literal(\"video\"),\n // A raw YouTube id is not a publishable Google Ads reference — the video must be staged as\n // its own `google.asset.create` (type: youtubeVideo) first, then referenced here by asset ref.\n videoAssets: z.array(refSchema).min(1),\n /**\n * Google requires both since v24 (`VideoResponsiveAdInfo.business_name` / `.logo_images`). Optional\n * here for the same reason as a Demand Gen video ad's media: an update masks only what it sends.\n * A create without them is refused at stage (`videoAdCreateRefusal`, backend `adFormatMatch.ts`).\n * The business name is an `AdTextAsset` on the wire, held to the Demand Gen video ad's 25 characters.\n */\n businessName: z.string().min(1).max(GOOGLE_ADS_LIMITS.demandGenVideoAd.businessNameMax).optional(),\n logoImageAssets: z.array(refSchema).optional(),\n finalUrls: z.array(httpsUrlSchema).min(1),\n});\n\nconst demandGenAdSchema = z.strictObject({\n format: z.literal(\"demandGen\"),\n /**\n * `Ad.name`. Accepted here but NOT required: a multi-asset Demand Gen ad published against a live\n * account with no name was created, and reads back with none. Only the video format requires one.\n */\n name: z.string().min(1).max(GOOGLE_ADS_LIMITS.demandGenAd.adNameMax).optional(),\n headlines: z\n .array(z.strictObject({ text: z.string().min(1).max(GOOGLE_ADS_LIMITS.demandGenAd.headlineTextMax) }))\n .min(GOOGLE_ADS_LIMITS.demandGenAd.headlinesMin)\n .max(GOOGLE_ADS_LIMITS.demandGenAd.headlinesMax),\n descriptions: z\n .array(z.strictObject({ text: z.string().min(1).max(GOOGLE_ADS_LIMITS.demandGenAd.descriptionTextMax) }))\n .min(GOOGLE_ADS_LIMITS.demandGenAd.descriptionsMin)\n .max(GOOGLE_ADS_LIMITS.demandGenAd.descriptionsMax),\n businessName: z.string().min(1).max(GOOGLE_ADS_LIMITS.demandGenAd.businessNameMax),\n finalUrls: z.array(httpsUrlSchema).min(1),\n imageAssets: z.array(refSchema).optional(),\n squareImageAssets: z.array(refSchema).optional(),\n logoImageAssets: z.array(refSchema).optional(),\n});\n\n/**\n * The Demand Gen ad that runs a video (`DEMAND_GEN_VIDEO_RESPONSIVE_AD`). It is its own format\n * rather than a few optional fields on `demandGen` because Google gives it a different message\n * (`demandGenVideoResponsiveAd`), a `longHeadlines` list no other Demand Gen ad has, and a\n * `businessName` that is a text ASSET rather than a bare string. Folding the two together would put\n * `longHeadlines` on a payload that publishes into a message with no such field.\n *\n * `videoAssets` / `logoImageAssets` / `callToActionAssets` are optional so a copy-only edit can omit\n * them: an ad update masks only the fields it sends, so an omitted media list is left as it is on\n * the ad (the same contract as an App ad's `images`). A CREATE needs a video and a logo (required by\n * Google since v24) — `demandGenVideoCreateRefusal` (backend `adFormatMatch.ts`) says so at stage.\n */\nconst demandGenVideoAdSchema = z.strictObject({\n format: z.literal(\"demandGenVideo\"),\n /**\n * `Ad.name` — the ad's own name, which Google REQUIRES on this format and asks for in its\n * interface as \"Ad name\". No other format Baker writes needs one (the multi-asset Demand Gen ad\n * was published without one and accepted), so nothing carried it: a create without it comes back\n * as `REQUIRED … at mutate_operations[n].ad_group_ad_operation.create.ad.name`, after every asset\n * in the same batch has already been created. Optional in the schema because `Ad.name` is\n * IMMUTABLE — an update must be able to restate the whole content without renaming the ad.\n */\n name: z.string().min(1).max(GOOGLE_ADS_LIMITS.demandGenVideoAd.adNameMax).optional(),\n headlines: z\n .array(z.strictObject({ text: z.string().min(1).max(GOOGLE_ADS_LIMITS.demandGenVideoAd.headlineTextMax) }))\n .min(GOOGLE_ADS_LIMITS.demandGenVideoAd.headlinesMin)\n .max(GOOGLE_ADS_LIMITS.demandGenVideoAd.headlinesMax),\n longHeadlines: z\n .array(z.strictObject({ text: z.string().min(1).max(GOOGLE_ADS_LIMITS.demandGenVideoAd.longHeadlineTextMax) }))\n .min(GOOGLE_ADS_LIMITS.demandGenVideoAd.longHeadlinesMin)\n .max(GOOGLE_ADS_LIMITS.demandGenVideoAd.longHeadlinesMax),\n descriptions: z\n .array(z.strictObject({ text: z.string().min(1).max(GOOGLE_ADS_LIMITS.demandGenVideoAd.descriptionTextMax) }))\n .min(GOOGLE_ADS_LIMITS.demandGenVideoAd.descriptionsMin)\n .max(GOOGLE_ADS_LIMITS.demandGenVideoAd.descriptionsMax),\n businessName: z.string().min(1).max(GOOGLE_ADS_LIMITS.demandGenVideoAd.businessNameMax),\n finalUrls: z.array(httpsUrlSchema).min(1),\n videoAssets: z.array(refSchema).optional(),\n logoImageAssets: z.array(refSchema).optional(),\n callToActionAssets: z.array(refSchema).optional(),\n});\n\n/**\n * Formats Google no longer accepts, and what to do instead — answered in place of zod's bare\n * \"invalid discriminator\", because the agent's next move depends on the route, not the verdict.\n */\nconst RETIRED_AD_FORMATS: Readonly<Record<string, string>> = {\n call: CALL_AD_RETIRED_MESSAGE,\n};\n\n/**\n * A Shopping campaign's product ad. It carries no copy: Google builds each ad from the Merchant\n * Center product it shows, so the format is the whole content.\n */\nconst shoppingProductAdSchema = z.strictObject({ format: z.literal(\"shoppingProduct\") });\n\nexport const SHOPPING_PRODUCT_AD_UPDATE_MESSAGE =\n \"A Shopping product ad has no copy to change — its title, image and price come from the Merchant Center feed. Change the product in Merchant Center, or pause or resume the ad.\";\n\nexport const adContentSchema = z.discriminatedUnion(\n \"format\",\n [\n responsiveSearchAdSchema,\n responsiveDisplayAdSchema,\n appAdSchema,\n videoAdSchema,\n demandGenAdSchema,\n demandGenVideoAdSchema,\n shoppingProductAdSchema,\n ],\n {\n error: (issue) => {\n const input = issue.input;\n const format = typeof input === \"object\" && input !== null ? (input as { format?: unknown }).format : undefined;\n return typeof format === \"string\" ? RETIRED_AD_FORMATS[format] : undefined;\n },\n },\n);\nexport type AdContent = z.infer<typeof adContentSchema>;\nexport type AdFormat = AdContent[\"format\"];\n\nexport const APP_AD_PAUSED_MESSAGE =\n \"An App ad cannot be created paused — Google refuses it (AD_TYPE_CANNOT_BE_PAUSED). Stage it ENABLED (`--status ENABLED`); it serves only once its ad group and campaign are enabled, so keep those paused until the user is ready.\";\n\nexport const adCreateSchema = z\n .strictObject({\n adGroup: refSchema,\n status: stageableStatusSchema.default(\"PAUSED\"),\n content: adContentSchema,\n })\n .refine((p) => !(p.content.format === \"app\" && p.status === \"PAUSED\"), {\n message: APP_AD_PAUSED_MESSAGE,\n path: [\"status\"],\n });\nexport type AdCreate = z.infer<typeof adCreateSchema>;\n\nexport const adUpdateSchema = z\n .strictObject({\n status: z.enum([\"ENABLED\", \"PAUSED\", \"REMOVED\"]).optional(),\n /** Whole-content replacement for RSA-like formats; re-validated against adContentSchema. */\n content: z.record(z.string(), z.unknown()).optional(),\n })\n .refine((p) => Object.values(p).some((v) => v !== undefined), \"update needs at least one field\")\n .refine((p) => p.content?.format !== \"shoppingProduct\", {\n message: SHOPPING_PRODUCT_AD_UPDATE_MESSAGE,\n path: [\"content\"],\n });\nexport type AdUpdate = z.infer<typeof adUpdateSchema>;\n\n// --- Assets & extensions ---\n\nconst textAssetSchema = z.strictObject({ type: z.literal(\"text\"), text: z.string().min(1) });\nconst imageAssetSchema = z.strictObject({\n type: z.literal(\"image\"),\n imageId: z.string().min(1),\n name: z.string().optional(),\n});\nconst youtubeVideoAssetSchema = z.strictObject({\n type: z.literal(\"youtubeVideo\"),\n youtubeVideoId: z.string().min(1),\n name: z.string().optional(),\n});\nconst sitelinkAssetSchema = z.strictObject({\n type: z.literal(\"sitelink\"),\n linkText: z.string().min(1).max(GOOGLE_ADS_LIMITS.asset.sitelinkLinkTextMax),\n description1: z.string().max(GOOGLE_ADS_LIMITS.asset.sitelinkDescriptionMax).optional(),\n description2: z.string().max(GOOGLE_ADS_LIMITS.asset.sitelinkDescriptionMax).optional(),\n finalUrls: z.array(httpsUrlSchema).min(1),\n});\nconst calloutAssetSchema = z.strictObject({\n type: z.literal(\"callout\"),\n calloutText: z.string().min(1).max(GOOGLE_ADS_LIMITS.asset.calloutTextMax),\n});\n/**\n * A structured snippet header is not free text: Google accepts only its own\n * published headers (or their translations) and rejects anything else at publish\n * with an error naming neither the field nor the list. Checked here so an\n * invented header can never be staged, and rewritten to Google's spelling so a\n * casing difference is not a lost asset.\n *\n * The list IS the length limit, so there is no `max()` in front of it. There was\n * one, borrowed from the 25-character cap on a snippet's VALUES, and it made the\n * Russian \"Degree programs\" (29 characters) the one published header Baker could\n * not stage. A cap in front of a closed vocabulary can only reject things the\n * vocabulary already accepts.\n */\nconst structuredSnippetHeaderSchema = z\n .string()\n .min(1)\n .transform((header, ctx) => {\n const canonical = canonicalStructuredSnippetHeader(header);\n if (!canonical) {\n ctx.addIssue({\n code: \"custom\",\n message:\n `Google Ads does not accept \"${header}\" as a structured snippet header. Use one of: ` +\n `${STRUCTURED_SNIPPET_HEADERS_EN.join(\", \")} — or that header in the campaign's language.`,\n });\n return z.NEVER;\n }\n return canonical;\n });\n\nconst structuredSnippetAssetSchema = z.strictObject({\n type: z.literal(\"structuredSnippet\"),\n header: structuredSnippetHeaderSchema,\n values: z\n .array(z.string().min(1).max(GOOGLE_ADS_LIMITS.asset.structuredSnippetValueMax))\n .min(GOOGLE_ADS_LIMITS.asset.structuredSnippetValuesMin)\n .max(GOOGLE_ADS_LIMITS.asset.structuredSnippetValuesMax),\n});\nconst callToActionAssetSchema = z.strictObject({ type: z.literal(\"callToAction\"), callToAction: z.string().min(1) });\n\nexport const assetCreateSchema = z.discriminatedUnion(\"type\", [\n textAssetSchema,\n imageAssetSchema,\n youtubeVideoAssetSchema,\n sitelinkAssetSchema,\n calloutAssetSchema,\n structuredSnippetAssetSchema,\n callToActionAssetSchema,\n]);\nexport type AssetCreate = z.infer<typeof assetCreateSchema>;\n\n/**\n * Flat partial of the mutable fields across every asset type — the caller doesn't repeat the\n * asset's `type` discriminant to amend it. Live publish maps fields to their sub-message via an\n * updateMask (`sitelinkAsset.linkText`, `calloutAsset.calloutText`, …); Google mutates any asset\n * subtype through the same `AssetOperation.update`, and only the fields actually set are masked.\n */\nexport const assetUpdateSchema = z\n .strictObject({\n name: z.string().min(1).optional(),\n linkText: z.string().min(1).max(GOOGLE_ADS_LIMITS.asset.sitelinkLinkTextMax).optional(),\n description1: z.string().max(GOOGLE_ADS_LIMITS.asset.sitelinkDescriptionMax).optional(),\n description2: z.string().max(GOOGLE_ADS_LIMITS.asset.sitelinkDescriptionMax).optional(),\n finalUrls: z.array(httpsUrlSchema).min(1).optional(),\n calloutText: z.string().min(1).max(GOOGLE_ADS_LIMITS.asset.calloutTextMax).optional(),\n header: structuredSnippetHeaderSchema.optional(),\n values: z\n .array(z.string().min(1).max(GOOGLE_ADS_LIMITS.asset.structuredSnippetValueMax))\n .min(GOOGLE_ADS_LIMITS.asset.structuredSnippetValuesMin)\n .max(GOOGLE_ADS_LIMITS.asset.structuredSnippetValuesMax)\n .optional(),\n callToAction: z.string().min(1).optional(),\n text: z.string().min(1).optional(),\n })\n .refine((p) => Object.values(p).some((v) => v !== undefined), \"update needs at least one field\");\nexport type AssetUpdate = z.infer<typeof assetUpdateSchema>;\n\nexport const assetLinkAttachSchema = z\n .strictObject({\n level: z.enum([\"campaign\", \"adGroup\", \"customer\"]),\n parent: refSchema.optional(),\n asset: refSchema,\n // A plain string, not `z.enum(ASSET_FIELD_TYPES)`, so the image refusal below can answer with\n // the reason instead of an enum listing. An agent reaching for AD_IMAGE is following Google's\n // own documentation; \"Invalid option: expected one of …\" sends it to guess another field type,\n // which is the failure this whole refusal exists to end.\n fieldType: z.string().min(1),\n })\n .superRefine((value, ctx) => {\n // Customer-level links attach account-wide; campaign/adGroup links without a parent\n // build a mutate operation missing its required campaign/adGroup and fail at publish.\n if (value.level !== \"customer\" && !value.parent) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: [\"parent\"],\n message: `parent is required for a ${value.level}-level asset link (--parent-ref)`,\n });\n }\n if (value.fieldType === \"BUSINESS_LOGO\" && value.level === \"adGroup\") {\n ctx.addIssue({ code: z.ZodIssueCode.custom, path: [\"fieldType\"], message: BUSINESS_LOGO_LEVEL_MESSAGE });\n } else if (isImageAssetLinkFieldType(value.fieldType)) {\n // Parses, and is decided at stage time: AD_IMAGE is asked of Google per account and stages or\n // hands over; a marketing-image type is sent back to AD_IMAGE. Refusing it HERE cost the user the\n // handover: a schema refusal leaves no chat to record against, and a batch carrying sitelinks\n // alongside the image failed whole. See `ads/google/writes/stage.ts`.\n } else if (!(ASSET_FIELD_TYPES as readonly string[]).includes(value.fieldType)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: [\"fieldType\"],\n message: `expected one of ${ASSET_FIELD_TYPES.join(\" | \")}`,\n });\n }\n });\nexport type AssetLinkAttach = z.infer<typeof assetLinkAttachSchema>;\n\n// --- Performance Max asset groups ---\n\n/**\n * A Performance Max asset group — its own entity, not an ad format. Publish synthesizes a text\n * asset per headline/longHeadline/description/businessName plus one `AssetGroupAsset` link per\n * asset (see the publish builder); staging here only carries the group's copy + image refs.\n */\nexport const assetGroupCreateSchema = z.strictObject({\n campaign: refSchema,\n name: z.string().min(1).max(GOOGLE_ADS_LIMITS.assetGroup.nameMax),\n finalUrls: z.array(httpsUrlSchema).min(1),\n headlines: z\n .array(z.strictObject({ text: z.string().min(1).max(GOOGLE_ADS_LIMITS.assetGroup.headlineTextMax) }))\n .min(GOOGLE_ADS_LIMITS.assetGroup.headlinesMin)\n .max(GOOGLE_ADS_LIMITS.assetGroup.headlinesMax),\n longHeadlines: z\n .array(z.strictObject({ text: z.string().min(1).max(GOOGLE_ADS_LIMITS.assetGroup.longHeadlineTextMax) }))\n .min(GOOGLE_ADS_LIMITS.assetGroup.longHeadlinesMin)\n .max(GOOGLE_ADS_LIMITS.assetGroup.longHeadlinesMax),\n descriptions: z\n .array(z.strictObject({ text: z.string().min(1).max(GOOGLE_ADS_LIMITS.assetGroup.descriptionTextMax) }))\n .min(GOOGLE_ADS_LIMITS.assetGroup.descriptionsMin)\n .max(GOOGLE_ADS_LIMITS.assetGroup.descriptionsMax),\n businessName: z.string().min(1).max(GOOGLE_ADS_LIMITS.assetGroup.businessNameMax),\n imageAssets: z.array(refSchema).optional(),\n squareImageAssets: z.array(refSchema).optional(),\n portraitImageAssets: z.array(refSchema).optional(),\n logoAssets: z.array(refSchema).optional(),\n status: z.enum([\"ENABLED\", \"PAUSED\"]).default(\"PAUSED\"),\n});\nexport type AssetGroupCreate = z.infer<typeof assetGroupCreateSchema>;\n\n/**\n * Link one already-existing asset into an already-existing asset group. `assetGroup.create` links a\n * group's opening set of assets inline, and `assetLink.attach` covers campaign/adGroup/customer\n * links — neither can touch the assets of a group that is already live, which is what a creative\n * refresh actually is. Detach is the plain target-only twin (`google.assetGroupAsset.detach`), whose\n * target is the composite `customers/{cid}/assetGroupAssets/{group}~{asset}~{FIELD_TYPE}`.\n *\n * Swapping a creative is attach-then-detach, and the order they are STAGED in is the order they\n * publish in — `planBatchWindows` sorts by stage index and Google Ads removals carry no dependency\n * edge (docs/publishing.md → Known gap). Detach staged first therefore reaches Google first, and if\n * it was the last asset of that field type the group drops below its per-ratio minimum and the\n * operation is rejected. The attach has to be staged first; nothing reorders it for you.\n */\nexport const assetGroupAssetAttachSchema = z.strictObject({\n assetGroup: refSchema,\n asset: refSchema,\n fieldType: z.enum(ASSET_GROUP_ASSET_FIELD_TYPES),\n});\nexport type AssetGroupAssetAttach = z.infer<typeof assetGroupAssetAttachSchema>;\n\nexport const assetGroupUpdateSchema = z\n .strictObject({\n name: z.string().min(1).max(GOOGLE_ADS_LIMITS.assetGroup.nameMax).optional(),\n finalUrls: z.array(httpsUrlSchema).min(1).optional(),\n status: z.enum([\"ENABLED\", \"PAUSED\", \"REMOVED\"]).optional(),\n })\n .refine((p) => Object.values(p).some((v) => v !== undefined), \"update needs at least one field\");\nexport type AssetGroupUpdate = z.infer<typeof assetGroupUpdateSchema>;\n\n// --- Audiences (user lists) & audience criteria ---\n\n/**\n * One condition a visitor has to meet: a page-URL (`url__`), referrer (`ref_url__`) or custom\n * parameter compared to a value. A text value is a string rule item, a number a number one.\n */\nconst audienceRuleConditionSchema = z.union([\n z.strictObject({\n name: z.string().min(1).default(\"url__\"),\n operator: z.enum(USER_LIST_STRING_OPERATORS),\n value: z.string().min(1),\n }),\n z.strictObject({\n name: z.string().min(1),\n operator: z.enum(USER_LIST_NUMBER_OPERATORS),\n value: z.number(),\n }),\n]);\n\n/**\n * One group of conditions a visitor meets ALL of, within a lookback window. \"Any of\" is several\n * groups under `combine: \"ANY\"`: Google allows one rule-item group per operand, and answered a\n * second one with `TOO_MANY` on `inclusive_operands` (live, v25).\n */\nconst audienceRuleOperandSchema = z.strictObject({\n conditions: z.array(audienceRuleConditionSchema).min(1),\n lookbackWindowDays: z.number().int().min(1).max(GOOGLE_ADS_LIMITS.audience.membershipLifeSpanDaysMax).optional(),\n});\n\n/**\n * A website-visitor list (`rule_based_user_list.flexible_rule_user_list`): people who meet the\n * `include` groups (`ANY` of them by default, or `ALL`) and none of the `exclude` ones. `prefill`\n * asks Google to fill it with the last 30 days of visitors instead of starting empty.\n */\nconst audienceRuleSchema = z.strictObject({\n include: z.array(audienceRuleOperandSchema).min(1),\n combine: z.enum([\"ALL\", \"ANY\"]).default(\"ANY\"),\n exclude: z.array(audienceRuleOperandSchema).optional(),\n prefill: z.boolean().optional(),\n});\nexport type AudienceRule = z.infer<typeof audienceRuleSchema>;\n\n/** A reference that has to name something already in the account — a resource name or a bare id. */\nfunction existingRefSchema(message: string) {\n return z.union([z.string().regex(RESOURCE_NAME_REGEX), z.string().regex(NUMERIC_ID_REGEX)], { error: message });\n}\n\nexport const LOGICAL_OPERAND_MESSAGE =\n \"a combined audience can only be made of audiences that already exist in the account — Google does not find one staged in this same draft. Publish those first, then stage the combination.\";\n\nexport const BASIC_ACTION_MESSAGE =\n \"a converters audience can only be built from conversion actions that already exist in the account — Google refuses one staged in this same draft. Publish the conversion action first, then stage the audience.\";\n\n/** A combined audience: each rule takes ALL, ANY or NONE of its audiences, and every rule must hold. */\nconst audienceLogicSchema = z\n .array(\n z.strictObject({\n operator: z.enum(USER_LIST_LOGICAL_OPERATORS),\n audiences: z.array(existingRefSchema(LOGICAL_OPERAND_MESSAGE)).min(1),\n }),\n )\n .min(1);\n\nexport const LOOKALIKE_SEED_MESSAGE =\n \"a lookalike's seed audiences must already exist in the account — Google takes them by id, which an audience staged in this draft does not have until it publishes. Publish the seed first, then stage the lookalike.\";\n\n/**\n * A lookalike (`lookalike_user_list`, Demand Gen only): people like the seed audiences, in the\n * given countries, reaching as far as `expansion` says.\n */\nconst audienceLookalikeSchema = z.strictObject({\n seedAudiences: z.array(existingRefSchema(LOOKALIKE_SEED_MESSAGE)).min(1),\n expansion: z.enum(LOOKALIKE_EXPANSION_LEVELS).default(\"BALANCED\"),\n countryCodes: z.array(z.string().regex(/^[A-Z]{2}$/, \"a two-letter country code, e.g. ES\")).optional(),\n});\n\n/** What each list type is built from — the one payload field it needs, and nobody else may carry. */\nconst AUDIENCE_TYPE_SOURCE: Readonly<Record<(typeof USER_LIST_TYPES)[number], string | undefined>> = {\n CRM_BASED: undefined,\n RULE_BASED: \"rule\",\n LOGICAL: \"logic\",\n BASIC: \"conversionActions\",\n LOOKALIKE: \"lookalike\",\n};\n\nconst AUDIENCE_SOURCE_NEEDED: Readonly<Record<string, string>> = {\n rule: 'a website-visitor audience (RULE_BASED) needs a \"rule\" — who joins, e.g. {\"include\":[{\"conditions\":[{\"operator\":\"CONTAINS\",\"value\":\"/pricing\"}]}]}',\n logic:\n 'a combined audience (LOGICAL) needs \"logic\" — the audiences it is made of, e.g. [{\"operator\":\"ANY\",\"audiences\":[\"<audience id>\",\"<audience id>\"]}]',\n conversionActions:\n 'a converters audience (BASIC) needs \"conversionActions\" — the conversion actions whose converters join it (Google refuses one with none)',\n lookalike:\n 'a lookalike audience needs \"lookalike\" — {\"seedAudiences\":[\"<audience id>\"],\"expansion\":\"BALANCED\",\"countryCodes\":[\"ES\"]}',\n};\n\n/** Why a membership duration cannot be staged on this list type, or undefined to stage it. */\nfunction membershipLifeSpanRefusal(type: (typeof USER_LIST_TYPES)[number]): string | undefined {\n if (type === \"RULE_BASED\") {\n return \"Google ignores membershipLifeSpanDays on a website-visitor audience — how long someone stays is each include group's lookbackWindowDays. Set it there instead.\";\n }\n if (type === \"LOGICAL\") {\n return \"Google ignores membershipLifeSpanDays on a combined audience — membership follows the audiences it is made of.\";\n }\n return undefined;\n}\n\nexport const audienceCreateSchema = z\n .strictObject({\n name: z.string().min(1).max(GOOGLE_ADS_LIMITS.audience.nameMax),\n type: z.enum(USER_LIST_TYPES).default(\"BASIC\"),\n description: z.string().optional(),\n /** Customer-match members (crm-based) — file-first for large lists. */\n members: z.array(z.record(z.string(), z.string())).optional(),\n sourceFileRef: z.string().optional(),\n /**\n * How long a member stays in a converters or customer list, in days (`membership_life_span`, at\n * most 540). A customer list can no longer be kept forever: Google dropped \"never expires\" (10000)\n * for Customer Match on 2025-04-07 and answers \"Too high.\" Google ignores it on website-visitor\n * and combined lists, so it is refused there.\n */\n membershipLifeSpanDays: z\n .number()\n .int()\n .min(1)\n .max(\n GOOGLE_ADS_LIMITS.audience.membershipLifeSpanDaysMax,\n `membershipLifeSpanDays is 1–${GOOGLE_ADS_LIMITS.audience.membershipLifeSpanDaysMax} — Google no longer keeps anyone on a list forever`,\n )\n .optional(),\n /** RULE_BASED: who joins the list. */\n rule: audienceRuleSchema.optional(),\n /** LOGICAL: the audiences this one combines. */\n logic: audienceLogicSchema.optional(),\n /** BASIC: the conversion actions whose converters join the list. */\n conversionActions: z.array(existingRefSchema(BASIC_ACTION_MESSAGE)).min(1).optional(),\n /** LOOKALIKE: the seed audiences and how far past them to reach. */\n lookalike: audienceLookalikeSchema.optional(),\n })\n .superRefine((p, ctx) => {\n if (p.membershipLifeSpanDays !== undefined) {\n const refusal = membershipLifeSpanRefusal(p.type);\n if (refusal) {\n ctx.addIssue({ code: \"custom\", path: [\"membershipLifeSpanDays\"], message: refusal });\n }\n }\n const own = AUDIENCE_TYPE_SOURCE[p.type];\n for (const field of Object.keys(AUDIENCE_SOURCE_NEEDED)) {\n const present = (p as Record<string, unknown>)[field] !== undefined;\n if (field === own && !present) {\n ctx.addIssue({ code: \"custom\", path: [field], message: AUDIENCE_SOURCE_NEEDED[field] ?? field });\n }\n if (field !== own && present) {\n ctx.addIssue({\n code: \"custom\",\n path: [field],\n message: `\"${field}\" belongs to another audience type, not ${p.type}`,\n });\n }\n }\n });\nexport type AudienceCreate = z.infer<typeof audienceCreateSchema>;\n\n/**\n * Strict, for the same reason `geoTargetTypeSetting` is: a key this schema does not know used to\n * vanish between the command line and the stored payload, and the op published on Google's default.\n * Here that default is the expensive one — an audience criterion whose dimension has no\n * `bid_only: true` restriction RESTRICTS the parent's reach to the list (Google's API default is\n * Targeting mode, unlike the interface, which offers Observation). `bidOnly` and `targetingSetting`\n * were both tried against this op in production and both were silently dropped; the campaign was\n * one publish away from serving only to a 6,700-person remarketing list. Whether the parent\n * restricts is not a property of the criterion at all — it lives on the campaign/ad group, so it is\n * set by `google.targetingSetting.set` and refused here rather than quietly ignored.\n */\nexport const audienceCriterionAttachSchema = z\n .strictObject({\n level: z.enum([\"campaign\", \"adGroup\"]),\n parent: refSchema,\n /** An audience list (`userLists/{id}`, or a `g_temp_*` list staged in this chat). */\n userList: refSchema.optional(),\n /** An interest or in-market segment (`userInterests/{id}`) — read ids with `--preset audiences`. */\n userInterest: z.union([z.string().regex(RESOURCE_NAME_REGEX), z.string().regex(NUMERIC_ID_REGEX)]).optional(),\n /** A custom segment (`customAudiences/{id}`) built in Google Ads. */\n customAudience: z.union([z.string().regex(RESOURCE_NAME_REGEX), z.string().regex(NUMERIC_ID_REGEX)]).optional(),\n negative: z.boolean().default(false),\n })\n .refine(\n (p) => [p.userList, p.userInterest, p.customAudience].filter((v) => v !== undefined).length === 1,\n \"name exactly one audience: userList, userInterest or customAudience\",\n );\nexport type AudienceCriterionAttach = z.infer<typeof audienceCriterionAttachSchema>;\n\n/** The audience an attach names, as a criterion spec — what the builder and the channel matrix read. */\nexport function audienceSegmentOf(payload: AudienceCriterionAttach): CriterionSpec {\n if (payload.userInterest !== undefined) {\n return { criterionType: \"userInterest\", userInterest: payload.userInterest };\n }\n if (payload.customAudience !== undefined) {\n return { criterionType: \"customAudience\", customAudience: payload.customAudience };\n }\n return { criterionType: \"userList\", userList: payload.userList ?? \"\" };\n}\n\n/**\n * One `TargetingSetting.target_restrictions` row: a targeting dimension plus whether criteria in it\n * only move bids (`bidOnly: true`, the interface's \"Observation\") or also restrict who sees the ads\n * (`bidOnly: false`, \"Targeting\").\n */\nconst targetRestrictionSchema = z.strictObject({\n targetingDimension: z.enum(TARGETING_DIMENSIONS),\n bidOnly: z.boolean(),\n});\nexport type GoogleTargetRestriction = z.infer<typeof targetRestrictionSchema>;\n\n/**\n * Switch the AUDIENCE dimension of a campaign's or ad group's targeting setting between Observation\n * and Targeting — the selector the Google Ads interface shows next to an audience, which the API\n * does not default the same way (see `audienceCriterionAttachSchema`).\n *\n * Two things are load-bearing:\n *\n * - **The parent is in the payload, not in `target`.** It has to resolve a `g_temp_*` ref, because\n * the case that costs money most is an ad group created in this same draft: it starts with no\n * AUDIENCE restriction at all, so an audience attached to it publishes in Targeting mode.\n * - **`preserved` is resolved at stage time from the live setting and never supplied by the\n * caller.** `target_restrictions` is a repeated field, and Google replaces it wholesale on write,\n * so the AGE_RANGE / GENDER / PARENTAL_STATUS / INCOME_RANGE rows an account already carries have\n * to be re-sent verbatim or they are wiped along with any bid adjustment behind them. It stays\n * `.optional()` here because that is the truth of the input shape — the request builder refuses\n * to build without it rather than send a write that silently drops the other dimensions.\n */\nexport const targetingSettingSetSchema = z.strictObject({\n level: z.enum([\"campaign\", \"adGroup\"]),\n parent: refSchema,\n audience: z.enum([\"OBSERVATION\", \"TARGETING\"]),\n preserved: z.array(targetRestrictionSchema).optional(),\n});\nexport type TargetingSettingSet = z.infer<typeof targetingSettingSetSchema>;\n\n// --- Conversion actions ---\n\n/**\n * Every field below that Baker fills in when the payload is silent is `.optional()` here and\n * defaulted by `resolveConversionActionCreate` instead — never by `z.default()`.\n *\n * A `.default()` is invisible after the fact: the parsed payload cannot tell \"the agent chose\n * ONE_PER_CLICK\" from \"the agent said nothing\", and that payload is what gets stored, re-read on\n * every amend, and rendered on the review card. Keeping the omission in the stored payload is what\n * lets `collectOpWarnings` surface a filled-in business decision as a reviewable one — and it keeps\n * surviving an amend, which re-parses the STORED payload and would otherwise see five explicit\n * choices the agent never made.\n */\nexport const conversionActionCreateSchema = z.strictObject({\n name: z.string().min(1).max(GOOGLE_ADS_LIMITS.conversionAction.nameMax),\n type: z\n .enum(CONVERSION_ACTION_TYPES, {\n error: retiredChoiceError({ GOOGLE_ANALYTICS_4_CUSTOM: GA4_CONVERSION_CREATE_MESSAGE }),\n })\n .optional(),\n category: z.enum(CONVERSION_ACTION_CATEGORIES).optional(),\n countingType: z.enum(CONVERSION_COUNTING_TYPES).optional(),\n defaultValueMicros: microsSchema.optional(),\n defaultCurrencyCode: z.string().length(3).optional(),\n clickThroughLookbackWindowDays: z.number().int().positive().optional(),\n viewThroughLookbackWindowDays: z.number().int().positive().optional(),\n status: z.enum([\"ENABLED\", \"PAUSED\"]).optional(),\n /**\n * Primary = Google bids toward this conversion; secondary = it is only reported (\"Primary action\n * used for bidding optimization\" / \"Secondary action not used for bidding optimization\" in the UI).\n * Resolves to SECONDARY on create, deliberately: left unset ON THE WIRE, Google picks — and in a\n * live account some actions were born primary and some secondary, so a new action could silently\n * join the bidding target of every Maximize-Conversions campaign and redirect real spend. Nothing\n * exists yet to flip on a create, so a fixed resolved value is safe here in a way it would never be\n * on an update: joining bidding becomes an explicit `primaryForGoal: true`, never an accident.\n */\n primaryForGoal: z.boolean().optional(),\n});\nexport type ConversionActionCreate = z.infer<typeof conversionActionCreateSchema>;\n\n/**\n * What Baker sends for a conversion-action create field the payload left out. Applied on the way OUT\n * — at publish, on the review card, and in the op summary — never on the way in (see the schema\n * above). `primaryForGoal` in particular must always be sent: omitting it on the wire lets Google\n * decide the new action's bidding role.\n */\nexport const CONVERSION_ACTION_CREATE_DEFAULTS = {\n type: \"WEBPAGE\",\n category: \"DEFAULT\",\n countingType: \"ONE_PER_CLICK\",\n status: \"ENABLED\",\n primaryForGoal: false,\n} as const satisfies Partial<ConversionActionCreate>;\n\nexport type ResolvedConversionActionCreate = ConversionActionCreate &\n Required<Pick<ConversionActionCreate, \"type\" | \"category\" | \"countingType\" | \"status\" | \"primaryForGoal\">>;\n\n/** A create payload with every unstated field filled in — what actually reaches Google. */\nexport function resolveConversionActionCreate(payload: ConversionActionCreate): ResolvedConversionActionCreate {\n return {\n ...payload,\n type: payload.type ?? CONVERSION_ACTION_CREATE_DEFAULTS.type,\n category: payload.category ?? CONVERSION_ACTION_CREATE_DEFAULTS.category,\n countingType: payload.countingType ?? CONVERSION_ACTION_CREATE_DEFAULTS.countingType,\n status: payload.status ?? CONVERSION_ACTION_CREATE_DEFAULTS.status,\n primaryForGoal: payload.primaryForGoal ?? CONVERSION_ACTION_CREATE_DEFAULTS.primaryForGoal,\n };\n}\n\n/**\n * An agent reaching for `HIDDEN` wants \"stop counting this without deleting it\", so saying only\n * \"not a valid value\" sends it to `REMOVED` on an action it never meant to retire. Name both real\n * routes instead: demote to secondary keeps the measurement and takes it out of bidding, `REMOVED`\n * stops the measurement.\n */\nconst HIDDEN_CONVERSION_STATUS_ERROR =\n 'Google rejects status HIDDEN on every conversion action write (\"the field\\'s value is on a deny-list\"), so it is not part of this contract. ' +\n \"To stop automated bidding optimizing toward a conversion while it keeps measuring, demote it instead: `baker ads google conversions update --target <id> --no-primary`. \" +\n 'To stop it counting altogether, use `status: \"REMOVED\"`. Pick one of those and carry on with the rest of the job.';\n\nexport const conversionActionUpdateSchema = z\n .strictObject({\n name: z.string().min(1).max(GOOGLE_ADS_LIMITS.conversionAction.nameMax).optional(),\n category: z.enum(CONVERSION_ACTION_CATEGORIES).optional(),\n countingType: z.enum(CONVERSION_COUNTING_TYPES).optional(),\n defaultValueMicros: microsSchema.optional(),\n defaultCurrencyCode: z.string().length(3).optional(),\n clickThroughLookbackWindowDays: z.number().int().positive().optional(),\n viewThroughLookbackWindowDays: z.number().int().positive().optional(),\n /**\n * `HIDDEN` is deliberately not writable. Google returns it — an action hidden long ago reads\n * back as HIDDEN, and every read path keeps it — but it is on the API's deny-list for a write:\n * `conversion_action.status = HIDDEN` fails with \"The field's value is on a deny-list for this\n * field\" even on an ordinary WEBPAGE action with nothing else wrong. Offering it made it the\n * obvious pick for an agent told to retire an action gently, and the whole cleanup published\n * nothing.\n */\n status: z\n .enum([\"ENABLED\", \"REMOVED\"], {\n error: (issue) => (issue.input === \"HIDDEN\" ? HIDDEN_CONVERSION_STATUS_ERROR : undefined),\n })\n .optional(),\n /** Promote to primary (bid toward it) or demote to secondary (report only). No default — an\n * update must never change an existing action's bidding role unless it was asked to. */\n primaryForGoal: z.boolean().optional(),\n })\n .refine((p) => Object.values(p).some((v) => v !== undefined), \"update needs at least one field\")\n .refine(\n (p) => p.status !== \"REMOVED\" || Object.entries(p).every(([k, v]) => k === \"status\" || v === undefined),\n 'removing a conversion action cannot be combined with other edits — `status: \"REMOVED\"` deletes it, so a name or category sent alongside would be silently discarded. Stage the removal on its own.',\n );\nexport type ConversionActionUpdate = z.infer<typeof conversionActionUpdateSchema>;\n\n// --- Account-level conversion goals ---\n\n/**\n * `CustomerConversionGoal` — the account-level half of \"does this conversion drive bidding\".\n *\n * A conversion action steers automated bidding only when BOTH halves agree: the action is\n * `primaryForGoal`, AND the account-level goal for its (category, origin) pair is `biddable`. Google\n * creates one goal row per pair automatically as conversion actions appear, so this op never creates\n * or removes anything — it flips the one writable field on a row that already exists.\n *\n * ONE op per (category, origin), never a bag of pairs. Google's own samples mutate several goals in a\n * single request to make exactly one biddable, but atomicity is not what that buys here: a whole draft\n * already publishes as one `GoogleAdsService.Mutate` batch, so N staged ops land in N operations of the\n * SAME request and get exactly Google's semantics. What a multi-pair payload would cost is everything\n * the surface keys off one-op-one-change — a review card the user reads as a single decision, per-op\n * amend, per-op no-op detection, and per-op error attribution at publish.\n *\n * Both key halves are immutable on the resource, so they are the address, not an edit: only `biddable`\n * ever changes, and it is never defaulted — this op moves what the account bids toward in both\n * directions, and an op that forgot to say which way must fail rather than pick one.\n */\nexport const conversionGoalSetSchema = z.strictObject({\n category: z.enum(CONVERSION_ACTION_CATEGORIES),\n origin: z.enum(CONVERSION_ORIGINS),\n /** True = conversions of this category/origin count toward automated bidding; false = reported only. */\n biddable: z.boolean(),\n});\nexport type ConversionGoalSet = z.infer<typeof conversionGoalSetSchema>;\n\n/** `customers/{cid}/customerConversionGoals/{CATEGORY}~{ORIGIN}` — the goal's resource name is its key. */\nexport function conversionGoalResourceName(customerId: string, category: string, origin: string): string {\n return `customers/${customerId}/customerConversionGoals/${category}~${origin}`;\n}\n\n/** \"PURCHASE\" + \"WEBSITE\" → `Purchase (website)` — how the Goals table names the pair. */\nexport function conversionGoalLabel(category: string, origin: string): string {\n const words = (value: string) => value.toLowerCase().replace(/_/g, \" \");\n const category_ = words(category);\n return `${category_.charAt(0).toUpperCase()}${category_.slice(1)} (${words(origin)})`;\n}\n\n// --- Portfolio bidding strategies ---\n\n/**\n * Google's BiddingStrategy resource carries no target_cpc scheme — Demand Gen's target CPC is\n * campaign-level only. Accepting it on either verb would stage an op that can only fail at publish,\n * inside an atomic batch, taking every co-staged op down with it — so the create and the update\n * refuse it with the same sentence.\n */\nconst PORTFOLIO_TARGET_CPC_MESSAGE =\n \"portfolio strategies cannot be Target CPC — it is set on the Demand Gen campaign itself\";\n\n/** Why this type cannot be a portfolio strategy at all, or undefined. Manual CPC and Target CPC have their own sentences. */\nfunction portfolioTypeRefusal(type: GoogleBiddingStrategyType | undefined): string | undefined {\n if (type === undefined || type === \"MANUAL_CPC\" || type === \"TARGET_CPC\" || PORTFOLIO_STRATEGY_TYPES.includes(type)) {\n return undefined;\n }\n return `a portfolio strategy cannot be ${type} — Google has no portfolio form of it. Portfolios are ${PORTFOLIO_STRATEGY_TYPES.join(\", \")}; set ${type} on the campaign itself.`;\n}\n\nexport const biddingStrategyCreateSchema = z\n .strictObject({\n name: z.string().min(1).max(GOOGLE_ADS_LIMITS.biddingStrategy.nameMax),\n config: biddingConfigSchema,\n })\n .superRefine((p, ctx) => {\n if (p.config.type === \"MANUAL_CPC\") {\n ctx.addIssue({ code: \"custom\", path: [\"config\", \"type\"], message: \"portfolio strategies cannot be Manual CPC\" });\n }\n if (p.config.type === \"TARGET_CPC\") {\n ctx.addIssue({ code: \"custom\", path: [\"config\", \"type\"], message: PORTFOLIO_TARGET_CPC_MESSAGE });\n }\n const typeRefusal = portfolioTypeRefusal(p.config.type);\n if (typeRefusal) {\n ctx.addIssue({ code: \"custom\", path: [\"config\", \"type\"], message: typeRefusal });\n }\n addTargetImpressionShareIssues(p.config, \"config\", ctx);\n });\nexport type BiddingStrategyCreate = z.infer<typeof biddingStrategyCreateSchema>;\n\nexport const biddingStrategyUpdateSchema = z\n .strictObject({\n name: z.string().min(1).max(GOOGLE_ADS_LIMITS.biddingStrategy.nameMax).optional(),\n config: biddingConfigSchema.optional(),\n })\n .superRefine((p, ctx) => {\n if (Object.values(p).every((v) => v === undefined)) {\n ctx.addIssue({ code: \"custom\", message: \"update needs at least one field\" });\n }\n if (p.config?.type === \"TARGET_CPC\") {\n ctx.addIssue({ code: \"custom\", path: [\"config\", \"type\"], message: PORTFOLIO_TARGET_CPC_MESSAGE });\n }\n const typeRefusal = portfolioTypeRefusal(p.config?.type);\n if (typeRefusal) {\n ctx.addIssue({ code: \"custom\", path: [\"config\", \"type\"], message: typeRefusal });\n }\n });\nexport type BiddingStrategyUpdate = z.infer<typeof biddingStrategyUpdateSchema>;\n\n// --- Labels ---\n\nexport const labelCreateSchema = z.strictObject({\n name: z.string().min(1).max(GOOGLE_ADS_LIMITS.label.nameMax),\n backgroundColor: z\n .string()\n .regex(/^#[0-9A-Fa-f]{6}$/)\n .optional(),\n description: z.string().optional(),\n});\nexport type LabelCreate = z.infer<typeof labelCreateSchema>;\n\n/** A label's name, colour or description. `description: \"\"` clears it. Names are unique in the account. */\nexport const labelUpdateSchema = z\n .strictObject({\n name: z.string().min(1).max(GOOGLE_ADS_LIMITS.label.nameMax).optional(),\n backgroundColor: z\n .string()\n .regex(/^#[0-9A-Fa-f]{6}$/)\n .optional(),\n description: z.string().optional(),\n })\n .refine((p) => Object.values(p).some((v) => v !== undefined), \"update needs at least one field\");\nexport type LabelUpdate = z.infer<typeof labelUpdateSchema>;\n\nexport const ASSET_LABEL_MESSAGE =\n \"Google Ads has no labels on assets — its API offers labels on campaigns, ad groups, ads and keywords only. Label the campaign or ad group that uses the asset instead, or name the asset so it can be found; carry on with the rest of the job.\";\nexport const ACCOUNT_LABEL_MESSAGE =\n \"Google puts a label on an account only from the manager account above it, and Baker works inside the advertiser account — so this cannot be staged. Label the campaigns instead, or tell the user to label the account from their manager account in Google Ads; carry on with the rest of the job.\";\n\n/** Where a label goes. `keyword` and `ad` parents are full resource names — their ids are composite. */\nexport const LABEL_LEVELS = [\"campaign\", \"adGroup\", \"ad\", \"keyword\"] as const;\nexport type LabelLevel = (typeof LABEL_LEVELS)[number];\n\n/** The resource-name shape an ad or keyword label parent must have — its id is composite. */\nconst COMPOSITE_LABEL_PARENT: Partial<Record<LabelLevel, { pattern: RegExp; shape: string }>> = {\n ad: { pattern: /^customers\\/\\d+\\/adGroupAds\\/\\d+~\\d+$/, shape: \"customers/{cid}/adGroupAds/{adGroupId}~{adId}\" },\n keyword: {\n pattern: /^customers\\/\\d+\\/adGroupCriteria\\/\\d+~\\d+$/,\n shape: \"customers/{cid}/adGroupCriteria/{adGroupId}~{criterionId}\",\n },\n};\n\nexport const labelAttachSchema = z\n .strictObject({\n level: z.enum(LABEL_LEVELS, {\n error: retiredChoiceError({ asset: ASSET_LABEL_MESSAGE, customer: ACCOUNT_LABEL_MESSAGE }),\n }),\n parent: refSchema,\n label: refSchema,\n })\n .superRefine((p, ctx) => {\n const composite = COMPOSITE_LABEL_PARENT[p.level];\n if (composite && !composite.pattern.test(p.parent)) {\n ctx.addIssue({\n code: \"custom\",\n path: [\"parent\"],\n message: `a label goes on an existing ${p.level === \"ad\" ? \"ad\" : \"keyword\"} named by its full resource name — ${composite.shape} (read it from the row's resource_name). One created in this chat can be labelled after it is published.`,\n });\n }\n });\nexport type LabelAttach = z.infer<typeof labelAttachSchema>;\n\n// --- Criteria (campaign, ad group) and ad-group device bids ---\n\n/**\n * The checks every criterion op runs on its spec: the cross-field rules, whether Google's resource at\n * this level has a field for it at all, and whether an exclusion carries a bid. Channel-dependent\n * rules (`criterionChannelVerdict`) wait for the stage read, where the campaign's type is known.\n */\nfunction refineCriterion(\n level: \"campaign\" | \"adGroup\",\n options: { negative: boolean; viaAudiences?: boolean },\n): (spec: CriterionSpec, ctx: z.RefinementCtx, path: (string | number)[]) => void {\n return (spec, ctx, path) => {\n for (const issue of criterionSpecIssues(spec)) {\n ctx.addIssue({ code: \"custom\", path: [...path, ...issue.path], message: issue.message });\n }\n const message = criterionLevelIssue(spec, level, options) ?? criterionBidIssue(spec, options.negative);\n if (message) {\n ctx.addIssue({ code: \"custom\", path, message });\n }\n };\n}\n\n/**\n * A criterion on a campaign: a location, language, schedule, device, radius, demographic or\n * placement exclusion, content-type or IP exclusion, carrier, operating system, web-page exclusion or\n * brand list. `bidModifier` rides on the criterion where Google takes one (location, ad schedule,\n * device, radius). Audience segments go through `audienceCriterion.attach` instead.\n */\nexport const campaignCriterionAddSchema = z\n .strictObject({\n campaign: refSchema,\n negative: z.boolean().default(false),\n criterion: criterionSpecSchema,\n })\n .superRefine((val, ctx) => {\n refineCriterion(\"campaign\", { negative: val.negative })(val.criterion, ctx, [\"criterion\"]);\n });\nexport type CampaignCriterionAdd = z.infer<typeof campaignCriterionAddSchema>;\n\n/**\n * The one thing a live campaign criterion lets you change.\n *\n * A device criterion can be added and re-bid, but never removed — Google rejects the removal even\n * of one the same account created itself. So \"stop bidding up on desktop\" is an UPDATE of\n * `bid_modifier` back to 1.0 and \"don't serve on desktop\" is an update to 0, where a removal is\n * rejected outright; this op exists to give the agent that route.\n * Everything else on the resource (which geo, which language, negative or not) is create-only:\n * changing what a criterion targets means removing it and adding the replacement.\n */\nexport const campaignCriterionUpdateSchema = z.strictObject({\n bidModifier: bidModifierSchema,\n});\nexport type CampaignCriterionUpdate = z.infer<typeof campaignCriterionUpdateSchema>;\n\n/**\n * A criterion on an ad group: placements, apps, YouTube, topics, demographics, web pages (Dynamic\n * Search Ads), Demand Gen locations/languages and its combined audience, brand lists. `status`\n * pauses a targeting criterion (an exclusion has none); `cpcBidMicros` is a Display placement's or\n * topic's own max CPC.\n */\nexport const adGroupCriterionAddSchema = z\n .strictObject({\n adGroup: refSchema,\n negative: z.boolean().default(false),\n criterion: criterionSpecSchema,\n status: z.enum([\"ENABLED\", \"PAUSED\"]).optional(),\n cpcBidMicros: microsSchema.optional(),\n })\n .superRefine((val, ctx) => {\n refineCriterion(\"adGroup\", { negative: val.negative })(val.criterion, ctx, [\"criterion\"]);\n if (val.negative && (val.status !== undefined || val.cpcBidMicros !== undefined)) {\n ctx.addIssue({\n code: \"custom\",\n path: [val.status !== undefined ? \"status\" : \"cpcBidMicros\"],\n message: \"an exclusion has no status or bid — Google refuses either on a negative criterion\",\n });\n }\n });\nexport type AdGroupCriterionAdd = z.infer<typeof adGroupCriterionAddSchema>;\n\n/** What a live ad-group criterion lets you change: its bid adjustment, own max CPC, or status. */\nexport const adGroupCriterionUpdateSchema = z\n .strictObject({\n bidModifier: criterionBidModifierSchema.optional(),\n cpcBidMicros: microsSchema.optional(),\n status: z.enum([\"ENABLED\", \"PAUSED\"]).optional(),\n })\n .refine((p) => Object.values(p).some((v) => v !== undefined), \"update needs at least one field\");\nexport type AdGroupCriterionUpdate = z.infer<typeof adGroupCriterionUpdateSchema>;\n\n/**\n * An ad group's own device bid adjustment (`AdGroupBidModifier`) — devices are a campaign criterion,\n * so this is how one ad group bids differently on mobile. 0 stops it serving on that device.\n */\nexport const adGroupBidModifierAddSchema = z.strictObject({\n adGroup: refSchema,\n device: z.enum(DEVICE_TYPES),\n bidModifier: bidModifierSchema,\n});\nexport type AdGroupBidModifierAdd = z.infer<typeof adGroupBidModifierAddSchema>;\n\nexport const adGroupBidModifierUpdateSchema = z.strictObject({ bidModifier: bidModifierSchema });\nexport type AdGroupBidModifierUpdate = z.infer<typeof adGroupBidModifierUpdateSchema>;\n\n/**\n * An exclusion for the WHOLE account (`CustomerNegativeCriterion`): a placement, app, app category,\n * YouTube channel or video, content type, IP address, or an account-level negative keyword list. It\n * applies to every campaign Google lets it reach — including Performance Max, which takes no\n * placement exclusion of its own. Exclusion only; nothing here targets.\n */\nexport const customerNegativeCriterionAddSchema = z\n .strictObject({ criterion: criterionSpecSchema })\n .superRefine((val, ctx) => {\n for (const issue of criterionSpecIssues(val.criterion)) {\n ctx.addIssue({ code: \"custom\", path: [\"criterion\", ...issue.path], message: issue.message });\n }\n const message =\n criterionLevelIssue(val.criterion, \"account\", { negative: true }) ?? criterionBidIssue(val.criterion, true);\n if (message) {\n ctx.addIssue({ code: \"custom\", path: [\"criterion\"], message });\n }\n });\nexport type CustomerNegativeCriterionAdd = z.infer<typeof customerNegativeCriterionAddSchema>;\n\n/**\n * A Performance Max asset group's signal (`AssetGroupSignal`): a search theme, or the one combined\n * audience (`audiences/{id}`) the group is pointed at. A signal steers who Google looks for; it\n * narrows nothing. There is no update — changing one is a remove plus an add.\n */\nexport const assetGroupSignalAddSchema = z\n .strictObject({ assetGroup: refSchema, criterion: criterionSpecSchema })\n .superRefine((val, ctx) => {\n for (const issue of criterionSpecIssues(val.criterion)) {\n ctx.addIssue({ code: \"custom\", path: [\"criterion\", ...issue.path], message: issue.message });\n }\n const message = criterionLevelIssue(val.criterion, \"assetGroup\") ?? criterionBidIssue(val.criterion, false);\n if (message) {\n ctx.addIssue({ code: \"custom\", path: [\"criterion\"], message });\n }\n });\nexport type AssetGroupSignalAdd = z.infer<typeof assetGroupSignalAddSchema>;\n\n// --- The op union ---\n\nexport const GOOGLE_DRAFT_OP_KINDS = [\n \"google.customer.update\",\n \"google.budget.create\",\n \"google.budget.update\",\n \"google.budget.remove\",\n \"google.campaign.create\",\n \"google.campaign.update\",\n \"google.campaign.pause\",\n \"google.campaign.resume\",\n \"google.campaign.remove\",\n \"google.campaign.enableBrandGuidelines\",\n \"google.adGroup.create\",\n \"google.adGroup.update\",\n \"google.adGroup.pause\",\n \"google.adGroup.resume\",\n \"google.adGroup.remove\",\n \"google.keyword.add\",\n \"google.keyword.update\",\n \"google.keyword.remove\",\n \"google.negativeKeyword.add\",\n \"google.negativeKeyword.update\",\n \"google.negativeKeyword.remove\",\n \"google.sharedSet.create\",\n \"google.sharedSet.update\",\n \"google.sharedSet.remove\",\n \"google.sharedSetMember.add\",\n \"google.sharedSetMember.remove\",\n \"google.campaignSharedSet.attach\",\n \"google.campaignSharedSet.detach\",\n \"google.ad.create\",\n \"google.ad.update\",\n \"google.ad.pause\",\n \"google.ad.resume\",\n \"google.ad.remove\",\n \"google.asset.create\",\n \"google.asset.update\",\n \"google.assetLink.attach\",\n \"google.assetLink.detach\",\n \"google.assetGroup.create\",\n \"google.assetGroup.update\",\n \"google.assetGroupAsset.attach\",\n \"google.assetGroupAsset.detach\",\n \"google.assetGroupSignal.add\",\n \"google.assetGroupSignal.remove\",\n \"google.audience.create\",\n \"google.audienceCriterion.attach\",\n \"google.audienceCriterion.detach\",\n \"google.targetingSetting.set\",\n \"google.conversionAction.create\",\n \"google.conversionAction.update\",\n \"google.conversionAction.goal\",\n \"google.conversion.upload\",\n \"google.biddingStrategy.create\",\n \"google.biddingStrategy.update\",\n \"google.biddingStrategy.remove\",\n \"google.label.create\",\n \"google.label.update\",\n \"google.label.remove\",\n \"google.label.attach\",\n \"google.label.detach\",\n \"google.campaignCriterion.add\",\n \"google.campaignCriterion.update\",\n \"google.campaignCriterion.remove\",\n \"google.adGroupCriterion.add\",\n \"google.adGroupCriterion.update\",\n \"google.adGroupCriterion.remove\",\n \"google.adGroupBidModifier.add\",\n \"google.adGroupBidModifier.update\",\n \"google.adGroupBidModifier.remove\",\n \"google.customerNegativeCriterion.add\",\n \"google.customerNegativeCriterion.remove\",\n] as const;\nexport const googleDraftOpKindSchema = z.enum(GOOGLE_DRAFT_OP_KINDS);\nexport type GoogleDraftOpKind = z.infer<typeof googleDraftOpKindSchema>;\n\nfunction createOp<K extends GoogleDraftOpKind, P extends z.ZodTypeAny>(kind: K, payload: P) {\n return z.object({ kind: z.literal(kind), customerId: customerIdSchema, payload });\n}\nfunction updateOp<K extends GoogleDraftOpKind, P extends z.ZodTypeAny>(kind: K, payload: P) {\n return z.object({ kind: z.literal(kind), customerId: customerIdSchema, target: targetRefSchema, payload });\n}\n/** `confirmBudgetIncrease` is accepted and ignored: only the person's answer approves a large raise (`convex/ads/budgetJump.ts`). */\nfunction budgetUpdateOp<K extends GoogleDraftOpKind, P extends z.ZodTypeAny>(kind: K, payload: P) {\n return updateOp(kind, payload).extend({ confirmBudgetIncrease: z.boolean().optional() });\n}\n/** Pause/resume/remove/detach ops carry only a target — no payload. */\nfunction targetOp<K extends GoogleDraftOpKind>(kind: K) {\n return z.object({ kind: z.literal(kind), customerId: customerIdSchema, target: targetRefSchema });\n}\n\nexport const googleDraftOpInputSchema = z.discriminatedUnion(\"kind\", [\n z\n .object({\n kind: z.literal(\"google.customer.update\"),\n customerId: customerIdSchema,\n target: z.string(),\n payload: customerUpdateSchema,\n })\n .refine((op) => op.target.replace(/^customers\\//, \"\") === op.customerId, {\n path: [\"target\"],\n message: CUSTOMER_TARGET_MESSAGE,\n }),\n createOp(\"google.budget.create\", budgetCreateSchema),\n budgetUpdateOp(\"google.budget.update\", budgetUpdateSchema),\n targetOp(\"google.budget.remove\"),\n createOp(\"google.campaign.create\", campaignCreateSchema),\n updateOp(\"google.campaign.update\", campaignUpdateSchema),\n targetOp(\"google.campaign.pause\"),\n targetOp(\"google.campaign.resume\"),\n targetOp(\"google.campaign.remove\"),\n updateOp(\"google.campaign.enableBrandGuidelines\", campaignEnableBrandGuidelinesSchema),\n createOp(\"google.adGroup.create\", adGroupCreateSchema),\n updateOp(\"google.adGroup.update\", adGroupUpdateSchema),\n targetOp(\"google.adGroup.pause\"),\n targetOp(\"google.adGroup.resume\"),\n targetOp(\"google.adGroup.remove\"),\n createOp(\"google.keyword.add\", keywordAddSchema),\n updateOp(\"google.keyword.update\", keywordUpdateSchema),\n targetOp(\"google.keyword.remove\"),\n createOp(\"google.negativeKeyword.add\", negativeKeywordAddSchema),\n updateOp(\"google.negativeKeyword.update\", negativeKeywordUpdateSchema),\n targetOp(\"google.negativeKeyword.remove\"),\n createOp(\"google.sharedSet.create\", sharedSetCreateSchema),\n updateOp(\"google.sharedSet.update\", sharedSetUpdateSchema),\n targetOp(\"google.sharedSet.remove\"),\n createOp(\"google.sharedSetMember.add\", sharedSetMemberAddSchema),\n targetOp(\"google.sharedSetMember.remove\"),\n createOp(\"google.campaignSharedSet.attach\", campaignSharedSetAttachSchema),\n targetOp(\"google.campaignSharedSet.detach\"),\n createOp(\"google.ad.create\", adCreateSchema),\n updateOp(\"google.ad.update\", adUpdateSchema),\n targetOp(\"google.ad.pause\"),\n targetOp(\"google.ad.resume\"),\n targetOp(\"google.ad.remove\"),\n createOp(\"google.asset.create\", assetCreateSchema),\n updateOp(\"google.asset.update\", assetUpdateSchema),\n createOp(\"google.assetLink.attach\", assetLinkAttachSchema),\n targetOp(\"google.assetLink.detach\"),\n createOp(\"google.assetGroup.create\", assetGroupCreateSchema),\n updateOp(\"google.assetGroup.update\", assetGroupUpdateSchema),\n createOp(\"google.assetGroupAsset.attach\", assetGroupAssetAttachSchema),\n targetOp(\"google.assetGroupAsset.detach\"),\n createOp(\"google.assetGroupSignal.add\", assetGroupSignalAddSchema),\n targetOp(\"google.assetGroupSignal.remove\"),\n createOp(\"google.audience.create\", audienceCreateSchema),\n createOp(\"google.audienceCriterion.attach\", audienceCriterionAttachSchema),\n targetOp(\"google.audienceCriterion.detach\"),\n createOp(\"google.targetingSetting.set\", targetingSettingSetSchema),\n createOp(\"google.conversionAction.create\", conversionActionCreateSchema),\n updateOp(\"google.conversionAction.update\", conversionActionUpdateSchema),\n createOp(\"google.conversionAction.goal\", conversionGoalSetSchema),\n createOp(\"google.conversion.upload\", conversionUploadSchema),\n createOp(\"google.biddingStrategy.create\", biddingStrategyCreateSchema),\n updateOp(\"google.biddingStrategy.update\", biddingStrategyUpdateSchema),\n targetOp(\"google.biddingStrategy.remove\"),\n createOp(\"google.label.create\", labelCreateSchema),\n updateOp(\"google.label.update\", labelUpdateSchema),\n targetOp(\"google.label.remove\"),\n createOp(\"google.label.attach\", labelAttachSchema),\n targetOp(\"google.label.detach\"),\n createOp(\"google.campaignCriterion.add\", campaignCriterionAddSchema),\n updateOp(\"google.campaignCriterion.update\", campaignCriterionUpdateSchema),\n targetOp(\"google.campaignCriterion.remove\"),\n createOp(\"google.adGroupCriterion.add\", adGroupCriterionAddSchema),\n updateOp(\"google.adGroupCriterion.update\", adGroupCriterionUpdateSchema),\n targetOp(\"google.adGroupCriterion.remove\"),\n createOp(\"google.adGroupBidModifier.add\", adGroupBidModifierAddSchema),\n updateOp(\"google.adGroupBidModifier.update\", adGroupBidModifierUpdateSchema),\n targetOp(\"google.adGroupBidModifier.remove\"),\n createOp(\"google.customerNegativeCriterion.add\", customerNegativeCriterionAddSchema),\n targetOp(\"google.customerNegativeCriterion.remove\"),\n]);\nexport type GoogleDraftOpInput = z.infer<typeof googleDraftOpInputSchema>;\n\nexport type GoogleDraftEntity =\n | \"customer\"\n | \"budget\"\n | \"campaign\"\n | \"adGroup\"\n | \"keyword\"\n | \"negativeKeyword\"\n | \"sharedSet\"\n | \"sharedSetMember\"\n | \"campaignSharedSet\"\n | \"ad\"\n | \"asset\"\n | \"assetLink\"\n | \"assetGroup\"\n | \"assetGroupAsset\"\n | \"assetGroupSignal\"\n | \"audience\"\n | \"audienceCriterion\"\n | \"targetingSetting\"\n | \"conversionAction\"\n | \"conversion\"\n | \"biddingStrategy\"\n | \"label\"\n | \"campaignCriterion\"\n | \"adGroupCriterion\"\n | \"adGroupBidModifier\"\n | \"customerNegativeCriterion\";\n\nexport function entityOfKind(kind: GoogleDraftOpKind): GoogleDraftEntity {\n return kind.split(\".\")[1] as GoogleDraftEntity;\n}\n\nexport function verbOfKind(kind: GoogleDraftOpKind): string {\n return kind.split(\".\")[2] ?? \"\";\n}\n\nexport function isCreateKind(kind: GoogleDraftOpKind): boolean {\n const verb = verbOfKind(kind);\n return verb === \"create\" || verb === \"add\" || verb === \"attach\";\n}\n\nexport function isTargetOnlyKind(kind: GoogleDraftOpKind): boolean {\n const verb = verbOfKind(kind);\n return verb === \"pause\" || verb === \"resume\" || verb === \"remove\" || verb === \"detach\";\n}\n\n/**\n * The status a `pause`/`resume` will set, or undefined for every other verb. These kinds\n * carry no payload, so their intent lives only in the kind — both the before/after diff\n * and stage-time no-op detection have to read it from here to know what the op will do.\n */\nexport function impliedStatusOfKind(kind: GoogleDraftOpKind): \"ENABLED\" | \"PAUSED\" | undefined {\n const verb = verbOfKind(kind);\n if (verb === \"pause\") {\n return \"PAUSED\";\n }\n return verb === \"resume\" ? \"ENABLED\" : undefined;\n}\n\n// --- Temp-ref dependency collection ---\n\ntype TempRefDep = { ref: string; entity: GoogleDraftEntity };\n\nfunction isTempRef(value: unknown): value is string {\n return typeof value === \"string\" && TEMP_REF_REGEX.test(value);\n}\n\n/** The image/logo/video asset refs an ad's own content references, keyed by the format. Empty for formats with none. */\nfunction contentAssetRefs(content: AdContent): string[] {\n switch (content.format) {\n case \"responsiveDisplay\":\n return [\n ...(content.marketingImageAssets ?? []),\n ...(content.squareMarketingImageAssets ?? []),\n ...(content.logoImageAssets ?? []),\n ];\n case \"video\":\n return [...content.videoAssets, ...(content.logoImageAssets ?? [])];\n case \"demandGen\":\n return [...(content.imageAssets ?? []), ...(content.squareImageAssets ?? []), ...(content.logoImageAssets ?? [])];\n case \"demandGenVideo\":\n return [\n ...(content.videoAssets ?? []),\n ...(content.logoImageAssets ?? []),\n ...(content.callToActionAssets ?? []),\n ];\n case \"app\":\n return [...(content.images ?? []), ...(content.youtubeVideos ?? [])];\n default:\n return [];\n }\n}\n\n/**\n * The image refs an ad op puts on an App ad's `AppAdInfo.images`, or `[]` for any other op or\n * format. Google validates each one's shape and rejects the WHOLE ad mutate if any is wrong, so\n * the stage-time shape check needs exactly this list — no other format's images are affected.\n */\nexport function appAdImageRefs(op: GoogleDraftOpInput): string[] {\n if (op.kind === \"google.ad.create\") {\n return op.payload.content.format === \"app\" ? [...(op.payload.content.images ?? [])] : [];\n }\n if (op.kind !== \"google.ad.update\" || op.payload.content === undefined) {\n return [];\n }\n const parsed = adContentSchema.safeParse(op.payload.content);\n return parsed.success && parsed.data.format === \"app\" ? [...(parsed.data.images ?? [])] : [];\n}\n\n/**\n * Asset refs inside an ad.update's LOOSE content bag. `adUpdateSchema.content` is a `Record` so a\n * partial patch can merge into a staged op, which means the typed `contentAssetRefs` can't read it —\n * scan its array fields for refs instead. Undercounting here would stage an ad update that consumes\n * a `g_temp_*` asset with an empty `dependsOn`: the reference passes unchecked, discarding the asset\n * create leaves the ad pointing at nothing, and publish order is left to luck.\n */\nfunction looseContentAssetRefs(content: unknown): string[] {\n if (content === null || typeof content !== \"object\" || Array.isArray(content)) {\n return [];\n }\n return Object.values(content as Record<string, unknown>)\n .filter((value): value is unknown[] => Array.isArray(value))\n .flat()\n .filter((value): value is string => typeof value === \"string\");\n}\n\n/** The image/square-image/portrait-image/logo asset refs an asset group's own payload references. */\nfunction assetGroupImageRefs(payload: AssetGroupCreate): string[] {\n return [\n ...(payload.imageAssets ?? []),\n ...(payload.squareImageAssets ?? []),\n ...(payload.portraitImageAssets ?? []),\n ...(payload.logoAssets ?? []),\n ];\n}\n\n/** The entity a `level` names — campaign or ad group — for the ops that hang off either. */\nfunction levelEntity(level: string): GoogleDraftEntity {\n return level === \"adGroup\" ? \"adGroup\" : \"campaign\";\n}\n\n/** Temp refs an op consumes, keyed by the entity kind each ref must resolve to. */\nexport function collectTempRefDeps(op: GoogleDraftOpInput): TempRefDep[] {\n const deps: TempRefDep[] = [];\n const add = (value: unknown, entity: GoogleDraftEntity) => {\n if (isTempRef(value)) {\n deps.push({ ref: value, entity });\n }\n };\n switch (op.kind) {\n case \"google.campaign.create\":\n add(op.payload.budget, \"budget\");\n add(op.payload.biddingStrategy, \"biddingStrategy\");\n break;\n case \"google.campaign.update\":\n add(op.payload.budget, \"budget\");\n add(op.payload.biddingStrategy, \"biddingStrategy\");\n break;\n case \"google.adGroup.create\":\n add(op.payload.campaign, \"campaign\");\n break;\n case \"google.keyword.add\":\n add(op.payload.adGroup, \"adGroup\");\n break;\n case \"google.negativeKeyword.add\":\n add(op.payload.parent, levelEntity(op.payload.level));\n break;\n case \"google.sharedSetMember.add\":\n add(op.payload.sharedSet, \"sharedSet\");\n break;\n case \"google.targetingSetting.set\":\n add(op.payload.parent, levelEntity(op.payload.level));\n break;\n case \"google.campaignSharedSet.attach\":\n add(op.payload.campaign, \"campaign\");\n add(op.payload.sharedSet, \"sharedSet\");\n break;\n case \"google.ad.create\":\n add(op.payload.adGroup, \"adGroup\");\n // A responsive display / video / demand gen ad references its assets by ref on its own\n // content — a staged `asset.create` must land before the ad, so its temp refs are real deps.\n for (const ref of contentAssetRefs(op.payload.content)) {\n add(ref, \"asset\");\n }\n break;\n case \"google.ad.update\":\n // A content update replaces the ad's assets too, so the same asset creates are real deps.\n for (const ref of looseContentAssetRefs(op.payload.content)) {\n add(ref, \"asset\");\n }\n break;\n case \"google.assetLink.attach\":\n add(op.payload.parent, op.payload.level === \"adGroup\" ? \"adGroup\" : \"campaign\");\n add(op.payload.asset, \"asset\");\n break;\n case \"google.assetGroup.create\":\n add(op.payload.campaign, \"campaign\");\n for (const ref of assetGroupImageRefs(op.payload)) {\n add(ref, \"asset\");\n }\n break;\n case \"google.assetGroupAsset.attach\":\n add(op.payload.assetGroup, \"assetGroup\");\n add(op.payload.asset, \"asset\");\n break;\n case \"google.audienceCriterion.attach\":\n add(op.payload.parent, op.payload.level === \"adGroup\" ? \"adGroup\" : \"campaign\");\n add(op.payload.userList, \"audience\");\n break;\n case \"google.label.attach\":\n add(op.payload.parent, op.payload.level);\n add(op.payload.label, \"label\");\n break;\n case \"google.campaignCriterion.add\":\n case \"google.adGroupCriterion.add\":\n case \"google.adGroupBidModifier.add\":\n case \"google.customerNegativeCriterion.add\":\n case \"google.assetGroupSignal.add\":\n deps.push(...criterionOpDeps(op));\n break;\n default:\n break;\n }\n return deps;\n}\n\n/** A criterion op's parent (when it has one) and whatever its criterion names. */\nfunction criterionOpDeps(op: GoogleDraftOpInput): TempRefDep[] {\n const parent: TempRefDep[] = [];\n const own = (ref: string, entity: GoogleDraftEntity) => {\n if (isTempRef(ref)) {\n parent.push({ ref, entity });\n }\n };\n switch (op.kind) {\n case \"google.campaignCriterion.add\":\n own(op.payload.campaign, \"campaign\");\n return [...parent, ...criterionTempRefs(op.payload.criterion)];\n case \"google.adGroupCriterion.add\":\n own(op.payload.adGroup, \"adGroup\");\n return [...parent, ...criterionTempRefs(op.payload.criterion)];\n case \"google.adGroupBidModifier.add\":\n own(op.payload.adGroup, \"adGroup\");\n return parent;\n case \"google.customerNegativeCriterion.add\":\n return criterionTempRefs(op.payload.criterion);\n case \"google.assetGroupSignal.add\":\n own(op.payload.assetGroup, \"assetGroup\");\n return [...parent, ...criterionTempRefs(op.payload.criterion)];\n default:\n return [];\n }\n}\n\n// --- Whole-content replacement gate (blocking) ---\n\n/**\n * Why an `ad.update` content payload can't be persisted as-is, or undefined when it's fine.\n *\n * `adUpdateSchema.content` is a loose bag ON PURPOSE: a partial patch has to be able to merge into a\n * staged create or a staged update. But whatever is finally STORED as a `google.ad.update` is sent to\n * Google as a whole-content replacement, so at that point it must be a complete `AdContent` — the\n * `format` discriminator included. Every persist point runs this, so a half-content update is\n * rejected the moment it's staged instead of surfacing as an unpublishable draft much later.\n */\nexport function incompleteAdContentReason(op: GoogleDraftOpInput): string | undefined {\n if (op.kind !== \"google.ad.update\" || op.payload.content === undefined) {\n return undefined;\n }\n const parsed = adContentSchema.safeParse(op.payload.content);\n if (parsed.success) {\n return undefined;\n }\n const unknownFields = unrecognizedContentKeys(parsed.error.issues);\n if (unknownFields.length > 0) {\n const format = readFormat(op.payload.content);\n const accepted = format ? AD_CONTENT_ASSET_FIELDS[format] : undefined;\n // A format with no creative fields at all (responsiveSearch) has an EMPTY list, which is\n // truthy — falling through to the field-naming branch built \"carries its creative on .\" Send\n // those to the schema instead, which is where the answer actually is.\n const where =\n accepted && accepted.length > 0\n ? `a ${format} ad carries its creative on ${accepted.map((f) => `\\`${f}\\``).join(\" / \")}`\n : \"check the format's fields with `baker schema ads.google.ads.update`\";\n return `${unknownFields.map((f) => `\\`${f}\\``).join(\", \")} ${unknownFields.length === 1 ? \"is not a field\" : \"are not fields\"} of this ad's content — ${where}. Unknown fields are dropped, so publishing would have shipped the copy without the assets.`;\n }\n const detail = parsed.error.issues\n .slice(0, 4)\n .map((issue) => (issue.path.length > 0 ? `content.${issue.path.join(\".\")}: ${issue.message}` : issue.message))\n .join(\"; \");\n return `an ad content update replaces the ad's whole content — send every field of the format (starting with \\`format\\`), not only the ones you are changing: ${detail}`;\n}\n\n/** Each content format in the words a user reads — one map, so a card and a summary cannot disagree. */\nexport const AD_FORMAT_LABELS: Readonly<Record<AdFormat, string>> = {\n responsiveSearch: \"Responsive search ad\",\n responsiveDisplay: \"Responsive display ad\",\n app: \"App ad\",\n video: \"Video ad\",\n demandGen: \"Demand Gen ad\",\n demandGenVideo: \"Demand Gen video ad\",\n shoppingProduct: \"Shopping product ad\",\n};\n\n/**\n * Google's live `ad_group_ad.ad.type` → the content format that writes it. An ad's format is chosen\n * by whoever stages the update, and nothing else compares it to the ad on the account: naming the\n * wrong one builds a mutate against a DIFFERENT ad message, which Google refuses at publish, long\n * after the Session moved on. Every writable type is here, so a type that is absent is either one\n * Baker cannot write ({@link UNWRITABLE_AD_TYPES}) or one it has never seen.\n */\nexport const AD_FORMAT_BY_AD_TYPE: Readonly<Record<string, AdFormat>> = {\n RESPONSIVE_SEARCH_AD: \"responsiveSearch\",\n RESPONSIVE_DISPLAY_AD: \"responsiveDisplay\",\n APP_AD: \"app\",\n VIDEO_RESPONSIVE_AD: \"video\",\n DEMAND_GEN_MULTI_ASSET_AD: \"demandGen\",\n DEMAND_GEN_VIDEO_RESPONSIVE_AD: \"demandGenVideo\",\n SHOPPING_PRODUCT_AD: \"shoppingProduct\",\n};\n\n/**\n * Live ad types Baker has no content format for, in the words a refusal uses. Named rather than left\n * to fall through, because \"Baker cannot edit this ad\" is an answer the agent can act on — reporting\n * the copy as a finding, or replacing the ad — and a publish failure is not.\n */\nexport const UNWRITABLE_AD_TYPES: Readonly<Record<string, string>> = {\n CALL_AD: \"call ad\",\n DEMAND_GEN_CAROUSEL_AD: \"Demand Gen carousel ad\",\n DEMAND_GEN_PRODUCT_AD: \"Demand Gen product ad\",\n EXPANDED_TEXT_AD: \"expanded text ad\",\n IMAGE_AD: \"image ad\",\n VIDEO_AD: \"video ad (the legacy format)\",\n LEGACY_RESPONSIVE_DISPLAY_AD: \"legacy responsive display ad\",\n SMART_CAMPAIGN_AD: \"Smart campaign ad\",\n};\n\n/**\n * Why a staged ad-content format cannot be the content of the ad it targets, or undefined when it\n * can (or when the live type was never read — a missing read is never an accusation).\n */\nexport function adContentFormatRefusal(liveAdType: string | undefined, format: AdFormat): string | undefined {\n if (!liveAdType) {\n return undefined;\n }\n const unwritable = UNWRITABLE_AD_TYPES[liveAdType];\n if (unwritable) {\n return (\n `This ad is a ${unwritable} (${liveAdType}), and Baker has no content format that writes one — ` +\n \"publishing this would be refused by Google. Change this ad in the Google Ads interface, or replace it \" +\n \"with an ad in a format Baker writes, and report the copy as a finding either way.\"\n );\n }\n const expected = AD_FORMAT_BY_AD_TYPE[liveAdType];\n if (!expected || expected === format) {\n return undefined;\n }\n return (\n `This ad is a ${liveAdType}, whose content is \\`format: \"${expected}\"\\` — this update carries ` +\n `\\`format: \"${format}\"\\`, which builds a different ad message and would be refused at publish. ` +\n `Re-stage it with --format ${expected} and that format's own fields (\\`baker schema ads.google.ads.update\\`).`\n );\n}\n\n/** The creative fields each ad format accepts, so an unknown-field error can name the right one. */\nconst AD_CONTENT_ASSET_FIELDS: Record<AdFormat, string[]> = {\n responsiveSearch: [],\n responsiveDisplay: [\"marketingImageAssets\", \"squareMarketingImageAssets\", \"logoImageAssets\"],\n app: [\"images\", \"youtubeVideos\"],\n video: [\"videoAssets\", \"logoImageAssets\"],\n demandGen: [\"imageAssets\", \"squareImageAssets\", \"logoImageAssets\"],\n demandGenVideo: [\"videoAssets\", \"logoImageAssets\", \"callToActionAssets\"],\n shoppingProduct: [],\n};\n\nfunction readFormat(content: unknown): AdFormat | undefined {\n if (content === null || typeof content !== \"object\") {\n return undefined;\n }\n const format = (content as Record<string, unknown>).format;\n return typeof format === \"string\" && format in AD_CONTENT_ASSET_FIELDS ? (format as AdFormat) : undefined;\n}\n\n/** Field names the strict content schemas rejected, deduped in payload order. */\nfunction unrecognizedContentKeys(issues: readonly z.core.$ZodIssue[]): string[] {\n const keys = new Set<string>();\n for (const issue of issues) {\n if (issue.code === \"unrecognized_keys\") {\n for (const key of issue.keys) {\n keys.add(key);\n }\n }\n }\n return [...keys];\n}\n\n// --- Stage-time warnings (non-blocking) ---\n\n/**\n * `{_source}` in a tracking template resolves from the custom parameters defined on the campaign,\n * ad group or ad. Baker can only see what this op stages, so an undefined tag is a warning, not a\n * rejection — it may legitimately be defined further down. Left unwarned it publishes an empty\n * value into every tracked click.\n */\nfunction urlCustomParameterWarnings(\n template: string | undefined,\n params: ReadonlyArray<{ key: string }> | undefined,\n): string[] {\n if (!template) {\n return [];\n }\n const defined = new Set((params ?? []).map((p) => p.key));\n const referenced = [...template.matchAll(/\\{_([A-Za-z0-9_]+)\\}/g)].map((m) => m[1] ?? \"\");\n const missing = [...new Set(referenced.filter((key) => !defined.has(key)))];\n return missing.length === 0\n ? []\n : [\n `tracking template references {_${missing.join(\"}, {_\")}} but this campaign defines no such custom parameter — define it here (--custom-param ${missing[0]}=…) or make sure the ad group or ad does, or it resolves empty`,\n ];\n}\n\nfunction campaignUpdateWarnings(p: CampaignUpdate): string[] {\n return [\n ...urlCustomParameterWarnings(p.trackingUrlTemplate, p.urlCustomParameters),\n ...biddingTargetWarnings(p.bidding),\n ];\n}\n\nfunction campaignCreateWarnings(p: CampaignCreate): string[] {\n const warnings: string[] = urlCustomParameterWarnings(p.trackingUrlTemplate, p.urlCustomParameters);\n if (p.bidding && (p.bidding.type === \"MAXIMIZE_CONVERSIONS\" || p.bidding.type === \"MAXIMIZE_CONVERSION_VALUE\")) {\n warnings.push(\"automated bidding needs conversion tracking live before it can optimize\");\n }\n if (p.channelType === \"PERFORMANCE_MAX\") {\n warnings.push(\"Performance Max needs an asset group (stage one with `asset-groups create`) before it can serve\");\n }\n if (p.brandGuidelines?.enabled) {\n warnings.push(BRAND_GUIDELINES_LINKS_WARNING);\n }\n warnings.push(...biddingTargetWarnings(p.bidding));\n return warnings;\n}\n\nexport const BRAND_GUIDELINES_LINKS_WARNING =\n 'Brand guidelines are on: link the business name and a square logo to THIS campaign in the same draft — `assets attach --file \\'{\"level\":\"campaign\",\"parent\":\"<campaign ref>\",\"asset\":\"<asset id>\",\"fieldType\":\"BUSINESS_NAME\"}\\'` and the same with `\"fieldType\":\"LOGO\"` — or Google refuses the campaign (Baker holds the publish until both are staged).';\n\nfunction budgetCreateWarnings(p: BudgetCreate): string[] {\n if (p.amountMicros !== undefined && p.amountMicros < PLAYBOOK_DAILY_BUDGET_FLOOR_MICROS) {\n return [`budget ${p.amountMicros / 1_000_000} is very low — campaigns rarely exit learning below ~10/day`];\n }\n return [];\n}\n\n/**\n * Bidding strategies whose delivery is driven by a target the advertiser sets.\n *\n * Since 17 August 2026 a campaign limited by its budget delivers toward that TARGET rather than\n * toward the cost per conversion it has recently been achieving (Google Ads Help 17061251: a $10\n * Target CPA on a campaign running at $5 moves toward $10). A generous target used to be capped in\n * practice by the budget and is not any more.\n *\n * Deliberately excludes MANUAL_CPC, TARGET_IMPRESSION_SHARE, TARGET_CPM and TARGET_SPEND: Google's\n * note scopes the change to target CPA / target ROAS / target CPC, so warning on the others would\n * be noise on a change the release never touched.\n */\nconst TARGET_DRIVEN_BIDDING_TYPES: ReadonlySet<GoogleBiddingStrategyType> = new Set<GoogleBiddingStrategyType>([\n \"TARGET_CPA\",\n \"TARGET_ROAS\",\n \"TARGET_CPC\",\n \"MAXIMIZE_CONVERSIONS\",\n \"MAXIMIZE_CONVERSION_VALUE\",\n]);\n\n/**\n * Exported so the stage layer can drop it when it has the campaign's live target and can say the\n * same thing with both numbers in it — the dashboard renders only the first warning on an op, so\n * two near-identical sentences means the vague one hides the exact one.\n */\nexport const LOOSE_TARGET_WARNING =\n \"a campaign limited by its budget now delivers close to this target instead of to the cost per conversion it has been achieving, so a target set above what this campaign actually does today raises that cost rather than leaving it alone. Set the target from the campaign's own recent performance, and check whether it is limited by budget first: `baker ads google query --preset budget-limited`.\";\n\nfunction biddingTargetWarnings(bidding: BiddingConfig | undefined): string[] {\n if (!bidding || !TARGET_DRIVEN_BIDDING_TYPES.has(bidding.type)) {\n return [];\n }\n if (\n bidding.targetCpaMicros === undefined &&\n bidding.targetRoas === undefined &&\n bidding.targetCpcMicros === undefined\n ) {\n return [];\n }\n return [LOOSE_TARGET_WARNING];\n}\n\n/**\n * A budget update carries no bidding config and no live budget, so the only thing decidable from\n * the payload alone is the same floor `budget.create` warns about. The August 2026 interaction —\n * raising a budget on a campaign whose target sits above its actual performance — needs the live\n * amount to know a raise from a cut, so it lives in `writes/biddingTarget.ts` where the owning\n * campaign's snapshot is already read. Warning here unconditionally would have fired on every\n * decrease too, and called it a raise.\n */\nfunction budgetUpdateWarnings(p: BudgetUpdate): string[] {\n if (p.amountMicros !== undefined && p.amountMicros < PLAYBOOK_DAILY_BUDGET_FLOOR_MICROS) {\n return [`budget ${p.amountMicros / 1_000_000} is very low — campaigns rarely exit learning below ~10/day`];\n }\n return [];\n}\n\nfunction responsiveSearchAdWarnings(content: AdContent): string[] {\n if (content.format !== \"responsiveSearch\") {\n return [];\n }\n const warnings: string[] = [];\n if (content.headlines.length < 8) {\n warnings.push(`only ${content.headlines.length} headlines — Google recommends 8-15 for best Ad Strength`);\n }\n const pins = content.headlines.filter((h) => h.pinnedField).length;\n if (pins > content.headlines.length / 2) {\n warnings.push(\"pinning most headlines limits Google's optimization — pin sparingly\");\n }\n return warnings;\n}\n\n/**\n * The two conversion-action fields Baker fills in that the person approving the change would want a\n * say in. Both fire on the payload being SILENT, never on the value — an agent that chose\n * `ONE_PER_CLICK` on purpose made the decision this warning exists to surface.\n *\n * Only two of the five filled-in fields warn. `type` is plumbing (a website conversion is a website\n * conversion — the other types come with a whole different setup the agent has to ask for anyway),\n * `status` has nothing to decide (an action is created in order to measure), and `primaryForGoal`\n * already says itself on every card: the summary line always ends \"· secondary\" and the card carries\n * an \"Action optimization\" row. Warning on all five would put four notices on every conversion card\n * and teach the reader to skip them.\n */\nfunction conversionActionCreateWarnings(p: ConversionActionCreate): string[] {\n const warnings: string[] = [];\n if (p.category === undefined) {\n warnings.push(\n 'no conversion category was chosen, so this is filed as \"Default\" — the category decides which account-level goal the conversion belongs to, and so whether automated bidding ever optimizes toward it. Set the one that matches what the customer did (purchase, lead, sign-up, phone call, booking…) if \"Default\" is not where it belongs.',\n );\n }\n if (p.countingType === undefined) {\n warnings.push(\n \"nothing said how often this should count, so one conversion is counted per click — right for a lead or a sign-up, wrong for sales, where a customer who buys twice from the same click should count twice. Ask for every conversion to be counted if repeat purchases should each count.\",\n );\n }\n return warnings;\n}\n\nexport const AUTO_TAGGING_OFF_WARNING =\n \"Turning auto-tagging off stops Google adding the click id (gclid) to every landing page: Google Ads conversion tracking, uploaded offline conversions and the Google Analytics link all lose the click they match on. Stage it only if the user asked for it, and say what it costs.\";\n\nexport function collectOpWarnings(op: GoogleDraftOpInput): string[] {\n switch (op.kind) {\n case \"google.customer.update\":\n return op.payload.autoTaggingEnabled === false ? [AUTO_TAGGING_OFF_WARNING] : [];\n case \"google.budget.create\":\n return budgetCreateWarnings(op.payload);\n case \"google.budget.update\":\n return budgetUpdateWarnings(op.payload);\n case \"google.campaign.create\":\n return campaignCreateWarnings(op.payload);\n case \"google.campaign.update\":\n return campaignUpdateWarnings(op.payload);\n case \"google.biddingStrategy.create\":\n return biddingTargetWarnings(op.payload.config);\n case \"google.biddingStrategy.update\":\n return biddingTargetWarnings(op.payload.config);\n case \"google.ad.create\":\n return responsiveSearchAdWarnings(op.payload.content);\n case \"google.conversionAction.create\":\n return conversionActionCreateWarnings(op.payload);\n default:\n return [];\n }\n}\n","/**\n * Wire contract for `/api/ads/google/draft*` — staging, listing, and removing\n * draft Google Ads write ops. Ops stage per chat and apply only when the chat\n * publishes as a single atomic `GoogleAdsService.Mutate` batch;\n * `mode: \"simulated\"` means publish completes the full lifecycle without\n * calling Google (feature flag off).\n */\nimport { z } from \"zod\";\nimport { googleDraftOpInputSchema, googleDraftOpKindSchema } from \"./ops\";\n\nexport const googleWriteModeSchema = z.enum([\"live\", \"simulated\"]);\nexport type GoogleWriteMode = z.infer<typeof googleWriteModeSchema>;\n\n/**\n * Read-back check run AFTER the publish finalized: the entity is re-read from\n * the platform and compared against what the op declared. It never contradicts\n * `status` — a change that applied stays applied. `unconfirmed` means Baker\n * could not see the change, which on an eventually consistent platform is not\n * the same as it not having happened.\n */\nexport const publishVerificationSchema = z.object({\n status: z.enum([\"confirmed\", \"unconfirmed\", \"drifted\"]),\n note: z.string().optional(),\n checkedAt: z.number(),\n});\nexport type PublishVerification = z.infer<typeof publishVerificationSchema>;\n\nexport const googleDraftOpResultSchema = z.object({\n status: z.enum([\"applied\", \"simulated\", \"failed\", \"skipped\"]),\n resourceName: z.string().optional(),\n error: z.string().optional(),\n skippedBecause: z.string().optional(),\n executedAt: z.number().optional(),\n verification: publishVerificationSchema.optional(),\n /** A customer list's people upload: Google Data Manager's request id(s), comma-joined. */\n requestId: z.string().optional(),\n});\nexport type GoogleDraftOpResult = z.infer<typeof googleDraftOpResultSchema>;\n\n// --- POST /api/ads/google/draft/stage ---\n\nexport const googleDraftStageRequestSchema = z.object({\n chatId: z.string(),\n op: googleDraftOpInputSchema,\n});\nexport type GoogleDraftStageRequest = z.infer<typeof googleDraftStageRequestSchema>;\n\n/**\n * `staged: false` is a NO-OP, not a failure: every field the op asks for already\n * holds that value on the live account, so nothing was appended to the draft and\n * publish has nothing to send. `reason` says which state it already had.\n */\nexport const googleDraftStageResponseSchema = z.discriminatedUnion(\"staged\", [\n z.object({\n staged: z.literal(true),\n ref: z.string(),\n kind: googleDraftOpKindSchema,\n mode: googleWriteModeSchema,\n dependsOn: z.array(z.string()),\n summary: z.string(),\n warnings: z.array(z.string()),\n /** True when the op amended an already-staged op in place instead of appending a new one. */\n amended: z.boolean().optional(),\n }),\n z.object({\n staged: z.literal(false),\n noop: z.literal(true),\n kind: googleDraftOpKindSchema,\n mode: googleWriteModeSchema,\n summary: z.string(),\n reason: z.string(),\n }),\n]);\nexport type GoogleDraftStageResponse = z.infer<typeof googleDraftStageResponseSchema>;\n\n// --- POST /api/ads/google/draft/amend ---\n\n/**\n * Generic in-place amend: `patch` RFC-7386-merges into the staged op's payload (plain objects\n * deep-merge, `null` deletes the key, arrays/scalars replace), the merged payload re-validates\n * against the op's own kind, and `dependsOn` recomputes fresh from the merge (a re-parent drops\n * the old parent dep instead of unioning). `ref` matches the staged op's ref or, for staged\n * updates, its target — same lookup `findAmendTarget` uses.\n */\nexport const googleDraftAmendRequestSchema = z.object({\n chatId: z.string(),\n ref: z.string(),\n patch: z.record(z.string(), z.unknown()),\n});\nexport type GoogleDraftAmendRequest = z.infer<typeof googleDraftAmendRequestSchema>;\n\n// --- POST /api/ads/google/draft/show ---\n\nexport const googleDraftShowRequestSchema = z.object({\n chatId: z.string(),\n ref: z.string(),\n});\nexport type GoogleDraftShowRequest = z.infer<typeof googleDraftShowRequestSchema>;\n\n// --- POST /api/ads/google/draft/stage-batch ---\n\n/** Batch ceiling — negative lists routinely carry hundreds of keywords; one request stages them all. */\nexport const GOOGLE_DRAFT_BATCH_MAX = 500;\n\n/**\n * The largest one staged change may be. A draft holds any number of changes (each is its own\n * record), but one record holds at most 1 MiB, and publish writes a result onto it after Google has\n * applied the change — so a change is refused at staging well short of that. Ordinary changes are\n * a few KB; what comes near this is a payload carrying a whole list (a big Customer Match upload).\n */\nexport const GOOGLE_DRAFT_OP_MAX_BYTES = 512_000;\n/** How every too-large refusal starts — the CLI keys its `error.fix` off it. */\nexport const OP_TOO_LARGE_MESSAGE_START = \"This Google Ads change is too large to stage\";\n/** What to do about a change that is too large, for the CLI's `error.fix`. */\nexport const OP_TOO_LARGE_FIX =\n \"Nothing from this call was staged. Do not retry it as it is. Split the change that is too large into several smaller ones (for an audience upload, several smaller lists of members), stage those, and carry on with the rest of the job.\";\n\nexport const googleDraftStageBatchRequestSchema = z.object({\n chatId: z.string(),\n ops: z.array(googleDraftOpInputSchema).min(1).max(GOOGLE_DRAFT_BATCH_MAX),\n});\nexport type GoogleDraftStageBatchRequest = z.infer<typeof googleDraftStageBatchRequestSchema>;\n\n/**\n * All-or-nothing on validity: every valid op staged, or the whole batch rejected — no\n * partial drafts to reason about. `skipped` is separate from that contract: those ops\n * were valid but already hold the requested value on the live account, so they were\n * dropped rather than staged. `count` is what actually entered the draft.\n */\nexport const googleDraftStageBatchResponseSchema = z.object({\n staged: z.literal(true),\n mode: googleWriteModeSchema,\n count: z.number(),\n ops: z.array(\n z.object({\n ref: z.string(),\n kind: googleDraftOpKindSchema,\n dependsOn: z.array(z.string()),\n summary: z.string(),\n warnings: z.array(z.string()),\n }),\n ),\n skipped: z.array(z.object({ kind: googleDraftOpKindSchema, summary: z.string(), reason: z.string() })).optional(),\n});\nexport type GoogleDraftStageBatchResponse = z.infer<typeof googleDraftStageBatchResponseSchema>;\n\n// --- POST /api/ads/google/draft/amend-batch ---\n\n/**\n * Many generic amends in one request — each `{ ref, patch }` exactly as `/draft/amend` takes it,\n * checked in order against the draft as the amends before it left it, and written all or none.\n */\nexport const googleDraftAmendBatchRequestSchema = z.object({\n chatId: z.string(),\n amends: z\n .array(z.object({ ref: z.string().min(1), patch: z.record(z.string(), z.unknown()) }))\n .min(1)\n .max(GOOGLE_DRAFT_BATCH_MAX),\n});\nexport type GoogleDraftAmendBatchRequest = z.infer<typeof googleDraftAmendBatchRequestSchema>;\n\nexport const googleDraftAmendBatchResponseSchema = z.object({\n amended: z.literal(true),\n mode: googleWriteModeSchema,\n count: z.number(),\n ops: z.array(\n z.object({\n ref: z.string(),\n kind: googleDraftOpKindSchema,\n dependsOn: z.array(z.string()),\n summary: z.string(),\n warnings: z.array(z.string()),\n }),\n ),\n});\nexport type GoogleDraftAmendBatchResponse = z.infer<typeof googleDraftAmendBatchResponseSchema>;\n\n// --- POST /api/ads/google/draft (list) ---\n\nexport const googleDraftOpViewSchema = z.object({\n ref: z.string(),\n kind: googleDraftOpKindSchema,\n customerId: z.string(),\n target: z.string().optional(),\n dependsOn: z.array(z.string()),\n summary: z.string(),\n stagedAt: z.number(),\n result: googleDraftOpResultSchema.optional(),\n});\nexport type GoogleDraftOpView = z.infer<typeof googleDraftOpViewSchema>;\n\n// --- POST /api/ads/google/draft/show (response) ---\n\n/** The staged op's full payload as its \"receipt\" — verify a change looks right before publish. */\nexport const googleDraftShowResponseSchema = z.object({\n op: googleDraftOpViewSchema.extend({\n payload: z.unknown().optional(),\n warnings: z.array(z.string()).optional(),\n annotations: z.unknown().optional(),\n }),\n});\nexport type GoogleDraftShowResponse = z.infer<typeof googleDraftShowResponseSchema>;\n\nexport const googleDraftListRequestSchema = z.object({\n chatId: z.string(),\n /** Every op as `draft show` prints it, payload included — one call instead of a show per op. */\n full: z.boolean().optional(),\n});\nexport type GoogleDraftListRequest = z.infer<typeof googleDraftListRequestSchema>;\n\n/** A non-blocking completeness nudge for the staged draft (mirrors DraftAdvisory in completeness.ts). */\nexport const googleDraftAdvisorySchema = z.object({\n scope: z.enum([\"campaign\", \"adGroup\"]),\n message: z.string(),\n});\nexport type GoogleDraftAdvisory = z.infer<typeof googleDraftAdvisorySchema>;\n\n/** One member-collection rollup on a status node (e.g. \"Keywords in list\", \"Sitelinks\"). */\nexport const googleDraftStatusCollectionSchema = z.object({\n label: z.string(),\n added: z.number(),\n removed: z.number(),\n /** Members that stay in the set with a changed value — a device's bid adjustment. Optional: a\n * status tree built by an older backend carries no such count. */\n updated: z.number().optional(),\n existing: z.number(),\n});\nexport type GoogleDraftStatusCollection = z.infer<typeof googleDraftStatusCollectionSchema>;\n\n/** A node in the CLI status tree — the same campaign ▸ ad group ▸ ad grouping the dashboard renders. */\nexport interface GoogleDraftStatusNode {\n entity: string;\n name: string;\n /** The ad account this node lives in — one draft may span several. */\n customerId: string;\n operation?: GoogleDraftChangeOperationValue;\n existing: boolean;\n collections: GoogleDraftStatusCollection[];\n children: GoogleDraftStatusNode[];\n /** Non-blocking warnings on this node's heading op (e.g. \"target not found on the account\"). */\n warnings?: string[];\n}\nconst googleDraftChangeOperationSchema = z.enum([\"create\", \"update\", \"pause\", \"resume\", \"remove\", \"upload\"]);\ntype GoogleDraftChangeOperationValue = z.infer<typeof googleDraftChangeOperationSchema>;\nexport const googleDraftStatusNodeSchema: z.ZodType<GoogleDraftStatusNode> = z.lazy(() =>\n z.object({\n entity: z.string(),\n name: z.string(),\n customerId: z.string(),\n operation: googleDraftChangeOperationSchema.optional(),\n existing: z.boolean(),\n collections: z.array(googleDraftStatusCollectionSchema),\n children: z.array(googleDraftStatusNodeSchema),\n warnings: z.array(z.string()).optional(),\n }),\n);\n\nexport const googleDraftListResponseSchema = z.object({\n status: z.enum([\"active\", \"publishing\", \"applied\", \"discarded\", \"none\"]),\n mode: googleWriteModeSchema,\n count: z.number(),\n /** Payload, warnings and annotations only when the request asked for `full`. */\n ops: z.array(googleDraftShowResponseSchema.shape.op),\n /** Grouped campaign ▸ ad group ▸ ad tree for the readable CLI status view. */\n tree: z.array(googleDraftStatusNodeSchema).optional(),\n /** Non-blocking completeness advisories for the whole draft. */\n advisories: z.array(googleDraftAdvisorySchema).optional(),\n});\nexport type GoogleDraftListResponse = z.infer<typeof googleDraftListResponseSchema>;\n\n// --- POST /api/ads/google/draft/remove ---\n\nexport const googleDraftRemoveRequestSchema = z.object({\n chatId: z.string(),\n ref: z.string(),\n});\nexport type GoogleDraftRemoveRequest = z.infer<typeof googleDraftRemoveRequestSchema>;\n\nexport const googleDraftRemoveResponseSchema = z.object({\n /** The requested ref plus any dependents removed by cascade. */\n removed: z.array(z.string()),\n});\nexport type GoogleDraftRemoveResponse = z.infer<typeof googleDraftRemoveResponseSchema>;\n\n// --- POST /api/ads/google/draft/import ---\n\n/**\n * Move another open chat's staged ops into this chat's draft and out of that one, unchanged. `refs`\n * picks which (default: all); `exclude` leaves some behind. Ops tied by a `g_temp_*` dependency move\n * together.\n */\nexport const googleDraftImportRequestSchema = z.object({\n chatId: z.string(),\n fromChatId: z.string().min(1),\n refs: z.array(z.string().min(1)).min(1).optional(),\n exclude: z.array(z.string().min(1)).min(1).optional(),\n});\nexport type GoogleDraftImportRequest = z.infer<typeof googleDraftImportRequestSchema>;\n\nexport const googleDraftImportResponseSchema = z.object({\n /** Refs now staged on this chat, in the order the other chat staged them. */\n moved: z.array(z.string()),\n /** How many ops the other chat still has staged. */\n sourceRemaining: z.number(),\n});\nexport type GoogleDraftImportResponse = z.infer<typeof googleDraftImportResponseSchema>;\n\n// --- POST /api/ads/google/draft/clear ---\n\nexport const googleDraftClearRequestSchema = z.object({\n chatId: z.string(),\n});\nexport type GoogleDraftClearRequest = z.infer<typeof googleDraftClearRequestSchema>;\n\nexport const googleDraftClearResponseSchema = z.object({\n cleared: z.number(),\n});\nexport type GoogleDraftClearResponse = z.infer<typeof googleDraftClearResponseSchema>;\n\n// --- POST /api/ads/google/draft/validate ---\n\n/**\n * Ask Google about the whole staged draft without applying anything: every op is built, windowed\n * and sent exactly as publish would send it, with `validateOnly: true`. `full` adds each op's built\n * request and Google's raw answer for its window.\n */\nexport const googleDraftValidateRequestSchema = z.object({\n chatId: z.string(),\n full: z.boolean().optional(),\n});\nexport type GoogleDraftValidateRequest = z.infer<typeof googleDraftValidateRequestSchema>;\n\n/**\n * - `accepted` — Google accepted the op as publish would send it.\n * - `refused` — the op itself would fail at publish: Google refused it, or Baker would not send it.\n * - `blocked` — the op is fine on its own but would not apply, because something it depends on (or\n * shares an all-or-nothing request with) was refused.\n * - `unchecked` — this op cannot be asked about without applying something; publish is its check.\n * - `applied` — an earlier publish already applied it; it is not sent again.\n */\nexport const GOOGLE_DRAFT_VERDICTS = [\"accepted\", \"refused\", \"blocked\", \"unchecked\", \"applied\"] as const;\nexport const googleDraftVerdictSchema = z.enum(GOOGLE_DRAFT_VERDICTS);\nexport type GoogleDraftVerdict = z.infer<typeof googleDraftVerdictSchema>;\n\nexport const googleDraftOpVerdictSchema = z.object({\n ref: z.string(),\n summary: z.string(),\n verdict: googleDraftVerdictSchema,\n /** Why it was not accepted, in the words publish would record. */\n reason: z.string().optional(),\n /** `full` only. */\n kind: googleDraftOpKindSchema.optional(),\n customerId: z.string().optional(),\n request: z.unknown().optional(),\n response: z.unknown().optional(),\n});\nexport type GoogleDraftOpVerdict = z.infer<typeof googleDraftOpVerdictSchema>;\n\nexport const googleDraftValidateResponseSchema = z.object({\n status: z.enum([\"active\", \"publishing\", \"applied\", \"discarded\", \"none\"]),\n /** Requests sent to Google — one per publish window. */\n requests: z.number(),\n counts: z.record(googleDraftVerdictSchema, z.number()),\n /** Publish would send nothing: Baker holds the whole first publish when any op is refused before sending. */\n publishHeld: z.boolean(),\n /**\n * Present only when the changes still to send do not fit in what is left of Baker's rolling 24\n * hours of Google Ads changes, shared by every company. `operations` is what the publish takes (a\n * change can be several); `room` is the operations left right now, not a count of changes that go\n * live now: Publish sends each request whole or not at all, so fewer may, possibly none, and the\n * rest are sent again on their own. `fitsAt` (ISO) is when all of them fit, if nothing else is sent.\n */\n dailyLimit: z.object({ operations: z.number(), room: z.number(), fitsAt: z.string() }).optional(),\n ops: z.array(googleDraftOpVerdictSchema),\n});\nexport type GoogleDraftValidateResponse = z.infer<typeof googleDraftValidateResponseSchema>;\n\n// --- Structured validation errors (400) ---\n\nexport const googleFieldErrorSchema = z.object({\n path: z.string(),\n message: z.string(),\n});\nexport type GoogleFieldError = z.infer<typeof googleFieldErrorSchema>;\n\nexport const googleDraftErrorResponseSchema = z.object({\n code: z.string(),\n error: z.string(),\n fields: z.array(googleFieldErrorSchema).optional(),\n});\nexport type GoogleDraftErrorResponse = z.infer<typeof googleDraftErrorResponseSchema>;\n"],"mappings":"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AAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AACV;AAEO,IAAM,qBAA6C;AAAA,EACxD,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAA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,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,CAAC;AAC1xC,IAAM,YAA0B,oBAAI,YAAY,CAAC,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,OAAM,OAAM,OAAM,OAAM,KAAK,CAAC;AAC7/F,IAAM,aAA2B,oBAAI,WAAW,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,GAAE,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,IAAG,IAAG,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,IAAG,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,IAAG,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,IAAG,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,IAAG,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,IAAG,GAAE,IAAG,IAAG,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,IAAG,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,CAAC,CAAC;AACnosB,IAAM,YAA0B,oBAAI,YAAY,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,GAAE,KAAI,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,GAAE,KAAI,GAAE,IAAG,KAAI,KAAI,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,IAAG,IAAG,IAAG,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,IAAG,IAAG,KAAI,KAAI,IAAG,IAAG,KAAI,IAAG,IAAG,KAAI,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,IAAG,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,KAAI,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,KAAI,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,KAAI,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,KAAI,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,KAAI,KAAI,IAAG,GAAE,IAAG,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,GAAE,GAAE,KAAI,GAAE,KAAI,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,IAAG,KAAI,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,IAAG,GAAE,GAAE,GAAE,KAAI,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,GAAE,IAAG,GAAE,KAAI,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,KAAI,GAAE,GAAE,KAAI,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,GAAE,KAAI,GAAE,GAAE,IAAG,KAAI,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,KAAI,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,GAAE,KAAI,GAAE,KAAI,GAAE,KAAI,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,KAAI,KAAI,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,KAAI,KAAI,GAAE,KAAI,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,KAAI,KAAI,KAAI,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,GAAE,KAAI,GAAE,GAAE,GAAE,IAAG,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,KAAI,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,IAAG,KAAI,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,IAAG,KAAI,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,KAAI,KAAI,GAAE,GAAE,IAAG,IAAG,GAAE,KAAI,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,IAAG,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,GAAE,GAAE,IAAG,KAAI,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,GAAE,KAAI,KAAI,KAAI,KAAI,KAAI,GAAE,KAAI,KAAI,KAAI,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,IAAG,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,IAAG,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,KAAI,KAAI,KAAI,KAAI,GAAE,GAAE,IAAG,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,GAAE,KAAI,KAAI,KAAI,KAAI,GAAE,GAAE,IAAG,IAAG,KAAI,KAAI,KAAI,KAAI,GAAE,KAAI,KAAI,KAAI,KAAI,GAAE,IAAG,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,IAAG,KAAI,GAAE,KAAI,KAAI,KAAI,KAAI,GAAE,KAAI,KAAI,KAAI,GAAE,IAAG,GAAE,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,GAAE,KAAI,KAAI,KAAI,GAAE,KAAI,KAAI,GAAE,KAAI,GAAE,IAAG,GAAE,GAAE,KAAI,IAAG,GAAE,KAAI,KAAI,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,KAAI,KAAI,KAAI,GAAE,KAAI,KAAI,KAAI,KAAI,GAAE,IAAG,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,IAAG,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,GAAE,IAAG,KAAI,IAAG,GAAE,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,IAAG,GAAE,KAAI,KAAI,KAAI,KAAI,KAAI,IAAG,KAAI,KAAI,KAAI,IAAG,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,GAAE,IAAG,KAAI,GAAE,KAAI,KAAI,KAAI,IAAG,KAAI,IAAG,GAAE,KAAI,KAAI,KAAI,KAAI,KAAI,IAAG,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,GAAE,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,IAAG,KAAI,IAAG,KAAI,KAAI,KAAI,KAAI,GAAE,KAAI,KAAI,KAAI,IAAG,KAAI,IAAG,IAAG,KAAI,IAAG,GAAE,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,GAAE,KAAI,IAAG,IAAG,KAAI,KAAI,GAAE,IAAG,KAAI,GAAE,KAAI,KAAI,KAAI,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,GAAE,GAAE,IAAG,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,G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CjE,gBAAgB;AAAA,EAClB;AACF;;;AChkBO,IAAM,gCAAgC;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGA,IAAM,uCAA0D;AAAA,EAC9D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAC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","names":["z","z","z","z","extractHostname","suffixLookup","edge","z","z","z","z","refSchema","z","refSchema","existingRefSchema","z","refSchema","z","z","refSchema","z","z","z"]}